from __future__ import annotations from collections.abc import Mapping from dataclasses import dataclass from datetime import datetime from .components import _event_label from .html_utils import attr, escape @dataclass(frozen=True, slots=True) class _AdminEventRow: created_raw: str hostname_raw: str detail_raw: str created: str hostname: str status: str ipv4: str ipv6: str count: str detail: str def _admin_event_row_view(event: Mapping[str, object]) -> _AdminEventRow: created_raw = _event_text(event, "created_at") hostname_raw = _event_text(event, "hostname") detail_raw = _event_text(event, "detail") return _AdminEventRow( created_raw=created_raw, hostname_raw=hostname_raw, detail_raw=detail_raw, created=escape(_short_time(created_raw)), hostname=escape(hostname_raw), status=escape(_event_label(event.get("status"))), ipv4=escape(_event_text(event, "ipv4")), ipv6=escape(_event_text(event, "ipv6")), count=escape(event.get("count") or 1), detail=escape(detail_raw), ) def _event_text(event: Mapping[str, object], key: str) -> str: return str(event.get(key) or "-") 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: row = _admin_event_row_view(event) return ( f'{row.created}' f'{row.hostname}' f'{row.status}{row.ipv4}' f'{row.ipv6}{row.count}' f'{row.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")