# -*- coding: utf-8 -*- # ============================================================================= # Nazev: store_cda_seaweed_v1.0.py # Verze: 1.0 # Datum: 2026-06-17 # Popis: Ulozi podepsane CDA (PDF) z e-mailu asistentek do Mongo # feasibility.investigators do pole cda.* a posune lekare na # KROK "5 - CDA podepsano". PDF se stahuji primo ze SeaweedFS # (seaweed_url z attachments v emaily."vbuzalka@its.jnj.com"), # overuje se SHA256 proti metadatum z Mongo. # Pouziti: python store_cda_seaweed_v1.0.py (dry-run / nahled) # python store_cda_seaweed_v1.0.py --apply (zapise do Mongo) # Pozn.: MAPPING nize = explicitni parovani investigator -> CDA priloha. # Jen stdlib + pymongo. SeaweedFS host 192.168.1.50:8888. # ============================================================================= import sys import base64 import hashlib import urllib.request from datetime import datetime, timezone from pymongo import MongoClient from bson import ObjectId MONGO_URI = "mongodb://192.168.1.76:27017" DBN, COL = "feasibility", "investigators" # (investigator _id, seaweed_url, filename, sha256, size, source_msg_id, label) MAPPING = [ ("6a198b661218c31ab0f5ba57", "http://192.168.1.50:8888/mail-attachments/1a/86/1a86e987b9d3da57c1d863b47734133f2e2d7eae3f5cfe91112c475eb86d86e9", "CZ_CDA PI_MUDr. Filip Zavada_fully signed_16Jun2026.pdf", "1a86e987b9d3da57c1d863b47734133f2e2d7eae3f5cfe91112c475eb86d86e9", 479026, "", "Zavada Filip"), ("6a19832b5fc2213518257957", "http://192.168.1.50:8888/mail-attachments/64/b0/64b06d48bfe3c49095e326988f14c04fd5849728b227647f6653b2e3c3095538", "SK_CDA PI_Bruncak_FNsP BBystrica_fully signed 16Jun2026.pdf", "64b06d48bfe3c49095e326988f14c04fd5849728b227647f6653b2e3c3095538", 498069, "", "Bruncak Michal"), ("6a19832b5fc2213518257961", "http://192.168.1.50:8888/mail-attachments/c2/72/c272ca62bd27ca10aed35cb54054d880f4f0e2f59940ed3b067b17d51a9ac041", "CZ_CDA Institution_Asclepiades s.r.o._MUDr. Machytka_16Jun2026.pdf", "c272ca62bd27ca10aed35cb54054d880f4f0e2f59940ed3b067b17d51a9ac041", 460977, "", "Machytka Evzen (Asclepiades)"), ("6a19832b5fc2213518257967", "http://192.168.1.50:8888/mail-attachments/99/37/99372c399be3b001428ef4b36d43e250dedced5955de5d1f3a2d63a9f0c1728b", "CZ_CDA institution_PreventaMed sro_fully signed_16Jun2026.pdf", "99372c399be3b001428ef4b36d43e250dedced5955de5d1f3a2d63a9f0c1728b", 457745, "", "Pumprla Jiri (PreventaMed)"), ("6a1c4275aa46d8b608065ce9", "http://192.168.1.50:8888/mail-attachments/94/95/9495c742407873efd8dd9713e1dc962cb08e55e0d3690e4a79a90132ee358dee", "SK_CDA Institution_PAV-MED s r.o_fully signed_15Jun2026.pdf", "9495c742407873efd8dd9713e1dc962cb08e55e0d3690e4a79a90132ee358dee", 460246, "", "Zapotocka Julia (PAV-MED)"), ] def fetch(url): with urllib.request.urlopen(url, timeout=30) as r: return r.read() def main(): apply = "--apply" in sys.argv cli = MongoClient(MONGO_URI) col = cli[DBN][COL] now = datetime.now(timezone.utc).isoformat() ok = 0 for _id, url, fname, sha, size, src, label in MAPPING: oid = ObjectId(_id) doc = col.find_one({"_id": oid}, {"STATUS": 1, "KROK": 1, "cda.stav": 1}) if not doc: print(f" !! {label}: investigator _id={_id} NENALEZEN"); continue try: raw = fetch(url) except Exception as e: print(f" !! {label}: stazeni selhalo: {e}"); continue got = hashlib.sha256(raw).hexdigest() sha_ok = (got == sha) size_ok = (len(raw) == size) head_ok = raw[:5] == b"%PDF-" print(f" [{label}]") print(f" soubor : {fname}") print(f" stazeno : {len(raw)} B (ocek. {size}) {'OK' if size_ok else 'MISMATCH'}") print(f" sha256 : {'OK' if sha_ok else 'MISMATCH! ' + got}") print(f" PDF hdr : {'OK' if head_ok else 'NENI PDF'}") print(f" KROK : {doc.get('KROK')} -> 5 - CDA podepsano") if not (sha_ok and size_ok and head_ok): print(" >> PRESKAKUJI (kontrola selhala)"); continue if not apply: ok += 1; continue b64 = base64.b64encode(raw).decode("ascii") old_status = doc.get("STATUS", "") or "" new_line = (f"17JUN2026: podepsane CDA ULOZENO do Mongo (cda.data) — {fname} " f"(z e-mailu asistentky). KROK 5, pripraveno na SIPIQ.") col.update_one({"_id": oid}, {"$set": { "KROK": "5 - CDA podepsano", "STATUS": new_line + "\n" + old_status, "cda.stav": "podepsano", "cda.soubor": fname, "cda.zdroj": "e-mail asistentky (SeaweedFS)", "cda.data_base64": b64, "cda.data_sha256": sha, "cda.data_filename": fname, "cda.data_mime": "application/pdf", "cda.data_size": len(raw), "cda.data_stored_at": now, "cda.data_source_msg": src, }}) ok += 1 print(" >> ULOZENO + KROK 5") print(f"\n{'ZAPSANO' if apply else 'DRY-RUN OK'}: {ok}/{len(MAPPING)}") if not apply: print(">>> Pro zapis spust s --apply") if __name__ == "__main__": main()