bifroest/app/audit/routes.py
2026-10-27 08:34:17 +01:00

57 lines
2.8 KiB
Python

"""Audit-Log: Plattform-Admins sehen alles, Workspace-Admins ihren Workspace."""
from fastapi import APIRouter, Request
from fastapi.responses import HTMLResponse, Response
from app import web
from app.audit import views
from app.identity import admin
from app.workspaces import service as workspaces
def router() -> APIRouter:
r = APIRouter()
def show(request: Request, workspace=None) -> HTMLResponse:
filters = views.parse(dict(request.query_params), workspace_id=workspace.id if workspace else None)
with web.db(request).session() as session:
events, next_before = views.page(session, filters)
users, names = views.labels(session, events)
context = {"events": events, "next_before": next_before, "users": users, "workspace_names": names,
"filters": filters, "actions": views.actions(session, workspace.id if workspace else None),
"all_users": views.all_users(session), "count": views.count(session, filters),
"all_workspaces": [] if workspace else views.all_workspaces(session),
"workspace": workspace, "current_workspace": workspace,
"base": f"/workspaces/{workspace.id}/audit" if workspace else "/admin/audit"}
return web.render(request, "audit.html", context)
def csv_response(request: Request, workspace_id: int | None, name: str) -> Response:
filters = views.parse(dict(request.query_params), workspace_id=workspace_id)
with web.db(request).session() as session:
body = views.export(session, filters)
return Response(body, media_type="text/csv; charset=utf-8",
headers={"Content-Disposition": f'attachment; filename="{name}"'})
@r.get("/admin/audit")
def platform(request: Request, principal: web.User) -> HTMLResponse:
admin.require(principal)
return show(request)
@r.get("/admin/audit.csv")
def platform_csv(request: Request, principal: web.User) -> Response:
admin.require(principal)
return csv_response(request, None, "audit.csv")
@r.get("/workspaces/{workspace_id}/audit")
def workspace(request: Request, principal: web.User, workspace_id: int) -> HTMLResponse:
with web.db(request).session() as session:
ws = workspaces.require_admin(session, principal, workspace_id).workspace
return show(request, ws)
@r.get("/workspaces/{workspace_id}/audit.csv")
def workspace_csv(request: Request, principal: web.User, workspace_id: int) -> Response:
with web.db(request).session() as session:
workspaces.require_admin(session, principal, workspace_id)
return csv_response(request, workspace_id, f"audit-workspace-{workspace_id}.csv")
return r