|
16 | 16 |
|
17 | 17 | from openedx_authz import api |
18 | 18 | from openedx_authz.constants import permissions |
19 | | -from openedx_authz.rest_api.data import RoleOperationError, RoleOperationStatus, SortField |
| 19 | +from openedx_authz.rest_api.data import AssignmentSortField, RoleOperationError, RoleOperationStatus, SortField |
20 | 20 | from openedx_authz.rest_api.decorators import authz_permissions, view_auth_classes |
21 | 21 | from openedx_authz.rest_api.utils import ( |
22 | 22 | UserAssignments, |
|
25 | 25 | get_generic_scope, |
26 | 26 | get_user_assignment_map, |
27 | 27 | get_user_map, |
| 28 | + sort_assignments, |
28 | 29 | sort_users, |
29 | 30 | ) |
30 | 31 | from openedx_authz.rest_api.v1.paginators import AuthZAPIViewPagination |
|
33 | 34 | AddUsersToRoleWithScopeSerializer, |
34 | 35 | ListRolesWithScopeResponseSerializer, |
35 | 36 | ListRolesWithScopeSerializer, |
| 37 | + ListTeamMemberAssignmentsSerializer, |
36 | 38 | ListTeamMembersSerializer, |
37 | 39 | ListUsersInRoleWithScopeSerializer, |
38 | 40 | PermissionValidationResponseSerializer, |
39 | 41 | PermissionValidationSerializer, |
40 | 42 | RemoveUsersFromRoleWithScopeSerializer, |
| 43 | + TeamMemberAssignmentSerializer, |
41 | 44 | TeamMemberSerializer, |
42 | 45 | UserRoleAssignmentSerializer, |
43 | 46 | ) |
@@ -527,3 +530,60 @@ def get(self, request: HttpRequest) -> Response: |
527 | 530 | paginator = self.pagination_class() |
528 | 531 | paginated_response_data = paginator.paginate_queryset(sorted_team_members, request) |
529 | 532 | return paginator.get_paginated_response(paginated_response_data) |
| 533 | + |
| 534 | + |
| 535 | +@view_auth_classes() |
| 536 | +class TeamMemberAssignmentsAPIView(APIView): |
| 537 | + """ |
| 538 | + API view for listing user role assignments |
| 539 | + """ |
| 540 | + |
| 541 | + pagination_class = AuthZAPIViewPagination |
| 542 | + |
| 543 | + @apidocs.schema( |
| 544 | + parameters=[ |
| 545 | + apidocs.query_parameter("orgs", str, description="The orgs to query assignations for"), |
| 546 | + apidocs.query_parameter("roles", str, description="The roles to query assignations for"), |
| 547 | + apidocs.query_parameter("sort_by", str, description="The field to sort by"), |
| 548 | + apidocs.query_parameter("order", str, description="The order to sort by"), |
| 549 | + apidocs.query_parameter("page", int, description="Page number for pagination"), |
| 550 | + apidocs.query_parameter("page_size", int, description="Number of items per page"), |
| 551 | + ], |
| 552 | + responses={ |
| 553 | + status.HTTP_200_OK: TeamMemberAssignmentSerializer(many=True), |
| 554 | + status.HTTP_400_BAD_REQUEST: "The request parameters are invalid", |
| 555 | + status.HTTP_401_UNAUTHORIZED: "The user is not authenticated or does not have the required permissions", |
| 556 | + }, |
| 557 | + ) |
| 558 | + def get(self, request: HttpRequest, username: str) -> Response: |
| 559 | + """Retrieve all user role assignments.""" |
| 560 | + serializer = ListTeamMemberAssignmentsSerializer(data=request.query_params) |
| 561 | + serializer.is_valid(raise_exception=True) |
| 562 | + query_params = serializer.validated_data |
| 563 | + |
| 564 | + user_role_assignments = api.get_user_role_assignments(user_external_key=username) |
| 565 | + # Filter assignments based on the user's permissions |
| 566 | + user_role_assignments = filter_allowed_assignments(user=request.user, assignments=user_role_assignments) |
| 567 | + |
| 568 | + orgs = query_params.get("orgs") |
| 569 | + roles = query_params.get("roles") |
| 570 | + order = query_params.get("order") |
| 571 | + sort_by = query_params.get("sort_by", AssignmentSortField.ROLE) |
| 572 | + |
| 573 | + if orgs: |
| 574 | + # Filter by orgs |
| 575 | + user_role_assignments = [a for a in user_role_assignments if a.scope.org in orgs] |
| 576 | + |
| 577 | + if roles: |
| 578 | + # Filter by roles |
| 579 | + user_role_assignments = [ |
| 580 | + a for a in user_role_assignments if any(role.external_key in roles for role in a.roles) |
| 581 | + ] |
| 582 | + |
| 583 | + assignments = TeamMemberAssignmentSerializer(user_role_assignments, many=True) |
| 584 | + # Sort |
| 585 | + sorted_assignments = sort_assignments(assignments=assignments.data, sort_by=sort_by, order=order) |
| 586 | + # Paginate |
| 587 | + paginator = self.pagination_class() |
| 588 | + paginated_response_data = paginator.paginate_queryset(sorted_assignments, request) |
| 589 | + return paginator.get_paginated_response(paginated_response_data) |
0 commit comments