# 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`