From 6de0d013c3c6853d9d73c6eb1407978f545ffc9e Mon Sep 17 00:00:00 2001 From: Lebaud Antoine Date: Sat, 9 Mar 2024 16:06:14 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8(api)=20support=20TeamAccess=20orderin?= =?UTF-8?q?g=20on=20their=20role?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Enhance list capabilities, by adding the OrderingFilter as filter backend, to the TeamAccess viewset. API response can be ordered by TeamAccess role. More supported ordering fields will be supported later on. --- src/backend/core/api/viewsets.py | 4 ++ .../test_api_team_accesses_list.py | 42 +++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/src/backend/core/api/viewsets.py b/src/backend/core/api/viewsets.py index 92bbdc7d..b99fa807 100644 --- a/src/backend/core/api/viewsets.py +++ b/src/backend/core/api/viewsets.py @@ -326,6 +326,10 @@ class TeamAccessViewSet( list_serializer_class = serializers.TeamAccessReadOnlySerializer detail_serializer_class = serializers.TeamAccessSerializer + filter_backends = [filters.OrderingFilter] + ordering = ['role'] + ordering_fields = ['role'] + def get_permissions(self): """User only needs to be authenticated to list team accesses""" if self.action == "list": diff --git a/src/backend/core/tests/team_accesses/test_api_team_accesses_list.py b/src/backend/core/tests/team_accesses/test_api_team_accesses_list.py index 58975553..ec237f2f 100644 --- a/src/backend/core/tests/team_accesses/test_api_team_accesses_list.py +++ b/src/backend/core/tests/team_accesses/test_api_team_accesses_list.py @@ -203,3 +203,45 @@ def test_api_team_accesses_list_authenticated_constant_numqueries( assert response.status_code == 200 assert response.json()["count"] == 21 + + +def test_api_team_accesses_list_authenticated_ordering(): + """Team accesses can be ordered by "role".""" + + user = factories.UserFactory() + factories.IdentityFactory(user=user, is_main=True) + + team = factories.TeamFactory() + models.TeamAccess.objects.create(team=team, user=user) + + # create 20 new team members + for _ in range(20): + extra_user = factories.IdentityFactory(is_main=True).user + factories.TeamAccessFactory(team=team, user=extra_user) + + client = APIClient() + client.force_login(user) + + response = client.get( + f"/api/v1.0/teams/{team.id!s}/accesses/?ordering=role", + ) + assert response.status_code == 200 + assert response.json()["count"] == 21 + + results = [ + team_access["role"] + for team_access in response.json()["results"] + ] + assert sorted(results) == results + + response = client.get( + f"/api/v1.0/teams/{team.id!s}/accesses/?ordering=-role", + ) + assert response.status_code == 200 + assert response.json()["count"] == 21 + + results = [ + team_access["role"] + for team_access in response.json()["results"] + ] + assert sorted(results, reverse=True) == results