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

1"""Staff/loan-officer directories for the New Loan form (mounted at "").""" 

2 

3from ninja import Router 

4 

5from apps.accounts.auth import requires 

6from apps.accounts.directory_schemas import LoanOfficerOptionOut, StaffOptionOut 

7from apps.accounts.models import User 

8 

9router = Router(tags=["directory"]) 

10 

11 

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) 

17 

18 

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 

39 

40 

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