# -*- coding: utf-8 -*- # ============================================================================= # Nazev: report_77242113UCO2001_v1.1.py # Verze: 1.1 # Datum: 2026-06-09 # Popis: Generator Excel reportu z Mongo feasibility.investigators. # v1.1 - pridan sloupec KROK (krok feasibility workflow) HNED PRED # STATUS + barevne odliseni dle KROK. KROK plni skript # classify_krok_v1.0.py (odvozeni ze STATUS). # Projekt: 77242113UCO2001 (DAWN / spravny kod 77242113UCO3002) # Vystup: u:\Dropbox\!!!Days\Downloads Z230\ (verzovany nazev s timestampem) # ============================================================================= import os from datetime import datetime from pymongo import MongoClient import openpyxl from openpyxl.styles import Font, PatternFill, Alignment, Border, Side from openpyxl.utils import get_column_letter # --- Připojení k MongoDB --- MONGO_URI = os.environ.get("MONGO_URI", "mongodb://192.168.1.76:27017") client = MongoClient(MONGO_URI) db = client["feasibility"] col = db["investigators"] # --- Načtení dat --- docs = list(col.find({})) print(f"Načteno {len(docs)} záznamů.") # --- Cílová složka --- OUTPUT_DIR = r"u:\Dropbox\!!!Days\Downloads Z230" os.makedirs(OUTPUT_DIR, exist_ok=True) datum = datetime.now().strftime("%Y%m%d_%H%M") filename = f"77242113UCO2001_investigators_{datum}.xlsx" filepath = os.path.join(OUTPUT_DIR, filename) # --- Definice sloupců --- # Pořadí: jméno, email, KROK, STATUS, kriticka_poznamka, pak ostatní # KROK je ZÁMĚRNĚ hned PŘED STATUS. FIXED_COLS = [ ("prijmeni", "Příjmení"), ("jmeno", "Jméno"), ("email", "Email"), ("KROK", "KROK"), ("STATUS", "STATUS"), ("kriticka_poznamka", "Kritická poznámka"), ("zeme", "Země"), ("pracoviste", "Pracoviště"), ("internet_summary","Internet summary"), ] # Klíče, které přeskočíme (složité nested objekty) SKIP_KEYS = {"_id", "excel", "sites_illuminator", "maf", "zdroje", "studie", "Viper_Performance", "Viper_Contacts"} # Ostatní skalární pole fixed_keys = {c[0] for c in FIXED_COLS} extra_keys = set() for doc in docs: for k in doc.keys(): if k not in fixed_keys and k not in SKIP_KEYS: extra_keys.add(k) extra_keys = sorted(extra_keys) ALL_COLS = FIXED_COLS + [(k, k) for k in extra_keys] # --- Barvy podle KROK --- def krok_color(krok): if not krok: return None k = krok.strip() if k.startswith("5") or k.startswith("6") or k.startswith("7"): return "FFC6EFCE" # zelená - CDA podepsáno / SIPIQ if k.startswith("4"): return "FFB7E1CD" # tmavší zelená - CDA vyžádáno if k.startswith("3.1"): return "FFDDEBF7" # světle modrá - zájem if k.startswith("3.2"): return "FFFFC7CE" # červená - nezájem if k.startswith("2"): return "FFFFF2CC" # světle žlutá - připomenuto if k.startswith("1"): return "FFDCE6F1" # modrá - nabídka odeslána if k.startswith("0"): return "FFD9D9D9" # šedá - mimo return None # --- Vytvoření workbooku --- wb = openpyxl.Workbook() ws = wb.active ws.title = "Investigators" # Styly header_font = Font(bold=True, color="FFFFFFFF") header_fill = PatternFill("solid", fgColor="FF1F4E79") header_align = Alignment(horizontal="center", vertical="center", wrap_text=True) cell_align = Alignment(vertical="top", wrap_text=True) thin = Side(style="thin", color="FFB0B0B0") border = Border(left=thin, right=thin, top=thin, bottom=thin) # Záhlaví for col_idx, (key, label) in enumerate(ALL_COLS, 1): cell = ws.cell(row=1, column=col_idx, value=label) cell.font = header_font cell.fill = header_fill cell.alignment = header_align cell.border = border ws.row_dimensions[1].height = 30 # Data for row_idx, doc in enumerate(docs, 2): krok_val = str(doc.get("KROK", "") or "") bg = krok_color(krok_val) for col_idx, (key, label) in enumerate(ALL_COLS, 1): val = doc.get(key, "") # Převod na string pokud je list nebo dict if isinstance(val, list): val = ", ".join(str(v) for v in val) elif isinstance(val, dict): val = str(val) elif val is None: val = "" else: val = str(val) cell = ws.cell(row=row_idx, column=col_idx, value=val) cell.alignment = cell_align cell.border = border if bg: cell.fill = PatternFill("solid", fgColor=bg) if key == "KROK": cell.font = Font(bold=True) # Šířky sloupců col_widths = { "prijmeni": 18, "jmeno": 15, "email": 35, "KROK": 26, "STATUS": 45, "kriticka_poznamka": 60, "zeme": 12, "pracoviste": 35, "internet_summary": 60, } for col_idx, (key, label) in enumerate(ALL_COLS, 1): w = col_widths.get(key, 20) ws.column_dimensions[get_column_letter(col_idx)].width = w # Zmrazení záhlaví ws.freeze_panes = "A2" # Autofilter ws.auto_filter.ref = ws.dimensions # Uložení wb.save(filepath) print(f"Ulozeno: {filepath}") print("Poradi sloupcu:", [label for _, label in ALL_COLS][:6], "...")