From 1f25bcbc142f5be88632f9e1fd1a176e353605ef Mon Sep 17 00:00:00 2001 From: "vladimir.buzalka" Date: Mon, 18 May 2026 09:21:37 +0200 Subject: [PATCH] z230 --- Medevio/12 Tower1/40 DownloadPrilohy.py | 25 ++- Medevio/12 Tower1/40z_RetrySmidova.py | 161 ++++++++++++++++++++ Medevio/60 ScansProcessing/corrections.json | 72 +++++++++ 3 files changed, 254 insertions(+), 4 deletions(-) create mode 100644 Medevio/12 Tower1/40z_RetrySmidova.py diff --git a/Medevio/12 Tower1/40 DownloadPrilohy.py b/Medevio/12 Tower1/40 DownloadPrilohy.py index cd3d539..14e5ebd 100644 --- a/Medevio/12 Tower1/40 DownloadPrilohy.py +++ b/Medevio/12 Tower1/40 DownloadPrilohy.py @@ -77,13 +77,31 @@ query ClinicRequestDetail_GetPatientRequest2($requestId: UUID!) { """ +RETRY_ATTEMPTS = 5 +RETRY_DELAY = 3 # sekund mezi pokusy + + def extract_filename_from_url(url: str) -> str: try: return url.split("/")[-1].split("?")[0] - except: + except Exception: return "unknown_filename" +def download_with_retry(url: str) -> bytes: + for attempt in range(1, RETRY_ATTEMPTS + 1): + try: + r = requests.get(url, timeout=60) + if r.status_code == 200: + return r.content + safe_print(f" ⚠️ HTTP {r.status_code}, pokus {attempt}/{RETRY_ATTEMPTS}") + except Exception as e: + safe_print(f" ⚠️ Chyba stahování (pokus {attempt}/{RETRY_ATTEMPTS}): {e}") + if attempt < RETRY_ATTEMPTS: + time.sleep(RETRY_DELAY) + raise RuntimeError(f"Stahování selhalo po {RETRY_ATTEMPTS} pokusech") + + def read_token(p: Path) -> str: tok = p.read_text(encoding="utf-8").strip() return tok.split(" ", 1)[1] if tok.startswith("Bearer ") else tok @@ -142,9 +160,8 @@ def main(): url = m.get("downloadUrl") if url: - att_r = requests.get(url, timeout=30) - if att_r.status_code == 200: - content = att_r.content + content = download_with_retry(url) + if content: filename = extract_filename_from_url(url) cur.execute(""" diff --git a/Medevio/12 Tower1/40z_RetrySmidova.py b/Medevio/12 Tower1/40z_RetrySmidova.py new file mode 100644 index 0000000..674832b --- /dev/null +++ b/Medevio/12 Tower1/40z_RetrySmidova.py @@ -0,0 +1,161 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Jednorázový skript: znovu stáhne přílohy pro 1c935d36-c9df-46a1-9ef2-b7f327f376c7 (Šmídová). +Přeskočí přílohy, které jsou již v medevio_downloads. Po úspěchu označí požadavek jako zpracovaný. +""" + +import requests +import pymysql +import time +from pathlib import Path + +TARGET_REQUEST_ID = "1c935d36-c9df-46a1-9ef2-b7f327f376c7" +RETRY_ATTEMPTS = 5 +RETRY_DELAY = 3 # sekund mezi pokusy + +TOKEN_PATH = Path(__file__).resolve().parent.parent / "token.txt" + +DB_CONFIG = { + "host": "192.168.1.76", + "port": 3306, + "user": "root", + "password": "Vlado9674+", + "database": "medevio", + "charset": "utf8mb4", + "cursorclass": pymysql.cursors.DictCursor, +} + +GRAPHQL_QUERY = r""" +query ClinicRequestDetail_GetPatientRequest2($requestId: UUID!) { + patientRequestMedicalRecords: listMedicalRecordsForPatientRequest( + attachmentTypes: [ECRF_FILL_ATTACHMENT, MESSAGE_ATTACHMENT, PATIENT_REQUEST_ATTACHMENT] + patientRequestId: $requestId + pageInfo: {first: 100, offset: 0} + ) { + attachmentType + id + medicalRecord { + contentType + description + downloadUrl + id + url + visibleToPatient + } + } +} +""" + + +def extract_filename_from_url(url: str) -> str: + try: + return url.split("/")[-1].split("?")[0] + except Exception: + return "unknown_filename" + + +def read_token(p: Path) -> str: + tok = p.read_text(encoding="utf-8").strip() + return tok.split(" ", 1)[1] if tok.startswith("Bearer ") else tok + + +def download_with_retry(url: str, attempts: int, delay: int) -> bytes: + for attempt in range(1, attempts + 1): + try: + r = requests.get(url, timeout=60) + if r.status_code == 200: + return r.content + print(f" ⚠️ HTTP {r.status_code}, pokus {attempt}/{attempts}") + except Exception as e: + print(f" ⚠️ Chyba stahování (pokus {attempt}/{attempts}): {e}") + if attempt < attempts: + time.sleep(delay) + raise RuntimeError(f"Stahování selhalo po {attempts} pokusech: {url}") + + +def main(): + token = read_token(TOKEN_PATH) + headers = {"Authorization": f"Bearer {token}", "Content-Type": "application/json"} + + conn = pymysql.connect(**DB_CONFIG) + + # Načíst již stažené attachment_id pro tento požadavek + with conn.cursor() as cur: + cur.execute("SELECT attachment_id FROM medevio_downloads WHERE request_id = %s", (TARGET_REQUEST_ID,)) + existing_ids = {row["attachment_id"] for row in cur.fetchall()} + + print(f"🔍 Zpracovávám požadavek {TARGET_REQUEST_ID}") + print(f" Již staženo příloh: {len(existing_ids)}") + + # GraphQL dotaz + payload = { + "operationName": "ClinicRequestDetail_GetPatientRequest2", + "query": GRAPHQL_QUERY, + "variables": {"requestId": TARGET_REQUEST_ID}, + } + r = requests.post("https://api.medevio.cz/graphql", json=payload, headers=headers, timeout=30) + attachments = r.json().get("data", {}).get("patientRequestMedicalRecords", []) + print(f" Nalezeno příloh celkem: {len(attachments)}") + + # Načíst createdAt pro INSERT + with conn.cursor() as cur: + cur.execute("SELECT createdAt FROM pozadavky WHERE id = %s", (TARGET_REQUEST_ID,)) + row = cur.fetchone() + created_date = row["createdAt"] if row else None + + saved = 0 + skipped = 0 + errors = 0 + + with conn.cursor() as cur: + for a in attachments: + m = a.get("medicalRecord") or {} + att_id = a.get("id") + + if att_id in existing_ids: + print(f" ⏭️ Přeskočeno (již existuje): {att_id}") + skipped += 1 + continue + + url = m.get("downloadUrl") + if not url: + print(f" ⚠️ Příloha {att_id} nemá downloadUrl, přeskakuji") + skipped += 1 + continue + + try: + content = download_with_retry(url, RETRY_ATTEMPTS, RETRY_DELAY) + filename = extract_filename_from_url(url) + cur.execute(""" + INSERT INTO medevio_downloads ( + request_id, attachment_id, attachment_type, + filename, content_type, file_size, + created_at, file_content + ) VALUES (%s,%s,%s,%s,%s,%s,%s,%s) + """, (TARGET_REQUEST_ID, att_id, a.get("attachmentType"), filename, + m.get("contentType"), len(content), created_date, content)) + existing_ids.add(att_id) + print(f" 💾 Uloženo: {filename} ({len(content) / 1024:.1f} kB)") + saved += 1 + time.sleep(0.5) + except Exception as e: + print(f" ❌ Chyba: {e}") + errors += 1 + + conn.commit() + + if errors == 0: + with conn.cursor() as cur: + cur.execute("UPDATE pozadavky SET attachmentsProcessed = NOW() WHERE id = %s", (TARGET_REQUEST_ID,)) + conn.commit() + print(f"\n✅ Hotovo. Uloženo: {saved}, přeskočeno: {skipped}. Požadavek označen jako zpracovaný.") + else: + print(f"\n⚠️ Hotovo s chybami. Uloženo: {saved}, přeskočeno: {skipped}, chyby: {errors}.") + print(" Požadavek NEBYL označen jako zpracovaný (opakujte po kontrole).") + + conn.close() + + +if __name__ == "__main__": + main() diff --git a/Medevio/60 ScansProcessing/corrections.json b/Medevio/60 ScansProcessing/corrections.json index f118fd0..3c73144 100644 --- a/Medevio/60 ScansProcessing/corrections.json +++ b/Medevio/60 ScansProcessing/corrections.json @@ -1258,5 +1258,77 @@ { "original": "465525112 2026-05-04 Hoserová, Marie [LZ kardiologie] [Progrese náh. dušnosti, CHSS, FiS perm., trikuspidální regurgitace 3/4, PASP 40-45mmHg, EF LK 55%, DM2, AH, intolerance Jardiance+Forxiga].pdf", "corrected": "465525112 2026-05-04 Hoserová, Marie [LZ kardiologie] [Progrese náh. dušnosti, CHSS, FiS perm., trikuspidální regurgitace 34, PASP 40-45mmHg, EF LK 55%, DM2, AH, intolerance Jardiance+Forxiga].pdf" + }, + { + "original": "0057130183 2025-08-25 Kreibichová, Jiřina [PZ rehabilitace] [21JUL2025–25AUG2025 DMO spastická kvadruparéza, lázeňská RHB].pdf", + "corrected": "0057130183 2025-08-25 Kreibichová, Jiřina [PZ lázně] [21JUL2025–25AUG2025 DMO spastická kvadruparéza, lázeňská RHB].pdf" + }, + { + "original": "456009040 2026-05-15 Vaňková, Zdeňka [LZ endokrinologie] [ANCA vaskulitida, hepatitida C remise, sono ŠŽ pseudocysta benigní, TSH 4.073, fT4 15.81].pdf", + "corrected": "456009040 2026-05-15 Vaňková, Zdeňka [LZ endokrinologie] [ANCA vaskulitida, hepatitida C remise, sono ŠŽ pseudocysta benigní, TSH 4.073, fT4 15.81, bez léčby ŠŽ].pdf" + }, + { + "original": "480123061 2026-05-14 Stoklasa, Jan [LZ oční] [Hypermetropie, presbyopie, PVD OL, incip. VPMD suchá f. OU, OCT makul+papil ZN].pdf", + "corrected": "480123061 2026-05-14 Stoklasa, Jan [LZ oční] [Hypermetropie, presbyopie, PVD OL, incip. VPMD suchá f. OU, OCT makul+papil ZN, ko +1r].pdf" + }, + { + "original": "490204154 2026-05-13 Slezáček, Ladislav [RTG plic] [Pectus excavatum vývojová/posttraumatická, kalcifikace žeber. chrupavek].pdf", + "corrected": "490204154 2026-05-13 Slezáček, Ladislav [RTG plic] [Pectus excavatum vývojováposttraumatická, kalcifikace žeber. chrupavek, plíce a srdce OK].pdf" + }, + { + "original": "7153180551 2026-03-06 Šamšová, Irena [LZ endokrinologie] [Hypotyreóza CHAT, klinicky euthyr., TSH 4.420, fT4 16.73, Euthyrox 137ug].pdf", + "corrected": "7153180551 2026-03-06 Šamšová, Irena [LZ endokrinologie] [Hypotyreóza CHAT, klinicky euthyr., TSH 4.420, fT4 16.73, Euthyrox 137ug, ko +6m].pdf" + }, + { + "original": "7252010898 2024-08-28 Ferková, Eva [LZ endokrinologie] [Difusní oboustranná eufunkční struma, CHAT, poz. ANTI TG+TPO, uzel bez růst. progrese, suprese mírně nadbytečná, Euthyrox 50ug 1/2 tbl, ko 3/4r].pdf", + "corrected": "7252010898 2024-08-28 Ferková, Eva [LZ endokrinologie] [Difusní oboustranná eufunkční struma, CHAT, poz. ANTI TG+TPO, uzel bez růst. progrese, suprese mírně nadbytečná, Euthyrox 50ug 12 tbl, ko 34r].pdf" + }, + { + "original": "7404134804 Vinduška, Milan split_009.pdf", + "corrected": "7404134804 2026-05-15 Vinduška, Milan [EKG] [bez hodnocení].pdf" + }, + { + "original": "7658212606 2024-11-25 Strnadová, Jitka [Laboratoř] [sideropenická anémie, Hb 123, MCV 80.4, Fe 5.4, ferritin 8.7, sat.transferinu 0.06, RF IgA 37.0 poz., ANA 1:80 poz., IgE 40.9].pdf", + "corrected": "7658212606 2024-11-25 Strnadová, Jitka [Laboratoř] [sideropenická anémie, Hb 123, MCV 80.4, Fe 5.4, ferritin 8.7, sat.transferinu 0.06, RF IgA 37.0 poz., ANA 180 poz., IgE 40.9].pdf" + }, + { + "original": "7658212606 Strnadová, Jitka split_016.pdf", + "corrected": "7658212606 2026-05-15 Strnadová, Jitka [EKG] [bez hodnocení].pdf" + }, + { + "original": "8001030422 2026-05-15 Kalous, Petr [deník TK] [8.5–14.5.2026, ráno 119–143/76–92, večer 111–130/70–86].pdf", + "corrected": "8001030422 2026-05-15 Kalous, Petr [domácí měření TK] [8.5–14.5.2026, ráno 119–14376–92, večer 111–13070–86].pdf" + }, + { + "original": "9154040434 Martínková, Tereza split_005.pdf", + "corrected": "9154040434 2026-05-15 Martínková, Tereza [EKG] [bez hodnocení].pdf" + }, + { + "original": "9505784871 Baasansuren, Jambaldorj [průkaz pojištěnce VZP] [platnost do 28-02-2027].pdf", + "corrected": "9505784871 2026-05-15 Baasansuren, Jambaldorj [průkaz pojištěnce VZP] [platnost do 28-02-2027].pdf" + }, + { + "original": "9505784871 Baasansuren, Jambaldorj split_002.pdf", + "corrected": "9505784871 2026-05-15 Baasansuren, Jambaldorj [EKG] [bez hodnocení].pdf" + }, + { + "original": "505228025 2026-05-14 Titlbachová, Božena [PZ gynekologie] [14MAY2026–14MAY2026 metrorrhagia in postmenopausam, polypus endometrii, uterus myomatosus].pdf", + "corrected": "505228025 2026-05-14 Titlbachová, Božena [PZ gynekologie] [14MAY2026–14MAY2026 hysteroskopie 14MAY2026, metrorrhagia in postmenopausam, polypus endometrii, uterus myomatosus].pdf" + }, + { + "original": "7751120333 2026-05-06 Šmídová, Šárka [Laboratoř] [dg. D219 - névus intradermální, kůže trup, excize 6x5x6mm].pdf", + "corrected": "7751120333 2026-05-06 Šmídová, Šárka [histologie] [dg. D219 - névus intradermální, kůže trup, excize 6x5x6mm].pdf" + }, + { + "original": "7751120333 2026-05-15 Šmídová, Šárka [LZ kardiologie] [AH léčená, TK na dolní hranici normy, EF 57%, porucha relaxace, Tezefort 80/5mg].pdf", + "corrected": "7751120333 2026-05-15 Šmídová, Šárka [LZ kardiologie] [AH léčená, TK na dolní hranici normy, EF 57%, porucha relaxace, Tezefort 805mg].pdf" + }, + { + "original": "430730066 2026-04-27 Štěpán, Jan [LZ kardiologie] [lehká až středně význ. ao regurgitace, dilatace bulbu aorty, st.p. iCMP, AH, prediabetes, HLP].pdf", + "corrected": "430730066 2026-04-27 Štěpán, Jan [LZ kardiologie] [lehká až středně význ. ao regurgitace, dilatace bulbu aorty, st.p. iCMP, AH, prediabetes, HLP, ko +12m].pdf" + }, + { + "original": "430730066 2026-01-31 Štěpán, Jan [domácí měření TK] [leden 2026, Omron M6, 123–148/73–86, poledne 125–154/71–90, večer 126–171/73–101].pdf", + "corrected": "430730066 2026-04-30 2026-01-31 Štěpán, Jan [domácí měření TK] [JAN-APR2026, Omron M6, 123–14873–86, poledne 125–15471–90, večer 126–17173–101].pdf" } ] \ No newline at end of file