audit logging

This commit is contained in:
JiriUhlir
2026-05-28 11:49:59 +02:00
parent f18aabb5ba
commit 80d82d36dd
7 changed files with 232 additions and 1 deletions
+61
View File
@@ -0,0 +1,61 @@
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>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,
)