Skip to content

Commit 04092bc

Browse files
committed
squash!: Use DRF filters for sorting and searching
1 parent 90d8cf0 commit 04092bc

2 files changed

Lines changed: 33 additions & 19 deletions

File tree

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
"""Custom DRF filter backends for the Open edX AuthZ REST API."""
2+
3+
from rest_framework.filters import BaseFilterBackend
4+
5+
from openedx_authz.rest_api.data import SortField, SortOrder
6+
from openedx_authz.rest_api.utils import filter_users, sort_users
7+
8+
9+
class TeamMemberSearchFilter(BaseFilterBackend):
10+
"""Filter team members by a search term."""
11+
12+
def filter_queryset(self, request, queryset, view):
13+
search = request.query_params.get("search")
14+
return filter_users(users=queryset, search=search, roles=None)
15+
16+
17+
class TeamMemberOrderingFilter(BaseFilterBackend):
18+
"""Sort team members by a given field and order."""
19+
20+
def filter_queryset(self, request, queryset, view):
21+
sort_by = request.query_params.get("sort_by", SortField.USERNAME)
22+
order = request.query_params.get("order", SortOrder.ASC)
23+
return sort_users(users=queryset, sort_by=sort_by, order=order)

openedx_authz/rest_api/v1/views.py

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
from openedx_authz import api
1818
from openedx_authz.constants import permissions
19-
from openedx_authz.rest_api.data import RoleOperationError, RoleOperationStatus, SortField, UserAssignmentsFilter
19+
from openedx_authz.rest_api.data import RoleOperationError, RoleOperationStatus, UserAssignmentsFilter
2020
from openedx_authz.rest_api.decorators import authz_permissions, view_auth_classes
2121
from openedx_authz.rest_api.utils import (
2222
filter_allowed_assignments,
@@ -27,6 +27,7 @@
2727
get_user_map,
2828
sort_users,
2929
)
30+
from openedx_authz.rest_api.v1.filters import TeamMemberOrderingFilter, TeamMemberSearchFilter
3031
from openedx_authz.rest_api.v1.paginators import AuthZAPIViewPagination
3132
from openedx_authz.rest_api.v1.permissions import DynamicScopePermission
3233
from openedx_authz.rest_api.v1.serializers import (
@@ -465,6 +466,7 @@ class TeamMembersAPIView(APIView):
465466
"""
466467

467468
pagination_class = AuthZAPIViewPagination
469+
filter_backends = [TeamMemberSearchFilter, TeamMemberOrderingFilter]
468470

469471
@apidocs.schema(
470472
parameters=[
@@ -494,32 +496,21 @@ def get(self, request: HttpRequest) -> Response:
494496
# Group assignments by user
495497
users_with_assignments = get_user_assignment_map(user_role_assignments)
496498

497-
scopes = query_params.get("scopes")
498-
orgs = query_params.get("orgs")
499-
search = query_params.get("search")
500-
order = query_params.get("order")
501-
sort_by = query_params.get("sort_by", SortField.USERNAME)
502-
503-
# Filter by scopes
504499
users_with_assignments = filter_user_assignments(
505500
users_with_assignments=users_with_assignments,
506501
by=UserAssignmentsFilter.SCOPES,
507-
values=scopes,
502+
values=query_params.get("scopes"),
508503
)
509-
510-
# Filter by orgs
511504
users_with_assignments = filter_user_assignments(
512505
users_with_assignments=users_with_assignments,
513506
by=UserAssignmentsFilter.ORGS,
514-
values=orgs,
507+
values=query_params.get("orgs"),
515508
)
516509

517-
team_members = TeamMemberSerializer(users_with_assignments, many=True)
518-
# Search
519-
filtered_team_members = filter_users(users=team_members.data, search=search, roles=None)
520-
# Sort
521-
sorted_team_members = sort_users(users=filtered_team_members, sort_by=sort_by, order=order)
522-
# Paginate
510+
team_members = TeamMemberSerializer(users_with_assignments, many=True).data
511+
for backend in self.filter_backends:
512+
team_members = backend().filter_queryset(request, team_members, self)
513+
523514
paginator = self.pagination_class()
524-
paginated_response_data = paginator.paginate_queryset(sorted_team_members, request)
515+
paginated_response_data = paginator.paginate_queryset(team_members, request)
525516
return paginator.get_paginated_response(paginated_response_data)

0 commit comments

Comments
 (0)