import html import unicodedata from ..config import PORTAL_PREFIX APP_NAME = "CSBot Services Portal" # Sekce viditelné pouze pro tento e-mail (Migration Readiness, Runtime Management, Environment). SUPER_ADMIN_EMAIL = "jiri.uhlir59@gmail.com" # Admin menu: (popisek, odkaz, FA ikona, super_only). super_only = jen pro SUPER_ADMIN_EMAIL. ADMIN_MENU_ITEMS = [ ("Alerting", "/portal/alerting/rules", "fa-bell", False), ("Audit", "/portal/audit", "fa-clipboard-list", False), ("Environment", "/portal/admin/environment", "fa-sliders", True), ("Incidenty", "/portal/incidents", "fa-triangle-exclamation", False), ("IP Access", "/portal/admin/ip-access", "fa-shield-halved", False), ("Nasazení", "/portal/deployments", "fa-rocket", False), ("Plánované skripty", "/portal/scheduled-scripts", "fa-calendar-days", False), ("Služby", "/portal/apps", "fa-server", False), ("Úlohy", "/portal/jobs", "fa-list-check", False), ("Users", "/portal/admin/users", "fa-users", False), ("Workery", "/portal/workers", "fa-gears", False), ("Zálohy", "/portal/backups", "fa-box-archive", False), ] def _alpha_key(label: str) -> str: """Řadicí klíč bez diakritiky (Plánované < Přehled < Služby < Úlohy ...).""" normalized = unicodedata.normalize("NFKD", label) return "".join(ch for ch in normalized if not unicodedata.combining(ch)).lower() def page(title: str, body: str, user=None) -> str: nav = "" user_panel = "" if user: username = html.escape(user.get("username", "")) display_name = html.escape(user.get("display_name") or user.get("username", "")) role = (user.get("role") or "").lower() email = (user.get("email") or "").strip().lower() can_operate = role in ("admin", "developer") # provozní sekce: jen dev nebo admin is_super = email == SUPER_ADMIN_EMAIL # Guest nemá přístup nikam – nezobrazujeme mu žádné odkazy, jen odhlášení. is_guest = role == "guest" # Hlavní navigace: Služby vidí každý přihlášený uživatel (kromě guesta); Úlohy, Plánované # skripty, Alerting a Pro vývojáře jen developer nebo admin. nav_links = "" if not is_guest: nav_links = ' Služby' if can_operate: nav_links += ( ' Úlohy' ' Logy' ' Plánované skripty' ' Alerting' ' Pro vývojáře' ) # IP Access spravují i developeři, ale admin menu se jim nezobrazuje – proto jen jim # přidáváme odkaz do hlavní navigace, aby stránku nemuseli hledat přes detail služby. if can_operate and role != "admin": nav_links += ' IP Access' admin_menu = "" if role == "admin": visible_items = [item for item in ADMIN_MENU_ITEMS if not item[3] or is_super] visible_items.sort(key=lambda item: _alpha_key(item[0])) admin_links = "".join( f' {html.escape(label)}' for label, href, icon, _super_only in visible_items ) admin_menu = f""" """ nav = f""" """ user_panel = "" return f""" {APP_NAME} - {html.escape(title)}
CSBOT {APP_NAME} {nav} {user_panel}
{body}
""" def render_result(title, back_url, sections, extra_link=None, extra_label=None, user=None): rendered_sections = "" for section_title, content in sections: rendered_sections += f"""

{html.escape(section_title)}

{html.escape(content)}
""" extra = "" if extra_link and extra_label: extra = f'

{html.escape(extra_label)}

' return page( title, f"""

{html.escape(title)}

{extra}

← Zpět

{rendered_sections}
""", user=user, )