Files
janssen/Feasibility/77242113UCO2001/report_77242113UCO2001.py
T

138 lines
4.1 KiB
Python

# Report generator: feasibility/investigators -> Excel
# Projekt: 77242113UCO2001
# Ulozeni: u:\Dropbox\!!!Days\Downloads Z230\\
import os
import sys
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, status, kriticka_poznamka, pak ostatní
FIXED_COLS = [
("prijmeni", "Příjmení"),
("jmeno", "Jméno"),
("email", "Email"),
("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 STATUS ---
def status_color(status):
if not status:
return None
s = status.lower()
if "nezájem" in s or "nezajem" in s or "nechceme" in s:
return "FFFFC7CE" # červená
if "zájem" in s or "zajem" in s:
return "FFC6EFCE" # zelená
if "nedoručen" in s or "nedorucen" in s:
return "FFFFEB9C" # žlutá
if "email odeslán" in s or "email odeslan" in s:
return "FFDCE6F1" # modrá
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):
status_val = str(doc.get("STATUS", "") or "")
bg = status_color(status_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)
# Šířky sloupců
col_widths = {
"prijmeni": 18, "jmeno": 15, "email": 35,
"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}")