Coverage for apps/accounts/directory_api.py: 100%
26 statements
« prev ^ index » next coverage.py v7.17.0, created at 2026-11-04 17:24 +0000
« prev ^ index » next coverage.py v7.17.0, created at 2026-11-04 17:24 +0000
1"""Staff/loan-officer directories for the New Loan form (mounted at "")."""
3from ninja import Router
5from apps.accounts.auth import requires
6from apps.accounts.directory_schemas import LoanOfficerOptionOut, StaffOptionOut
7from apps.accounts.models import User
9router = Router(tags=["directory"])
12def _visible_users(request):
13 principal = request.principal
14 if principal.is_hq or "VIEW_ALL_PIPELINE" in principal.permissions:
15 return User.objects.all()
16 return User.objects.filter(org_unit_id__in=principal.org_unit_ids)
19@router.get(
20 "/loan-officers", response=list[LoanOfficerOptionOut], auth=requires("LOAN_VIEW")
21)
22def list_loan_officers(request):
23 users = _visible_users(request).filter(
24 user_roles__role__name="Loan Officer"
25 ).distinct().prefetch_related("licenses")
26 rows = []
27 for user in users:
28 licensed_states = [
29 lic.state_code for lic in user.licenses.all() if lic.active and lic.sponsored
30 ]
31 rows.append(
32 {
33 "id": user.id,
34 "name": f"{user.first_name} {user.last_name}",
35 "licensed_states": licensed_states,
36 }
37 )
38 return rows
41@router.get("/staff", response=list[StaffOptionOut], auth=requires("LOAN_VIEW"))
42def list_staff(request):
43 users = _visible_users(request).prefetch_related("user_roles__role")
44 rows = []
45 for user in users:
46 first_role = next(iter(user.user_roles.all()), None)
47 rows.append(
48 {
49 "id": user.id,
50 "name": f"{user.first_name} {user.last_name}",
51 "role": first_role.role.name if first_role else "",
52 }
53 )
54 return rows