Files
arrr-erp/app/modules/system_admin_dashboard/ui.py
T
2026-07-03 18:06:26 +05:30

126 lines
4.0 KiB
Python

from __future__ import annotations
from fastapi import APIRouter, Request
from fastapi.responses import RedirectResponse
from app.core.db.common import CommonSessionLocal
from app.core.http_responses import ui_access_denied
from app.core.security.csrf import get_or_create_csrf_token
from app.core.security.session_auth import get_current_user
from app.core.templating import templates
from app.modules.core.rbac.deps import get_user_permissions, get_user_roles
from app.modules.system_admin_dashboard.service import (
get_billing_readiness,
get_catalogue_summary,
get_firm_setup_health,
get_overview,
get_recent_audit_logs,
get_report_cards,
get_smtp_summary,
get_storage_status,
get_wizard_cards,
is_system_admin,
list_firms,
)
router = APIRouter(prefix="/system-admin", tags=["system-admin-dashboard-ui"])
_ALLOWED_TABS = {
"overview",
"firms",
"firm-setup-health",
"catalogue",
"smtp",
"storage",
"billing",
"reports",
"wizards",
"audit-logs",
}
def _login_redirect() -> RedirectResponse:
return RedirectResponse(url="/login", status_code=303)
def _base_context(request: Request, db, current_user, **extra):
ctx = {
"request": request,
"current_user": current_user,
"current_user_roles": get_user_roles(db, current_user.id),
"current_user_permissions": get_user_permissions(db, current_user.id),
"csrf_token": get_or_create_csrf_token(request),
}
ctx.update(extra)
return ctx
def _system_admin_or_response(request: Request, db):
current_user = get_current_user(request, db=db)
if not current_user:
return None, _login_redirect()
if not is_system_admin(db, current_user):
return None, ui_access_denied()
return current_user, None
@router.get("/dashboard")
def dashboard(request: Request, tab: str = "overview"):
db = CommonSessionLocal()
try:
current_user, response = _system_admin_or_response(request, db)
if response:
return response
active_tab = tab if tab in _ALLOWED_TABS else "overview"
return templates.TemplateResponse(
"modules/system_admin_dashboard/templates/system_admin_dashboard/dashboard.html",
_base_context(
request,
db,
current_user,
title="System Admin Dashboard",
active_tab=active_tab,
),
)
finally:
db.close()
@router.get("/dashboard/tab/{tab_name}")
def dashboard_tab(request: Request, tab_name: str):
db = CommonSessionLocal()
try:
current_user, response = _system_admin_or_response(request, db)
if response:
return response
if tab_name not in _ALLOWED_TABS:
tab_name = "overview"
extra = {"active_tab": tab_name}
template = f"modules/system_admin_dashboard/templates/system_admin_dashboard/partials/{tab_name.replace('-', '_')}.html"
if tab_name == "overview":
extra["overview"] = get_overview(db)
elif tab_name == "firms":
extra["firms"] = list_firms(db)
elif tab_name == "firm-setup-health":
extra["health"] = get_firm_setup_health(db)
elif tab_name == "catalogue":
extra["catalogue"] = get_catalogue_summary(db)
elif tab_name == "smtp":
extra["smtp"] = get_smtp_summary(db)
elif tab_name == "storage":
extra["storage"] = get_storage_status(db)
elif tab_name == "billing":
extra["billing"] = get_billing_readiness(db)
elif tab_name == "reports":
extra["report_groups"] = get_report_cards(db)
elif tab_name == "wizards":
extra["wizard_groups"] = get_wizard_cards()
elif tab_name == "audit-logs":
extra["audit_logs"] = get_recent_audit_logs(db)
return templates.TemplateResponse(template, _base_context(request, db, current_user, **extra))
finally:
db.close()