Add firm admin onboarding for partner manager and staff

This commit is contained in:
A R R R Associates
2026-07-06 16:03:09 +05:30
parent 40bb48fb6d
commit 623d21bc3b
6 changed files with 579 additions and 19 deletions
+129 -10
View File
@@ -1,14 +1,21 @@
from __future__ import annotations
from __future__ import annotations
from fastapi import APIRouter, Request
from fastapi import APIRouter, Form, 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.csrf import get_or_create_csrf_token, validate_csrf
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.firm_admin_dashboard.service import build_dashboard_payload, can_access_firm_admin_dashboard
from app.modules.firm_admin_dashboard.service import (
build_dashboard_payload,
build_user_onboarding_payload,
can_access_firm_admin_dashboard,
create_firm_internal_user,
get_onboarding_role_config,
)
router = APIRouter(prefix="/firm-admin", tags=["firm-admin-dashboard-ui"])
@@ -25,9 +32,13 @@ VALID_TABS = {
}
def _ctx(request: Request, db, current_user, *, active_tab: str = "overview"):
def _redirect_login():
return RedirectResponse(url="/login", status_code=303)
def _ctx(request: Request, db, current_user, *, active_tab: str = "overview", **extra):
payload = build_dashboard_payload(db, request, current_user)
return {
ctx = {
"request": request,
"current_user": current_user,
"current_user_roles": get_user_roles(db, current_user.id),
@@ -37,6 +48,23 @@ def _ctx(request: Request, db, current_user, *, active_tab: str = "overview"):
"active_tab": active_tab,
**payload,
}
ctx.update(extra)
return ctx
def _onboarding_ctx(request: Request, db, current_user, role: str, **extra):
payload = build_user_onboarding_payload(db, request, current_user, role)
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),
"title": "Add Firm User",
**payload,
}
ctx.update(extra)
return ctx
@router.get("/dashboard")
@@ -45,8 +73,7 @@ def dashboard(request: Request, tab: str = "overview"):
try:
current_user = get_current_user(request, db=db)
if not current_user:
from fastapi.responses import RedirectResponse
return RedirectResponse(url="/login", status_code=303)
return _redirect_login()
if not can_access_firm_admin_dashboard(db, current_user):
return ui_access_denied()
active_tab = tab if tab in VALID_TABS else "overview"
@@ -64,8 +91,7 @@ def dashboard_tab(request: Request, tab_name: str):
try:
current_user = get_current_user(request, db=db)
if not current_user:
from fastapi.responses import RedirectResponse
return RedirectResponse(url="/login", status_code=303)
return _redirect_login()
if not can_access_firm_admin_dashboard(db, current_user):
return ui_access_denied()
active_tab = tab_name if tab_name in VALID_TABS else "overview"
@@ -73,3 +99,96 @@ def dashboard_tab(request: Request, tab_name: str):
finally:
db.close()
@router.get("/users/new")
def user_onboarding_form(request: Request, role: str = "staff"):
db = CommonSessionLocal()
try:
current_user = get_current_user(request, db=db)
if not current_user:
return _redirect_login()
if not can_access_firm_admin_dashboard(db, current_user):
return ui_access_denied()
if not get_onboarding_role_config(role):
return RedirectResponse(url="/firm-admin/dashboard?tab=users", status_code=303)
return templates.TemplateResponse(
"modules/firm_admin_dashboard/templates/firm_admin_dashboard/user_onboarding.html",
_onboarding_ctx(request, db, current_user, role),
)
finally:
db.close()
@router.post("/users/new")
def user_onboarding_submit(
request: Request,
role: str = Form(...),
email: str = Form(...),
full_name: str = Form(...),
branch_id: int = Form(...),
employee_code: str = Form(""),
mobile: str = Form(""),
department: str = Form(""),
designation: str = Form(""),
date_of_joining: str = Form(""),
employment_type: str = Form("full_time"),
csrf_token: str = Form(...),
):
validate_csrf(request, csrf_token)
db = CommonSessionLocal()
try:
current_user = get_current_user(request, db=db)
if not current_user:
return _redirect_login()
if not can_access_firm_admin_dashboard(db, current_user):
return ui_access_denied()
if not get_onboarding_role_config(role):
return RedirectResponse(url="/firm-admin/dashboard?tab=users", status_code=303)
try:
result = create_firm_internal_user(
db,
request=request,
actor=current_user,
role_key=role,
email=email,
full_name=full_name,
branch_id=branch_id,
employee_code=employee_code,
mobile=mobile,
department=department,
designation=designation,
date_of_joining=date_of_joining,
employment_type=employment_type,
)
except Exception as exc:
db.rollback()
return templates.TemplateResponse(
"modules/firm_admin_dashboard/templates/firm_admin_dashboard/user_onboarding.html",
_onboarding_ctx(
request,
db,
current_user,
role,
flash=str(exc),
form_data={
"email": email,
"full_name": full_name,
"branch_id": branch_id,
"employee_code": employee_code,
"mobile": mobile,
"department": department,
"designation": designation,
"date_of_joining": date_of_joining,
"employment_type": employment_type,
},
),
status_code=400,
)
return templates.TemplateResponse(
"modules/firm_admin_dashboard/templates/firm_admin_dashboard/user_onboarding_done.html",
_ctx(request, db, current_user, active_tab="users", title="Invite Link", onboarding_result=result),
)
finally:
db.close()