5.4 KiB
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řívePatients/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)
- Login + výběr studie (
common/iwrs_portal.py) - Pacienti (
Patients/download_patients.py):- Subject Summary Report
- per subjekt: Subject Detail XLSX + notifikace PDF+JSON (stahují se jen
notifikace, jejichž
pkještě není v Mongoiwrs_notifications)
- 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_itemsse 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í)
ensure_indexes()(jednou)- Pacienti (
Patients/import_patients.py): summary → detaily → notifikace; per soubor, po úspěchu přesun do Processed/ - Léky (
Drugs/import_drugs.py): jedenimport_idper 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 + snapshotiwrs_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 řádkySite: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)