This commit is contained in:
2026-06-10 11:59:19 +02:00
parent a41f97b86b
commit 7b2f69ad85
275 changed files with 16726 additions and 0 deletions
+147
View File
@@ -0,0 +1,147 @@
"""
================================================================================
run_all_v1.0.py — IWRS: kompletní pipeline Pacienti + Léky (obě studie)
Verze: 1.0
Datum: 2026-06-10
================================================================================
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.0.py # vše (download + import, obě studie)
python run_all_v1.0.py --download-only # jen stažení do Incoming/
python run_all_v1.0.py --import-only # jen import čekajících souborů
python run_all_v1.0.py --only-patients # jen pacientská část
python run_all_v1.0.py --only-drugs # jen léková část
python run_all_v1.0.py --study 42847922MDD3003 # jen jedna studie
Detaily v run_all_v1.0.md.
"""
import os
import sys
import argparse
import traceback
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
for _p in (os.path.join(BASE_DIR, "Drugs"), os.path.join(BASE_DIR, "Patients"), BASE_DIR):
if _p not in sys.path:
sys.path.insert(0, _p)
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()