(backend) allow filtering by documents marked as favorite

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.
This commit is contained in:
Samuel Paccoud - DINUM
2024-11-13 08:58:12 +01:00
committed by Anthony LC
parent 23f90156bf
commit 08bb64ddc1
3 changed files with 14 additions and 11 deletions

View File

@@ -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)

View File

@@ -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]

View File

@@ -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