Add unified reports centre v1
This commit is contained in:
@@ -0,0 +1,112 @@
|
||||
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.unified_reports.service import (
|
||||
can_access_reports,
|
||||
cards_by_group,
|
||||
get_report_summary,
|
||||
get_report_tabs,
|
||||
get_visible_report_cards,
|
||||
)
|
||||
|
||||
router = APIRouter(prefix="/reports", tags=["unified-reports-ui"])
|
||||
|
||||
_ALLOWED_TABS = {
|
||||
"my-reports": "my",
|
||||
"work": "work",
|
||||
"client": "client",
|
||||
"billing": "billing",
|
||||
"hr": "hr",
|
||||
"system": "system",
|
||||
"audit": "audit",
|
||||
}
|
||||
|
||||
|
||||
def _login_redirect() -> RedirectResponse:
|
||||
return RedirectResponse(url="/login", status_code=303)
|
||||
|
||||
|
||||
def _current_user_or_response(request: Request, db):
|
||||
current_user = get_current_user(request, db=db)
|
||||
if not current_user:
|
||||
return None, _login_redirect()
|
||||
roles = get_user_roles(db, current_user.id)
|
||||
permissions = get_user_permissions(db, current_user.id)
|
||||
if not can_access_reports(roles, permissions):
|
||||
return None, ui_access_denied()
|
||||
return current_user, None
|
||||
|
||||
|
||||
def _payload(db, current_user):
|
||||
roles = get_user_roles(db, current_user.id)
|
||||
permissions = get_user_permissions(db, current_user.id)
|
||||
cards = get_visible_report_cards(roles, permissions)
|
||||
groups = cards_by_group(cards)
|
||||
return {
|
||||
"current_user_roles": roles,
|
||||
"current_user_permissions": permissions,
|
||||
"report_cards": cards,
|
||||
"report_groups": groups,
|
||||
"report_tabs": get_report_tabs(cards),
|
||||
"report_summary": get_report_summary(cards),
|
||||
}
|
||||
|
||||
|
||||
def _base_context(request: Request, db, current_user, **extra):
|
||||
ctx = {
|
||||
"request": request,
|
||||
"current_user": current_user,
|
||||
"csrf_token": get_or_create_csrf_token(request),
|
||||
}
|
||||
ctx.update(_payload(db, current_user))
|
||||
ctx.update(extra)
|
||||
return ctx
|
||||
|
||||
|
||||
@router.get("")
|
||||
def reports_home(request: Request, tab: str = "my-reports"):
|
||||
db = CommonSessionLocal()
|
||||
try:
|
||||
current_user, response = _current_user_or_response(request, db)
|
||||
if response:
|
||||
return response
|
||||
active_tab = tab if tab in _ALLOWED_TABS else "my-reports"
|
||||
return templates.TemplateResponse(
|
||||
"modules/unified_reports/templates/unified_reports/dashboard.html",
|
||||
_base_context(request, db, current_user, title="Reports Centre", active_tab=active_tab),
|
||||
)
|
||||
finally:
|
||||
db.close()
|
||||
|
||||
|
||||
@router.get("/tab/{tab_name}")
|
||||
def reports_tab(request: Request, tab_name: str):
|
||||
db = CommonSessionLocal()
|
||||
try:
|
||||
current_user, response = _current_user_or_response(request, db)
|
||||
if response:
|
||||
return response
|
||||
active_tab = tab_name if tab_name in _ALLOWED_TABS else "my-reports"
|
||||
group_key = _ALLOWED_TABS[active_tab]
|
||||
return templates.TemplateResponse(
|
||||
f"modules/unified_reports/templates/unified_reports/partials/{active_tab.replace('-', '_')}.html",
|
||||
_base_context(
|
||||
request,
|
||||
db,
|
||||
current_user,
|
||||
title="Reports Centre",
|
||||
active_tab=active_tab,
|
||||
active_group=group_key,
|
||||
active_cards=cards_by_group(get_visible_report_cards(get_user_roles(db, current_user.id), get_user_permissions(db, current_user.id))).get(group_key, []),
|
||||
),
|
||||
)
|
||||
finally:
|
||||
db.close()
|
||||
Reference in New Issue
Block a user