Files
appfactory-portal/app/routes/audit.py
T
2026-06-16 10:23:43 +02:00

62 lines
1.9 KiB
Python

import html
from fastapi import APIRouter, Depends, Request
from fastapi.responses import HTMLResponse
from app.auth import require_user
from app.db.audit import get_audit_events
from app.templates.layout import page
router = APIRouter()
@router.get("/audit", response_class=HTMLResponse)
def audit_page(request: Request, user=Depends(require_user)):
rows = ""
for event in get_audit_events():
metadata = event.get("metadata") or "{}"
metadata_preview = metadata if len(metadata) <= 180 else f"{metadata[:177]}..."
rows += f"""
<tr>
<td>{html.escape(event.get("created_at", "") or "")}</td>
<td>{html.escape(event.get("username", "") or "")}</td>
<td><span class="pill pill-muted">{html.escape(event.get("action", "") or "")}</span></td>
<td>{html.escape(event.get("target_type", "") or "")}</td>
<td>{html.escape(str(event.get("target_id") or ""))}</td>
<td>{html.escape(event.get("source", "") or "")}</td>
<td><code>{html.escape(metadata_preview)}</code></td>
</tr>
"""
if not rows:
rows = '<tr><td colspan="7">Zatím nejsou evidované žádné auditní události.</td></tr>'
return page(
"Audit",
f"""
<div class="card">
<h2><i class="fa-solid fa-clipboard-list" aria-hidden="true"></i> Audit</h2>
<p class="muted">Přehled interních akcí provedených v portálu.</p>
</div>
<div class="card">
<h2>Události</h2>
<table>
<tr>
<th>Čas</th>
<th>Uživatel</th>
<th>Akce</th>
<th>Typ cíle</th>
<th>Cíl</th>
<th>Zdroj</th>
<th>Metadata</th>
</tr>
{rows}
</table>
</div>
""",
user=user,
)