z230
This commit is contained in:
@@ -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()
|
||||
Reference in New Issue
Block a user