@@ -560,9 +560,63 @@ def get_queryset(self) -> QuerySet:
560560@view_auth_classes ()
561561class TeamMembersAPIView (APIView ):
562562 """
563- API view for listing users in relation to role assignments
564- This API is used in the Team Members section in Admin Console.
565- In this content, a team member is anyone with studio access.
563+ API view for listing users in relation to role assignments.
564+ This API is used in the Team Members section in the Admin Console.
565+ In this context, a team member is anyone with studio access.
566+
567+ **Endpoints**
568+
569+ - GET: Retrieve all users that have at least one role assignment
570+
571+ **Query Parameters**
572+
573+ - scopes (Optional): Comma-separated list of scopes to filter by (e.g., 'lib:Org1:LIB1')
574+ - orgs (Optional): Comma-separated list of orgs to filter by (e.g., 'Org1,Org2')
575+ - search (Optional): Search term to filter users by username, full name, or email
576+ - sort_by (Optional): Field to sort by. Options: username, full_name, email. Defaults to username
577+ - order (Optional): Sort order, 'asc' or 'desc'. Defaults to asc
578+ - page (Optional): Page number for pagination
579+ - page_size (Optional): Number of items per page
580+
581+ **Response Format**
582+
583+ Returns a paginated list of team member objects, each containing:
584+
585+ - username: The user's username
586+ - full_name: The user's full name
587+ - email: The user's email address
588+ - assignation_count: The number of role assignments the user has
589+
590+ **Authentication and Permissions**
591+
592+ - Requires authenticated user.
593+ - Results are filtered according to calling user's scope-level view permissions.
594+
595+ **Example Request**
596+
597+ GET /api/authz/v1/users/?orgs=Org1&search=john&sort_by=username&order=asc&page=1&page_size=10
598+
599+ **Example Response**::
600+
601+ {
602+ "count": 2,
603+ "next": null,
604+ "previous": null,
605+ "results": [
606+ {
607+ "username": "jane_doe",
608+ "full_name": "Jane Doe",
609+ 610+ "assignation_count": 3
611+ },
612+ {
613+ "username": "john_doe",
614+ "full_name": "John Doe",
615+ 616+ "assignation_count": 1
617+ }
618+ ]
619+ }
566620 """
567621
568622 pagination_class = AuthZAPIViewPagination
@@ -691,25 +745,94 @@ def post(self, request: HttpRequest) -> Response:
691745@view_auth_classes ()
692746class TeamMemberAssignmentsAPIView (APIView ):
693747 """
694- API view for listing user role assignments
748+ API view for listing role assignments for a specific user.
749+ This API is used in the Team Member detail view in the Admin Console.
750+
751+ **Endpoints**
752+
753+ - GET: Retrieve all role assignments for a specific user
754+
755+ **URL Parameters**
756+
757+ - username (Required): The username of the user to retrieve assignments for
758+
759+ **Query Parameters**
760+
761+ - orgs (Optional): Comma-separated list of orgs to filter assignments by (e.g., 'Org1,Org2')
762+ - roles (Optional): Comma-separated list of roles to filter assignments by (e.g., 'library_admin,library_user')
763+ - sort_by (Optional): Field to sort by. Options: role, org, scope. Defaults to role
764+ - order (Optional): Sort order, 'asc' or 'desc'. Defaults to asc
765+ - page (Optional): Page number for pagination
766+ - page_size (Optional): Number of items per page
767+
768+ **Response Format**
769+
770+ Returns a paginated list of assignment objects, each containing:
771+
772+ - is_superadmin: Whether this entry denotes a superadmin (staff/superuser)
773+ - role: The role name (e.g., 'library_admin', 'django.superuser')
774+ - org: The org over which this role is applied ('*' for superadmins)
775+ - scope: The scope over which this role is applied ('*' for superadmins)
776+ - permission_count: The number of permissions that apply to this role (null for superadmins)
777+
778+ **Authentication and Permissions**
779+
780+ - Requires authenticated user.
781+ - Results are filtered according to calling user's scope-level view permissions.
782+ - Superadmin entries are always included when the target user is a staff/superuser.
783+
784+ **Example Request**
785+
786+ GET
787+ /api/authz/v1/users/john_doe/assignments/?orgs=Org1&roles=library_admin&sort_by=role&order=asc&page=1&page_size=10
788+
789+ **Example Response**::
790+
791+ {
792+ "count": 2,
793+ "next": null,
794+ "previous": null,
795+ "results": [
796+ {
797+ "is_superadmin": true,
798+ "role": "django.superuser",
799+ "org": "*",
800+ "scope": "*",
801+ "permission_count": null
802+ },
803+ {
804+ "is_superadmin": false,
805+ "role": "library_admin",
806+ "org": "Org1",
807+ "scope": "lib:Org1:LIB1",
808+ "permission_count": 11
809+ }
810+ ]
811+ }
695812 """
696813
697814 pagination_class = AuthZAPIViewPagination
698815 filter_backends = [TeamMemberAssignmentsOrderingFilter ]
699816
700817 @apidocs .schema (
701818 parameters = [
702- apidocs .query_parameter ("orgs" , str , description = "The orgs to query assignations for" ),
703- apidocs .query_parameter ("roles" , str , description = "The roles to query assignations for" ),
704- apidocs .query_parameter ("sort_by" , str , description = "The field to sort by" ),
705- apidocs .query_parameter ("order" , str , description = "The order to sort by" ),
819+ apidocs .query_parameter ("orgs" , str , description = "Comma-separated list of orgs to filter assignments by" ),
820+ apidocs .query_parameter ("roles" , str , description = "Comma-separated list of roles to filter assignments by" ),
821+ apidocs .query_parameter (
822+ "sort_by" ,
823+ str ,
824+ description = "The field to sort by. Options: role, org, scope. Defaults to role" ,
825+ ),
826+ apidocs .query_parameter (
827+ "order" , str , description = "The order to sort by. Options: asc, desc. Defaults to asc"
828+ ),
706829 apidocs .query_parameter ("page" , int , description = "Page number for pagination" ),
707830 apidocs .query_parameter ("page_size" , int , description = "Number of items per page" ),
708831 ],
709832 responses = {
710833 status .HTTP_200_OK : TeamMemberAssignmentSerializer (many = True ),
711834 status .HTTP_400_BAD_REQUEST : "The request parameters are invalid" ,
712- status .HTTP_401_UNAUTHORIZED : "The user is not authenticated or does not have the required permissions " ,
835+ status .HTTP_401_UNAUTHORIZED : "The user is not authenticated" ,
713836 },
714837 )
715838 def get (self , request : HttpRequest , username : str ) -> Response :
0 commit comments