Files
janssen/Feasibility/77242113UCO2001/TRASH/report_77242113UCO2001_v1.1.py
T
2026-06-19 14:28:54 +02:00

158 lines
5.1 KiB
Python

# -*- 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], "...")