|
5 | 5 | permissions, roles, and user assignments within Open edX platform. |
6 | 6 | """ |
7 | 7 |
|
8 | | -from dataclasses import dataclass |
9 | 8 | import logging |
10 | 9 |
|
11 | 10 | import edx_api_doc_tools as apidocs |
|
17 | 16 |
|
18 | 17 | from openedx_authz import api |
19 | 18 | from openedx_authz.constants import permissions |
20 | | -from openedx_authz.rest_api.data import RoleOperationError, RoleOperationStatus |
| 19 | +from openedx_authz.rest_api.data import RoleOperationError, RoleOperationStatus, SortField |
21 | 20 | from openedx_authz.rest_api.decorators import authz_permissions, view_auth_classes |
22 | 21 | from openedx_authz.rest_api.utils import ( |
| 22 | + UserAssignments, |
| 23 | + filter_allowed_assignments, |
23 | 24 | filter_users, |
24 | 25 | get_generic_scope, |
| 26 | + get_user_assignment_map, |
25 | 27 | get_user_by_username_or_email, |
26 | 28 | get_user_map, |
27 | 29 | sort_users, |
|
37 | 39 | PermissionValidationResponseSerializer, |
38 | 40 | PermissionValidationSerializer, |
39 | 41 | RemoveUsersFromRoleWithScopeSerializer, |
| 42 | + TeamMemberSerializer, |
40 | 43 | UserRoleAssignmentSerializer, |
41 | 44 | ) |
42 | 45 |
|
@@ -452,27 +455,6 @@ def get(self, request: HttpRequest) -> Response: |
452 | 455 | serialized_data = ListRolesWithScopeResponseSerializer(paginated_response_data, many=True) |
453 | 456 | return paginator.get_paginated_response(serialized_data.data) |
454 | 457 |
|
455 | | -@dataclass |
456 | | -class UserAssignments: |
457 | | - user: "User" |
458 | | - assignments: list[api.RoleAssignmentData] |
459 | | - |
460 | | -def get_user_assignment_map(role_assignments: list[api.RoleAssignmentData]) -> list[UserAssignments]: |
461 | | - """ |
462 | | - Group role assignments by user |
463 | | - """ |
464 | | - usernames = {assignment.subject.username for assignment in role_assignments} |
465 | | - user_map = get_user_map(usernames) |
466 | | - |
467 | | - users_with_assignments: list[UserAssignments] = [] |
468 | | - |
469 | | - for username, user in user_map.items(): |
470 | | - assignments = [a for a in role_assignments if a.subject.username == username] |
471 | | - users_with_assignments.append(UserAssignments(user=user, assignments=assignments)) |
472 | | - |
473 | | - return users_with_assignments |
474 | | - |
475 | | - |
476 | 458 |
|
477 | 459 | @view_auth_classes() |
478 | 460 | class TeamMembersAPIView(APIView): |
@@ -507,31 +489,42 @@ def get(self, request: HttpRequest) -> Response: |
507 | 489 | query_params = serializer.validated_data |
508 | 490 |
|
509 | 491 | user_role_assignments = api.get_all_user_role_assignments() |
| 492 | + user_role_assignments = filter_allowed_assignments(user=request.user, assignments=user_role_assignments) |
510 | 493 | # Group assignments by user |
511 | 494 | users_with_assignments = get_user_assignment_map(user_role_assignments) |
512 | 495 |
|
513 | | - if query_params.scopes: |
514 | | - # Filter by scopes |
515 | | - scopes = {s.strip() for s in query_params.scopes.split(",")} |
516 | | - users_with_assignments = [ |
517 | | - uwa for uwa in users_with_assignments if any(a.scope.external_key in scopes for a in uwa.assignments) |
518 | | - ] |
| 496 | + scopes = query_params.get('scopes') |
| 497 | + orgs = query_params.get('orgs') |
| 498 | + search = query_params.get('search') |
| 499 | + order = query_params.get('order') |
| 500 | + sort_by = query_params.get('sort_by', SortField.USERNAME) |
519 | 501 |
|
520 | | - if query_params.orgs: |
| 502 | + if scopes: |
| 503 | + # Filter by scopes |
| 504 | + filtered_users: list[UserAssignments] = [] |
| 505 | + for uwa in users_with_assignments: |
| 506 | + if any(a.scope.external_key in scopes for a in uwa.assignments): |
| 507 | + # Also filter assignments to reflect the correct number of assignments |
| 508 | + filtered_assignments = [a for a in uwa.assignments if a.scope.external_key in scopes] |
| 509 | + filtered_users.append(UserAssignments(user=uwa.user, assignments=filtered_assignments)) |
| 510 | + users_with_assignments = filtered_users |
| 511 | + |
| 512 | + if orgs: |
521 | 513 | # Filter by orgs |
522 | | - orgs = {o.strip() for o in query_params.orgs.split(",")} |
523 | | - users_with_assignments = [ |
524 | | - uwa for uwa in users_with_assignments if any(a.scope.org in orgs for a in uwa.assignments) |
525 | | - ] |
526 | | - |
527 | | - |
528 | | - logger.info(f">>>>Query params: {query_params}") |
529 | | - logger.info(f">>>>assignments: {user_role_assignments}") |
530 | | - |
531 | | - # sort |
532 | | - # paginate |
533 | | - |
534 | | - |
535 | | - return Response({"results": []}, status=status.HTTP_200_OK) |
536 | | - |
537 | | - |
| 514 | + filtered_users: list[UserAssignments] = [] |
| 515 | + for uwa in users_with_assignments: |
| 516 | + if any(a.scope.org in orgs for a in uwa.assignments): |
| 517 | + # Also filter assignments to reflect the correct number of assignments |
| 518 | + filtered_assignments = [a for a in uwa.assignments if a.scope.org in orgs] |
| 519 | + filtered_users.append(UserAssignments(user=uwa.user, assignments=filtered_assignments)) |
| 520 | + users_with_assignments = filtered_users |
| 521 | + |
| 522 | + team_members = TeamMemberSerializer(users_with_assignments, many=True) |
| 523 | + # Search |
| 524 | + filtered_team_members = filter_users(users=team_members.data, search=search, roles=None) |
| 525 | + # Sort |
| 526 | + sorted_team_members = sort_users(users=filtered_team_members, sort_by=sort_by, order=order) |
| 527 | + # Paginate |
| 528 | + paginator = self.pagination_class() |
| 529 | + paginated_response_data = paginator.paginate_queryset(sorted_team_members, request) |
| 530 | + return paginator.get_paginated_response(paginated_response_data) |
0 commit comments