Skip to content

Commit

Permalink
feat(mangas, clubs): add filters to manga and club viewsets
Browse files Browse the repository at this point in the history
  • Loading branch information
tyronejosee committed Jul 3, 2024
1 parent deee24a commit 4c7a7d4
Show file tree
Hide file tree
Showing 5 changed files with 562 additions and 5 deletions.
36 changes: 36 additions & 0 deletions apps/clubs/filters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
"""Filters for Clubs App."""

from django.utils.translation import gettext as _
from django_filters import rest_framework as filters

from .models import Club
from .choices import CategoryChoices


class ClubFilter(filters.FilterSet):
"""Filter for Club model."""

category = filters.ChoiceFilter(
field_name="category",
choices=CategoryChoices.choices,
label="Available club categories, ex `/?category=companies`",
)
public = filters.BooleanFilter(
field_name="is_public",
initial=True,
method="filter_public",
label=_("Filter all public clubs by default to True, ex `/?public=true`"),
)

def filter_public(self, queryset, name, value):
if value:
return queryset
else:
return queryset.filter(is_public=False)

class Meta:
model = Club
fields = [
"category",
"public",
]
4 changes: 2 additions & 2 deletions apps/clubs/viewsets.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
ClubWriteSerializer,
ClubMemberReadSerializer,
)
from .filters import ClubFilter
from .schemas import club_schemas


Expand All @@ -41,8 +42,7 @@ class ClubViewSet(ListCacheMixin, LogicalDeleteMixin, ModelViewSet):
serializer_class = ClubWriteSerializer
pagination_class = LargeSetPagination
search_fields = ["name", "category"]
# filterset_class = ClubFilter
# TODO: Add filter
filterset_class = ClubFilter

def get_queryset(self):
return Club.objects.get_available()
Expand Down
63 changes: 63 additions & 0 deletions apps/mangas/filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,69 @@ class Meta:
]


class MangaFilter(BaseFilter):
"""Filter for Manga model."""

min_score = filters.NumberFilter(
field_name="score",
lookup_expr="gte",
label=_(
"Set a minimum score for results, ex `/?min_score=5` or `/?min_score=5.5`"
),
)
max_score = filters.NumberFilter(
field_name="score",
lookup_expr="lte",
label=_(
"Set a maximum score for results, ex `/?max_score=7` or `/?max_score=7.8`"
),
)
type = filters.ChoiceFilter(
field_name="media_type",
choices=MediaTypeChoices.choices,
label="Available Manga types, , ex `/?type=manga`",
)
status = filters.ChoiceFilter(
choices=StatusChoices.choices,
label=_("Available Manga status, ex `/?status=finished`"),
)
genre = filters.CharFilter(
field_name="genres__name",
lookup_expr="icontains",
label=_("Filter by genre(s), ex `/?genre=gore`"),
)
theme = filters.CharFilter(
field_name="themes__name",
lookup_expr="icontains",
label=_("Filter by theme(s), ex `/?theme=shounen`"),
)
start_date = filters.DateFilter(
field_name="published_from",
lookup_expr="gte",
label=_("Filter by starting date, Format: `YYYY-MM-DD`. ex `2005-01-01`"),
)
end_date = filters.DateFilter(
field_name="published_from",
lookup_expr="lte",
label=_("Filter by ending date, Format: `YYYY-MM-DD`. ex `2005-01-01`"),
)

class Meta:
model = Manga
fields = [
"min_score",
"max_score",
"type",
"status",
"genre",
"theme",
"start_date",
"end_date",
"sort",
"letter",
]


class MangaMinimalFilter(filters.FilterSet):
"""Filter for Anime model (Minimal)."""

Expand Down
5 changes: 2 additions & 3 deletions apps/mangas/viewsets.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
MangaMinimalSerializer,
MangaStatsReadSerializer,
)
from .filters import MagazineFilter
from .filters import MagazineFilter, MangaFilter
from .schemas import magazine_schemas, manga_schemas


Expand Down Expand Up @@ -88,8 +88,7 @@ class MangaViewSet(ListCacheMixin, LogicalDeleteMixin, ModelViewSet):
permission_classes = [IsContributor]
serializer_class = MangaWriteSerializer
search_fields = ["name"]
# filterset_class = MangaFilter
# TODO: Add filter
filterset_class = MangaFilter

def get_queryset(self):
return Manga.objects.get_available()
Expand Down
Loading

0 comments on commit 4c7a7d4

Please sign in to comment.