from __future__ import annotations from collections.abc import Mapping from datetime import datetime from .components import _event_label from .html_utils import attr, escape def _account_row(account: Mapping[str, object], csrf: str = "", admin_path: str = "/admin") -> str: raw_hostname = str(account["hostname"]) hostname = escape(raw_hostname) hostname_attr = attr(raw_hostname) status = "Active" if account.get("accepted_at") else "Pending" ipv4_raw = str(account.get("ipv4") or "-") ipv6_raw = str(account.get("ipv6") or "-") updated_raw = str(account.get("updated_at") or "Never") ipv4 = escape(ipv4_raw) ipv6 = escape(ipv6_raw) updated = escape(_short_time(updated_raw, "Never")) safe_admin_path = attr(admin_path) return f""" {hostname} {escape(status)} {ipv4} {ipv6} {updated}
""" def _admin_table_toolbar(table_id: str, search_label: str) -> str: safe_id = attr(table_id) safe_label = attr(search_label) return f"""
0-0 of 0
""" def _admin_table_pagination() -> str: return """
""" def _event_row(event: Mapping[str, object]) -> str: created_raw = str(event.get("created_at") or "-") hostname_raw = str(event.get("hostname") or "-") detail_raw = str(event.get("detail") or "-") created = escape(_short_time(created_raw)) hostname = escape(hostname_raw) status = escape(_event_label(event.get("status"))) ipv4 = escape(event.get("ipv4") or "-") ipv6 = escape(event.get("ipv6") or "-") count = escape(event.get("count") or 1) detail = escape(detail_raw) return ( f'{created}' f'{hostname}' f'{status}{ipv4}{ipv6}' f'{count}{detail}' ) def _short_time(value: str, fallback: str = "-") -> str: if not value or value == fallback: return fallback try: parsed = datetime.fromisoformat(value) except ValueError: return value return parsed.strftime("%Y-%m-%d %H:%M")