57 lines
2.8 KiB
Python
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
|