152 lines
5.2 KiB
Python
152 lines
5.2 KiB
Python
"""
|
||
================================================================================
|
||
run_all_v1.1.py — IWRS: kompletní pipeline Pacienti + Léky (obě studie)
|
||
Verze: 1.1
|
||
Datum: 2026-06-10
|
||
================================================================================
|
||
|
||
v1.1: všechny moduly pipeline přesunuty na úroveň IWRS/ — adresáře
|
||
Patients/ a Drugs/ už pipeline nepotřebuje (zbývají v nich jen
|
||
reportovací skripty, archivy a Trash)
|
||
v1.0: první verze sjednocené pipeline
|
||
|
||
Stáhne z janssen.4gclinical.com a naimportuje do MongoDB (db `studie`):
|
||
|
||
Pacienti: Subject Summary, Subject Details, notifikace (PDF+JSON)
|
||
Léky: Onsite Inventory, IP Destruction, Shipments Report, Shipment Details
|
||
|
||
Tok souborů: vše se stahuje do IWRS/Incoming/, po úspěšném importu se přesouvá
|
||
do IWRS/Incoming/Processed/. Při chybě soubor zůstává v Incoming/ a zpracuje
|
||
se při příštím běhu.
|
||
|
||
Přihlášení: 2× (jednou per studie) — studie se vybírá až po přihlášení, takže
|
||
jedna browser session stáhne pacienty i léky pro jednu studii.
|
||
|
||
Použití:
|
||
python run_all_v1.1.py # vše (download + import, obě studie)
|
||
python run_all_v1.1.py --download-only # jen stažení do Incoming/
|
||
python run_all_v1.1.py --import-only # jen import čekajících souborů
|
||
python run_all_v1.1.py --only-patients # jen pacientská část
|
||
python run_all_v1.1.py --only-drugs # jen léková část
|
||
python run_all_v1.1.py --study 42847922MDD3003 # jen jedna studie
|
||
|
||
Detaily v run_all_v1.1.md.
|
||
"""
|
||
|
||
import os
|
||
import sys
|
||
import argparse
|
||
import traceback
|
||
|
||
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
||
if BASE_DIR not in sys.path:
|
||
sys.path.insert(0, BASE_DIR)
|
||
|
||
from playwright.sync_api import sync_playwright
|
||
|
||
from common.iwrs_portal import login
|
||
from common.paths import STUDIES, INCOMING_DIR, PROCESSED_DIR, ensure_dirs
|
||
from common.mongo_writer import ensure_indexes
|
||
|
||
import download_patients
|
||
import import_patients
|
||
import download_drugs
|
||
import import_drugs
|
||
|
||
|
||
def download_phase(studies, do_patients, do_drugs):
|
||
with sync_playwright() as p:
|
||
for study in studies:
|
||
print(f"\n{'='*60}")
|
||
print(f"[{study}] STAHOVÁNÍ")
|
||
print(f"{'='*60}")
|
||
|
||
browser = p.chromium.launch(headless=False)
|
||
context = browser.new_context(accept_downloads=True)
|
||
page = context.new_page()
|
||
|
||
try:
|
||
print(" Přihlášení...")
|
||
login(page, study)
|
||
|
||
if do_patients:
|
||
print(f"\n ── PACIENTI [{study}] ──")
|
||
try:
|
||
download_patients.run(page, study)
|
||
except Exception as e:
|
||
print(f" CHYBA při stahování pacientů: {e}")
|
||
traceback.print_exc()
|
||
|
||
if do_drugs:
|
||
print(f"\n ── LÉKY [{study}] ──")
|
||
try:
|
||
download_drugs.run(page, study)
|
||
except Exception as e:
|
||
print(f" CHYBA při stahování léků: {e}")
|
||
traceback.print_exc()
|
||
|
||
except Exception as e:
|
||
print(f" CHYBA (login/session): {e}")
|
||
traceback.print_exc()
|
||
finally:
|
||
browser.close()
|
||
|
||
|
||
def import_phase(studies, do_patients, do_drugs):
|
||
print(f"\n{'='*60}")
|
||
print("IMPORT DO MongoDB")
|
||
print(f"{'='*60}")
|
||
ensure_indexes()
|
||
|
||
if do_patients:
|
||
try:
|
||
import_patients.run(studies)
|
||
except Exception as e:
|
||
print(f" CHYBA při importu pacientů: {e}")
|
||
traceback.print_exc()
|
||
|
||
if do_drugs:
|
||
try:
|
||
import_drugs.run(studies)
|
||
except Exception as e:
|
||
print(f" CHYBA při importu léků: {e}")
|
||
traceback.print_exc()
|
||
|
||
|
||
def main():
|
||
ap = argparse.ArgumentParser(
|
||
description="IWRS pipeline: stažení + import pacientů a léků (obě studie)")
|
||
ap.add_argument("--download-only", action="store_true", help="jen stažení do Incoming/")
|
||
ap.add_argument("--import-only", action="store_true", help="jen import čekajících souborů")
|
||
ap.add_argument("--only-patients", action="store_true", help="jen pacientská část")
|
||
ap.add_argument("--only-drugs", action="store_true", help="jen léková část")
|
||
ap.add_argument("--study", choices=STUDIES, help="jen jedna studie")
|
||
args = ap.parse_args()
|
||
|
||
if args.download_only and args.import_only:
|
||
ap.error("--download-only a --import-only nelze kombinovat")
|
||
if args.only_patients and args.only_drugs:
|
||
ap.error("--only-patients a --only-drugs nelze kombinovat")
|
||
|
||
studies = [args.study] if args.study else STUDIES
|
||
do_patients = not args.only_drugs
|
||
do_drugs = not args.only_patients
|
||
|
||
ensure_dirs()
|
||
|
||
if not args.import_only:
|
||
download_phase(studies, do_patients, do_drugs)
|
||
|
||
if not args.download_only:
|
||
import_phase(studies, do_patients, do_drugs)
|
||
|
||
print(f"\n{'='*60}")
|
||
print("Vše hotovo.")
|
||
print(f" Incoming: {INCOMING_DIR}")
|
||
print(f" Processed: {PROCESSED_DIR}")
|
||
print(f"{'='*60}")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|