Files
janssen/IWRS/Trash/run_all_v1.0.md
2026-06-10 11:59:19 +02:00

5.4 KiB

run_all_v1.0.py — IWRS: kompletní pipeline Pacienti + Léky

Verze: 1.0 | Datum: 2026-06-10

Jeden vstupní skript na úrovni IWRS/, který stáhne z janssen.4gclinical.com a naimportuje do MongoDB (db studie) data pacientů i léků pro obě studie (77242113UCO3001, 42847922MDD3003). Nahrazuje dřívější Drugs/run_all.py a Patients/download_all.py + Patients/import_all.py (přesunuty do Trash/).

Tok souborů

IWRS/Incoming/            ← sem padá vše stažené (pacienti i léky, datumované názvy)
IWRS/Incoming/Processed/  ← sem se přesouvá po úspěšném importu
  • Při chybě importu soubor zůstává v Incoming/ a zpracuje se při příštím běhu.
  • Import jde vždy nejstarší soubor napřed (mtime) — chronologická správnost snapshotů.
  • Kolize jména v Processed/ → přepíše se (Mongo už data má, soubor je jen archiv).
  • Adresář IWRS/Incoming/ je v .gitignore (stejně jako dříve Patients/Incoming/).
  • Původní adresáře Drugs/xls_* zůstávají zmrazené na místě jako archiv — nový kód je nepoužívá.

Názvy souborů v Incoming/

Typ Vzor
Subject Summary YYYY-MM-DD {study} Subject Summary Report.xlsx
Subject Detail YYYY-MM-DD {study} {subject} Subject Detail.xlsx
Notifikace {datum}_{study}_{subject}_{label}.pdf + .json
Onsite Inventory YYYY-MM-DD {study} Onsite Inventory {site}.xlsx
IP Destruction YYYY-MM-DD {study} IP Destruction {basket}.xlsx
Shipments Report YYYY-MM-DD {study} Shipments Report.xlsx
Shipment Details YYYY-MM-DD {study} Shipment Details {shipment_id}.xlsx

Při kolizi (druhý běh ve stejný den) se před příponu přidá HHMM. Metadata (site, basket, study) se při importu čtou primárně z obsahu souboru; z názvu se bere jen shipment_id u Shipment Details.

Průběh

Fáze 1 — stahování (2 přihlášení, per studie jedna browser session)

  1. Login + výběr studie (common/iwrs_portal.py)
  2. Pacienti (Patients/download_patients.py):
    • Subject Summary Report
    • per subjekt: Subject Detail XLSX + notifikace PDF+JSON (stahují se jen notifikace, jejichž pk ještě není v Mongo iwrs_notifications)
  3. Léky (Drugs/download_drugs.py):
    • Onsite Inventory — všechna centra, vždy znovu
    • IP Destruction — přeskočí košíky už importované v iwrs_destruction (destrukce je immutable); dříve se přeskakovalo podle existence souboru
    • Shipments Report — vždy znovu
    • Shipment Details — jen CZ zásilky; přeskočí zásilky, jejichž položky jsou v iwrs_shipment_items se statusem RECEIVED (finální stav); dříve „soubor existuje a status RECEIVED“. CANCELLED zásilky se stahují při každém běhu (záměrně zachováno z původní verze).

Fáze 2 — import (po stažení obou studií)

  1. ensure_indexes() (jednou)
  2. Pacienti (Patients/import_patients.py): summary → detaily → notifikace; per soubor, po úspěchu přesun do Processed/
  3. Léky (Drugs/import_drugs.py): jeden import_id per studie a běh; parsuje všechny čekající soubory (nejstarší napřed, poslední vyhrává per _id), pak hromadný zápis:
    • iwrs_shipments, iwrs_shipment_items, iwrs_inventory — upsert + snapshot
    • iwrs_destruction — upsert bez snapshotu Po úspěšném zápisu se zparsované soubory přesunou do Processed/; soubor s chybou parsování zůstává v Incoming/. Prázdný inventory report (centrum bez zásob — jen meta řádky Site: atd., bez tabulky léků) se bere jako 0 položek a normálně se archivuje.

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

Prohlížeč běží s headless=False (viditelné okno) jako dosud. Moduly import_patients.py a import_drugs.py lze spustit i samostatně.

Mapa modulů

IWRS/
  run_all_v1.0.py            ← vstupní skript (CLI, orchestrace)
  common/
    iwrs_portal.py           ← BASE_URL, credentials, login(page, study)
    paths.py                 ← INCOMING/PROCESSED, unique_path, move_done, sorted_by_mtime
    mongo_writer.py          ← beze změny (konvertory, upserty, snapshoty, import log)
  Patients/
    download_patients.py     ← summary + delegace na download_subject_details.run()
    import_patients.py       ← logika z bývalého import_all.py, nové cesty
    download_subject_details.py, import_to_mongo.py,
    import_notifications_to_mongo.py, parse_notifications_to_mongo.py  ← beze změny
    Trash/download_all.py, Trash/import_all.py  ← nahrazeno
  Drugs/
    download_drugs.py        ← 4 typy reportů → Incoming/, skip-logika přes Mongo
    import_drugs.py          ← parsery z bývalého import_to_mongo.py, čte Incoming/
    Trash/run_all.py, Trash/import_to_mongo.py  ← nahrazeno

Jednorázová migrace (provedeno 2026-06-10)

  • Patients/Incoming/Zpracováno/ (1343 souborů) → IWRS/Incoming/Processed/
  • .gitignore: IWRS/Patients/Incoming/IWRS/Incoming/
  • Staré vstupní skripty → Trash/ (viz mapa výše)