Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add creator field to document and allow filtering #429

Merged
merged 10 commits into from
Nov 28, 2024
Merged
9 changes: 6 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,11 @@ and this project adheres to

## Added

- 🌐(backend) add german translation #259
- 🌐(frontend) Add German translation #255
- ✨(frontend) Add a broadcast store #387
- ✨(backend) annotate number of accesses on documents in list view #411
- ✨(backend) allow users to mark/unmark documents as favorite #411
- 🌐(backend) add German translation #259
- 🌐(frontend) add German translation #255
- ✨(frontend) add a broadcast store #387
- ✨(backend) whitelist pod's IP address #443
- ✨(backend) config endpoint #425
- ✨(frontend) config endpoint #424
Expand All @@ -39,6 +41,7 @@ and this project adheres to

## Changed

- ⚡️(backend) optimize number of queries on document list view #411
- 🚸(backend) improve users similarity search and sort results #391
- ♻️(frontend) simplify stores #402
- ✨(frontend) update $css Box props type to add styled components RuleSet #423
Expand Down
69 changes: 69 additions & 0 deletions src/backend/core/api/filters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
"""API filters for Impress' core application."""

from django.utils.translation import gettext_lazy as _

import django_filters

from core import models


class DocumentFilter(django_filters.FilterSet):
"""
Custom filter for filtering documents.
"""

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")
)
title = django_filters.CharFilter(
field_name="title", lookup_expr="icontains", label=_("Title")
)

class Meta:
model = models.Document
fields = ["is_creator_me", "is_favorite", "link_reach", "title"]

# pylint: disable=unused-argument
def filter_is_creator_me(self, queryset, name, value):
"""
Filter documents based on the `creator` being the current user.

Example:
- /api/v1.0/documents/?is_creator_me=true
→ Filters documents created by the logged-in user
- /api/v1.0/documents/?is_creator_me=false
→ Filters documents created by other users
"""
user = self.request.user

if not user.is_authenticated:
return queryset

if value:
return queryset.filter(creator=user)

return queryset.exclude(creator=user)

# pylint: disable=unused-argument
def filter_is_favorite(self, queryset, name, value):
"""
Filter documents based on whether they are marked as favorite by the current user.

Example:
- /api/v1.0/documents/?is_favorite=true
→ Filters documents marked as favorite by the logged-in user
- /api/v1.0/documents/?is_favorite=false
→ Filters documents not marked as favorite by the logged-in user
"""
user = self.request.user

if not user.is_authenticated:
return queryset

if value:
return queryset.filter(favorited_by_users__user=user)

return queryset.exclude(favorited_by_users__user=user)
51 changes: 44 additions & 7 deletions src/backend/core/api/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -137,32 +137,69 @@ def get_abilities(self, document) -> dict:
return {}


class DocumentSerializer(BaseResourceSerializer):
"""Serialize documents."""
class ListDocumentSerializer(BaseResourceSerializer):
"""Serialize documents with limited fields for display in lists."""

content = serializers.CharField(required=False)
accesses = DocumentAccessSerializer(many=True, read_only=True)
is_favorite = serializers.BooleanField(read_only=True)
nb_accesses = serializers.IntegerField(read_only=True)

class Meta:
model = models.Document
fields = [
"id",
"abilities",
"content",
"created_at",
"creator",
"is_favorite",
"link_role",
"link_reach",
"nb_accesses",
"title",
"accesses",
"updated_at",
]
read_only_fields = [
"id",
"abilities",
"created_at",
"creator",
"is_favorite",
"link_role",
"link_reach",
"nb_accesses",
"updated_at",
]


class DocumentSerializer(ListDocumentSerializer):
"""Serialize documents with all fields for display in detail views."""

content = serializers.CharField(required=False)

class Meta:
model = models.Document
fields = [
"id",
"abilities",
"content",
"created_at",
"creator",
"is_favorite",
"link_role",
"link_reach",
"nb_accesses",
"title",
"updated_at",
]
read_only_fields = [
"id",
"accesses",
"abilities",
"created_at",
"creator",
"is_avorite",
"link_role",
"link_reach",
"created_at",
"nb_accesses",
"updated_at",
]

Expand Down
Loading
Loading