|
20 | 20 | from rest_framework.views import APIView |
21 | 21 |
|
22 | 22 | from openedx_authz import api |
| 23 | +from openedx_authz.api.users import get_user_role_assignments_for_user_filtered |
23 | 24 | from openedx_authz.api.utils import get_user_map |
24 | 25 | from openedx_authz.constants import permissions |
25 | 26 | from openedx_authz.rest_api.data import RoleOperationError, RoleOperationStatus |
|
29 | 30 | get_generic_scope, |
30 | 31 | sort_users, |
31 | 32 | ) |
32 | | -from openedx_authz.rest_api.v1.filters import TeamMemberOrderingFilter, TeamMemberSearchFilter |
| 33 | +from openedx_authz.rest_api.v1.filters import ( |
| 34 | + TeamMemberAssignmentsOrderingFilter, |
| 35 | + TeamMemberOrderingFilter, |
| 36 | + TeamMemberSearchFilter, |
| 37 | +) |
33 | 38 | from openedx_authz.rest_api.v1.paginators import AuthZAPIViewPagination |
34 | 39 | from openedx_authz.rest_api.v1.permissions import AnyScopePermission, DynamicScopePermission |
35 | 40 | from openedx_authz.rest_api.v1.serializers import ( |
36 | 41 | AddUsersToRoleWithScopeSerializer, |
37 | 42 | ListRolesWithScopeResponseSerializer, |
38 | 43 | ListRolesWithScopeSerializer, |
| 44 | + ListTeamMemberAssignmentsSerializer, |
39 | 45 | ListTeamMembersSerializer, |
40 | 46 | ListUsersInRoleWithScopeSerializer, |
41 | 47 | PermissionValidationResponseSerializer, |
42 | 48 | PermissionValidationSerializer, |
43 | 49 | RemoveUsersFromRoleWithScopeSerializer, |
| 50 | + TeamMemberAssignmentSerializer, |
44 | 51 | TeamMemberSerializer, |
45 | 52 | UserRoleAssignmentSerializer, |
46 | 53 | ) |
@@ -590,3 +597,50 @@ def get(self, request: HttpRequest) -> Response: |
590 | 597 | paginator = self.pagination_class() |
591 | 598 | paginated_response_data = paginator.paginate_queryset(team_members, request) |
592 | 599 | return paginator.get_paginated_response(paginated_response_data) |
| 600 | + |
| 601 | + |
| 602 | +@view_auth_classes() |
| 603 | +class TeamMemberAssignmentsAPIView(APIView): |
| 604 | + """ |
| 605 | + API view for listing user role assignments |
| 606 | + """ |
| 607 | + |
| 608 | + pagination_class = AuthZAPIViewPagination |
| 609 | + filter_backends = [TeamMemberAssignmentsOrderingFilter] |
| 610 | + |
| 611 | + @apidocs.schema( |
| 612 | + parameters=[ |
| 613 | + apidocs.query_parameter("orgs", str, description="The orgs to query assignations for"), |
| 614 | + apidocs.query_parameter("roles", str, description="The roles to query assignations for"), |
| 615 | + apidocs.query_parameter("sort_by", str, description="The field to sort by"), |
| 616 | + apidocs.query_parameter("order", str, description="The order to sort by"), |
| 617 | + apidocs.query_parameter("page", int, description="Page number for pagination"), |
| 618 | + apidocs.query_parameter("page_size", int, description="Number of items per page"), |
| 619 | + ], |
| 620 | + responses={ |
| 621 | + status.HTTP_200_OK: TeamMemberAssignmentSerializer(many=True), |
| 622 | + status.HTTP_400_BAD_REQUEST: "The request parameters are invalid", |
| 623 | + status.HTTP_401_UNAUTHORIZED: "The user is not authenticated or does not have the required permissions", |
| 624 | + }, |
| 625 | + ) |
| 626 | + def get(self, request: HttpRequest, username: str) -> Response: |
| 627 | + """Retrieve all user role assignments.""" |
| 628 | + serializer = ListTeamMemberAssignmentsSerializer(data=request.query_params) |
| 629 | + serializer.is_valid(raise_exception=True) |
| 630 | + query_params = serializer.validated_data |
| 631 | + |
| 632 | + user_role_assignments = get_user_role_assignments_for_user_filtered( |
| 633 | + user_external_key=username, |
| 634 | + orgs=query_params.get("orgs"), |
| 635 | + roles=query_params.get("roles"), |
| 636 | + allowed_for_user_external_key=request.user.username, |
| 637 | + ) |
| 638 | + |
| 639 | + assignments = TeamMemberAssignmentSerializer(user_role_assignments, many=True).data |
| 640 | + for backend in self.filter_backends: |
| 641 | + assignments = backend().filter_queryset(request, assignments, self) |
| 642 | + |
| 643 | + # Paginate |
| 644 | + paginator = self.pagination_class() |
| 645 | + paginated_response_data = paginator.paginate_queryset(assignments, request) |
| 646 | + return paginator.get_paginated_response(paginated_response_data) |
0 commit comments