Files
janssen/EmailsImport/janssenpc_file_send_v2.6.md
2026-06-12 15:29:57 +02:00

60 lines
3.2 KiB
Markdown

# janssenpc_file_send v2.6
Odesílací skript na JNJ počítači: přejmenuje soubory ve `##JNJPrenos`, zašifruje
(Fernet/AES-128) a odešle na `https://msgs.buzalka.cz/upload-file`, pak přesune
do `Trash`. Detekci nových souborů zajišťuje `janssenpc_file_watch.py` (v1.2).
Stahování ze serveru řeší samostatný `janssenpc_file_receive` (ručně) — sem nepatří.
## Spuštění
Spouští se automaticky přes `janssenpc_file_watch.py` (watchdog). Ručně:
```
C:\Users\vbuzalka\OneDrive - JNJ\##JNJPrenos\Python\python.exe "...\janssenpc_file_send.py"
```
## Co je nového v v2.6 — ošetření nedotaženého stahování z Chrome
Problém: Chrome stahuje report do dočasného souboru `*.crdownload` a teprve po
dokončení ho přejmenuje na finální jméno; u některých typů zapisuje rovnou do
finálního jména. Watchdog vystřelí hned na `on_created`, takže dřívější verze
začaly zpracovávat / odesílat i napůl stažený soubor (riziko: upload rozdělaného
`.crdownload`, nebo načtení neúplného CSV/XLSX).
### `is_ready(f)` — gate před zpracováním i odesláním
Soubor projde, jen když:
1. **nemá dočasnou příponu** (`.crdownload` / `.tmp` / `.part`),
2. **velikost je stabilní**`STABILITY_REQUIRED` (3) kontrol po sobě stejná a > 0,
poll po `STABILITY_INTERVAL` (1 s), max `STABILITY_TIMEOUT` (120 s),
3. **jde otevřít na zápis** (`r+b`) — zamčený soubor (Chrome ještě zapisuje) hodí
`PermissionError` → přeskočí se.
Nepřipravený soubor se v daném běhu jen přeskočí (zaloguje důvod) a zpracuje ho
příští běh / další událost watcheru.
Volá se na DVOU místech: na začátku `prejmenuj()` (ať pandas nečte neúplný soubor)
a znovu v odesílací fázi (pojistka před uploadem).
## Spolupráce s watcherem (v1.2)
- Watcher **ignoruje** dočasné přípony (nespouští send na `.crdownload`).
- Watcher **debouncuje** sérii událostí (vytvoření + přejmenování + zápis) do jednoho
spuštění (`DEBOUNCE_SECONDS = 5`).
- Vlastní „dotažení" řeší až `is_ready` v file_send — watcher jen omezuje zbytečná spuštění.
## Zděděno z v2.5 — podrobný logging uploadu
Funkce `upload()` loguje HTTP kód, finální URL, redirecty, hlavičky a tělo odpovědi;
detekuje stopy korporátního filtru (`_sm_nck`, cizí host, ne-JSON, HTML, neznámý Server).
`Server: nginx` je OČEKÁVANÉ (SWAG reverse proxy). Soubor se přesune do `Trash` jen
při ověřeném úspěchu (`HTTP 200` + `application/json` + `status`
`{OK, UPLOADED, SAVED, RECEIVED}`); jinak `PONECHÁNO`.
## Vazby
- Watcher: `janssenpc_file_watch_v1.2.py`.
- Server: `app.py` ≥ v2.3, endpoint `POST /upload-file` (vrací
`{"status":"uploaded","file":...,"dropbox_path":...}`).
- Protějšek pro download: `janssenpc_file_receive_v1.2`.
## Historie
- v2.6 (2026-06-12): is_ready gate (stabilní velikost + zámek + ignor .crdownload) proti nedotaženému stahování
- v2.5 (2026-06-12): podrobný logging uploadu + detekce filtru + Trash jen při ověřeném úspěchu (ověřeno: přenos OK, filtr nevinen)
- v2.4 (2026-06-05): Fernet šifrování uploadu, endpoint `/upload-file`
- v2.2 (2026-06-02): odesílání bez šifrování přes `/upload-dropbox`