Add firm admin bulk user import with template
This commit is contained in:
@@ -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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user