Add firm admin bulk user import with template

This commit is contained in:
A R R R Associates
2026-07-06 16:12:50 +05:30
parent 623d21bc3b
commit 61930616bf
5 changed files with 367 additions and 2 deletions
+76 -2
View File
@@ -1,7 +1,9 @@
from __future__ import annotations
from fastapi import APIRouter, Form, Request
from fastapi.responses import RedirectResponse
from io import BytesIO
from fastapi import APIRouter, File, Form, Request, UploadFile
from fastapi.responses import RedirectResponse, StreamingResponse
from app.core.db.common import CommonSessionLocal
from app.core.http_responses import ui_access_denied
@@ -13,8 +15,10 @@ from app.modules.firm_admin_dashboard.service import (
build_dashboard_payload,
build_user_onboarding_payload,
can_access_firm_admin_dashboard,
build_firm_user_import_template,
create_firm_internal_user,
get_onboarding_role_config,
import_firm_internal_users,
)
router = APIRouter(prefix="/firm-admin", tags=["firm-admin-dashboard-ui"])
@@ -192,3 +196,73 @@ def user_onboarding_submit(
)
finally:
db.close()
@router.get("/users/import")
def user_import_form(request: Request):
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()
return templates.TemplateResponse(
"modules/firm_admin_dashboard/templates/firm_admin_dashboard/user_import.html",
_ctx(request, db, current_user, active_tab="users", title="Import Firm Users"),
)
finally:
db.close()
@router.get("/users/import/template")
def user_import_template(request: Request):
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()
content = build_firm_user_import_template(db, request, current_user)
return StreamingResponse(
BytesIO(content),
media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
headers={"Content-Disposition": 'attachment; filename="firm_admin_user_import_template.xlsx"'},
)
finally:
db.close()
@router.post("/users/import")
async def user_import_submit(request: Request, import_file: UploadFile = File(...), 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 import_file.filename or not import_file.filename.lower().endswith((".xlsx", ".xlsm")):
return templates.TemplateResponse(
"modules/firm_admin_dashboard/templates/firm_admin_dashboard/user_import.html",
_ctx(request, db, current_user, active_tab="users", title="Import Firm Users", flash="Please upload an .xlsx Excel file."),
status_code=400,
)
try:
content = await import_file.read()
result = import_firm_internal_users(db, request=request, actor=current_user, content=content)
except Exception as exc:
db.rollback()
return templates.TemplateResponse(
"modules/firm_admin_dashboard/templates/firm_admin_dashboard/user_import.html",
_ctx(request, db, current_user, active_tab="users", title="Import Firm Users", flash=str(exc)),
status_code=400,
)
return templates.TemplateResponse(
"modules/firm_admin_dashboard/templates/firm_admin_dashboard/user_import_done.html",
_ctx(request, db, current_user, active_tab="users", title="Import Result", import_result=result),
)
finally:
db.close()