127 lines
5.6 KiB
Python
127 lines
5.6 KiB
Python
# -*- 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, "<CH2PR07MB7190A5538ACDC1D49F8B430780E52@CH2PR07MB7190.namprd07.prod.outlook.com>",
|
|
"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, "<SA1PR07MB952874B8654156369CDE44448CE52@SA1PR07MB9528.namprd07.prod.outlook.com>",
|
|
"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, "<PH0PR07MB97879A9C9BF9C00D38D4798A9FE52@PH0PR07MB9787.namprd07.prod.outlook.com>",
|
|
"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, "<CH2PR07MB719008DB0B3CAFD764AE2E8280E52@CH2PR07MB7190.namprd07.prod.outlook.com>",
|
|
"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, "<CH2PR07MB719008DB0B3CAFD764AE2E8280E52@CH2PR07MB7190.namprd07.prod.outlook.com>",
|
|
"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()
|