Files
janssen/IWRS/run_all_v1.1.py
T
2026-06-10 11:59:19 +02:00

152 lines
5.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
================================================================================
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()