138 lines
4.1 KiB
Python
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}") |