Files
janssen/VTMFDownloadFiles/vtmf_pipeline_v1.6.md
T
2026-06-15 16:10:47 +02:00

135 lines
5.5 KiB
Markdown
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.
# vtmf_pipeline_v1.6 — V-TMF workflow přes 3 úrovně (STUDY / COUNTRY / SITE)
**Verze:** 1.6 · **Datum:** 2026-06-15
## Co je nové proti v1.5
v1.5 stahovala jen **study-level** dokumenty jedné studie do ploché
`<Type>\<Subtype>` struktury. v1.6 řeší celou hierarchii VTMF
**STUDY → COUNTRY → SITE** a sdílený (M:N) charakter dokumentů.
**Klíčové poznatky z reportů:**
- Dokument je do studií/zemí/center jen **referencovaný** (M:N) — např.
Master Confidentiality Agreement v nemocnici je jeden dokument
referencovaný do všech studií i center té nemocnice. Reference ≠ kopie.
- Sloupce `Study`, `Study Country`, `Site` jsou **comma-separated seznamy**.
- Tři reporty = tři **úrovně** dokumentu. Aby byl TMF kompletní, musí se
stáhnout všechny tři.
- Country i site report filtrují **jen na zemi** (CZ), ne na studii →
empiricky vrací 100 % dokumentů navázaných na UCO3001, ořez na studii je
pojistka (no-op).
- Study report má 15 sloupců (+ `Document Date`), country/site 17
(+ `Created By`, `Study Country`, `Site`; bez `Document Date`).
## Konfigurace REPORTS
```python
TARGET_STUDY = "77242113UCO3001"
REPORTS = [
{"level":"study", "study":TARGET_STUDY, "country":None,
"url":".../0RP000000000182?study__v...IN=0ST000000137008"},
{"level":"country", "study":TARGET_STUDY, "country":"Czech Republic",
"url":".../0RP000000000319?study_country__v...IN=0SC00000017T056"},
{"level":"site", "study":TARGET_STUDY, "country":"Czech Republic",
"url":".../0RP000000000762?study_country__v...EQ=0SC00000017T056"},
]
```
Jiná studie / země = jen úprava ID v URL + TARGET_STUDY.
## Tok jednoho běhu
1. **Login** (persistentní profil, J&J SSO, 2FA na telefonu).
2. Pro **každý report** v `REPORTS`:
- export do Excelu (Data Only) → `WhatToDownload/<ts> <level> ...xlsx`,
- parse (zobecněný parser, sloupce podle názvu),
- ořez na `TARGET_STUDY` (řádek se bere jen pokud má studii v `studies`),
- **scoped sync** do Mongo,
- archiv reportu do `Zpracovano/`.
3. **Jeden průchod stažení** všech `deleted=False, downloaded≠True`
na disk i do SeaweedFS.
## Mongo schéma (kolekce documents)
```
_id: "VTMF-9108777|v2.0" # číslo dokumentu | verze
vtmf, version, url, level # level = study|country|site (pro cestu)
levels: ["site"] # všechny úrovně, kde se objevil
scopes: ["site|77242113UCO3001|Czech Republic", ...] # pro scoped mazání
name, status, type, subtype, classification, desc
process_name, external_system_name
created_by, last_modified_by, version_created_by
date # YYYY-MM-DD (Document/Approval/Version date)
studies: ["77242113UCO3001", ...] # comma-split sloupce reportu
countries: ["Czech Republic", ...]
sites: ["BH5-CZ10001", ...]
first_seen, last_seen, deleted, deleted_at
downloaded, downloaded_at, placeholder # žádné pole file (Dropbox zrušen)
sha256 # kontrolní součet (NE cesta)
seaweed_path, seaweed_url, seaweed_synced_at # jediné umístění souboru
history: [{ts, changes:{pole:{old,new}}}]
```
## Scoped sync (řeší mazací háček)
Mazání už **nekouká na celou kolekci** (to by sync country reportu označil
study/site dokumenty jako smazané). Každý report má
`scope = "<level>|<study>|<country>"`; dokument nese pole `scopes[]`.
- dokument v reportu → `$addToSet` scope,
- dokument, který z **tohoto** scope zmizel → scope se odebere; teprve když
nemá **žádný** scope → `deleted=True` + soubor ` [D]`.
## Evidence reportů — kolekce report_runs
```
level, study, country, url, scope, exported_at, file, row_count, doc_keys[]
```
Umožní ukázat „co přesně bylo v reportu" a slouží jako audit.
## Úložiště = JEN SeaweedFS (žádný Dropbox/disk)
Dokumenty se stahují z Vaultu přes **dočasný soubor Playwrightu** rovnou do
SeaweedFS Fileru — na disk/Dropbox se nic neukládá. Klíč = číslo dokumentu
+ verze:
```
/vtmf-documents/<vtmf>/<verze>.<přípona>
např. /vtmf-documents/VTMF-9108777/v2.0.pdf
```
Žádné SHA cesty, žádný content dedup, žádné hardlinky. SHA-256 se počítá a
ukládá do Mongo jen jako kontrolní součet. Která úroveň / země / centra =
pole `level` / `countries[]` / `sites[]` v Mongo.
Aktuální verzi čehokoli do Dropboxu (nebo kamkoli jinam) zařídí samostatný
export skript ze SeaweedFS — pipeline se tím nezdržuje.
## Migrace stávajících dat → migrate_to_v16.py
Stávající study-level data (v1.3v1.5) převede na schéma v1.6. Dvě fáze,
**default DRY-RUN**, ostře s `--apply`:
- `--phase mongo` — re-parse nejnovějšího archivu study reportu v1.6
parserem → obohatí ~1692 dokumentů o nová pole (level, scopes[],
studies[], countries=[], sites=[], classification, …). Nesahá na
download stav.
- `--phase seaweed` — překlíčuje SeaweedFS ze starých SHA cest na nové
`<vtmf>/<verze>` (~1637 souborů; zdroj bajtů = stávající soubor na disku,
fallback GET ze SHA cesty), opraví `seaweed_path/url` + `sha256`, smaže
staré SHA objekty a odebere pole `file` z Mongo. Fyzické soubory
v Dropboxu pak můžeš smazat ručně.
```powershell
# náhled
& "...\.venv\Scripts\python.exe" "...\migrate_to_v16.py"
# ostře
& "...\.venv\Scripts\python.exe" "...\migrate_to_v16.py" --apply
```
## Spuštění pipeline
```powershell
& "U:\PythonProject\Janssen\.venv\Scripts\python.exe" "U:\PythonProject\Janssen\VTMFDownloadFiles\vtmf_pipeline_v1.6.py"
```
Předchůdce: vtmf_pipeline_v1.5 (TRASH/).
```