From 08bb64ddc15c8a72e17d400f952b4e0f15d22f95 Mon Sep 17 00:00:00 2001 From: Samuel Paccoud - DINUM Date: Wed, 13 Nov 2024 08:58:12 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8(backend)=20allow=20filtering=20by=20d?= =?UTF-8?q?ocuments=20marked=20as=20favorite?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We recently allowed authenticated users to mark a document as favorite. We were lacking the possibility for users to see only the documents they marked as favorite. --- src/backend/core/api/filters.py | 17 ++++++++++------- src/backend/core/api/viewsets.py | 6 ++++-- .../tests/documents/test_api_documents_list.py | 2 -- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/backend/core/api/filters.py b/src/backend/core/api/filters.py index 713f48da..d051b73f 100644 --- a/src/backend/core/api/filters.py +++ b/src/backend/core/api/filters.py @@ -15,10 +15,13 @@ class DocumentFilter(django_filters.FilterSet): is_creator_me = django_filters.BooleanFilter( method="filter_is_creator_me", label=_("Creator is me") ) + is_favorite = django_filters.BooleanFilter( + method="filter_is_favorite", label=_("Favorite") + ) class Meta: model = models.Document - fields = ["is_creator_me"] + fields = ["is_creator_me", "is_favorite"] # pylint: disable=unused-argument def filter_is_creator_me(self, queryset, name, value): @@ -47,9 +50,9 @@ class DocumentFilter(django_filters.FilterSet): Filter documents based on whether they are marked as favorite by the current user. Example: - - /api/v1.0/documents/?favorite=true + - /api/v1.0/documents/?is_favorite=true → Filters documents marked as favorite by the logged-in user - - /api/v1.0/documents/?favorite=false + - /api/v1.0/documents/?is_favorite=false → Filters documents not marked as favorite by the logged-in user """ user = self.request.user @@ -57,7 +60,7 @@ class DocumentFilter(django_filters.FilterSet): if not user.is_authenticated: return queryset - clause = "filter" if value else "exclude" - return getattr(queryset, clause)( - favorited_by_users__user=user, favorited_by_users__is_favorite=True - ) + if value: + return queryset.filter(favorited_by_users__user=user) + + return queryset.exclude(favorited_by_users__user=user) diff --git a/src/backend/core/api/viewsets.py b/src/backend/core/api/viewsets.py index 1f2a9e10..be605381 100644 --- a/src/backend/core/api/viewsets.py +++ b/src/backend/core/api/viewsets.py @@ -324,10 +324,12 @@ class DocumentViewSet( Filtering: - `is_creator_me=true`: Returns documents created by the current user. - `is_creator_me=false`: Returns documents created by other users. + - `is_favorite=true`: Returns documents marked as favorite by the current user + - `is_favorite=false`: Returns documents not marked as favorite by the current user Example Usage: - - GET /api/v1.0/documents/?creator=me - - GET /api/v1.0/documents/?creator=other + - GET /api/v1.0/documents/?is_creator_me=true&is_favorite=true + - GET /api/v1.0/documents/?is_creator_me=false """ filter_backends = [filters.DjangoFilterBackend, drf_filters.OrderingFilter] diff --git a/src/backend/core/tests/documents/test_api_documents_list.py b/src/backend/core/tests/documents/test_api_documents_list.py index 5ddbe9e0..20cef11f 100644 --- a/src/backend/core/tests/documents/test_api_documents_list.py +++ b/src/backend/core/tests/documents/test_api_documents_list.py @@ -433,7 +433,6 @@ def test_api_documents_list_filter_is_creator_me_invalid(): results = response.json()["results"] assert len(results) == 5 - # Filters: is_favorite @@ -496,7 +495,6 @@ def test_api_documents_list_filter_is_favorite_invalid(): results = response.json()["results"] assert len(results) == 5 - # Filters: link_reach