From ea53c59131b640ede6e5a00352b3158700a122c9 Mon Sep 17 00:00:00 2001 From: Radek Czajka Date: Tue, 4 Mar 2025 15:31:39 +0100 Subject: [PATCH] book filtering --- requirements/requirements.txt | 1 + src/api/pagination.py | 3 +++ src/catalogue/api/views.py | 17 +++++++++++++++++ src/wolnelektury/settings/apps.py | 1 + 4 files changed, 22 insertions(+) diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 898a609ae..10498cb2b 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -14,6 +14,7 @@ django-modeltranslation==0.18.12 django-allauth==0.51 django-extensions==3.2.3 djangorestframework==3.15.1 +django-filter==23.5 djangorestframework-xml==2.0.0 django-admin-ordering==0.18 django-countries==7.6.1 diff --git a/src/api/pagination.py b/src/api/pagination.py index 0c4ae09d4..04366220c 100644 --- a/src/api/pagination.py +++ b/src/api/pagination.py @@ -3,6 +3,9 @@ from rest_framework.response import Response class WLLimitOffsetPagination(LimitOffsetPagination): + def get_results(self, data): + return data['member'] + def get_paginated_response(self, data): return Response({ "member": data, diff --git a/src/catalogue/api/views.py b/src/catalogue/api/views.py index b55b21451..5afec171a 100644 --- a/src/catalogue/api/views.py +++ b/src/catalogue/api/views.py @@ -9,6 +9,7 @@ from django.core.files.base import ContentFile from django.http import Http404, HttpResponse from django.utils.decorators import method_decorator from django.views.decorators.cache import never_cache +from django_filters import rest_framework as filters from rest_framework.generics import (ListAPIView, RetrieveAPIView, RetrieveUpdateAPIView, get_object_or_404) from rest_framework.permissions import DjangoModelPermissionsOrAnonReadOnly @@ -183,10 +184,26 @@ class BookList(LegacyListAPIView): return Response({}, status=status.HTTP_201_CREATED) +class BookFilter(filters.FilterSet): + sort = filters.OrderingFilter( + fields=( + ('sort_key_author', 'alpha'), + ('popularity', 'popularity'), + ) + ) + tag = filters.ModelMultipleChoiceFilter( + field_name='tag_relations__tag', + queryset=Tag.objects.filter(category__in=('author', 'epoch', 'genre', 'kind')), + conjoined=True, + ) + + class BookList2(ListAPIView): permission_classes = [DjangoModelPermissionsOrAnonReadOnly] queryset = Book.objects.none() # Required for DjangoModelPermissions serializer_class = serializers.BookSerializer2 + filter_backends = (filters.DjangoFilterBackend,) + filterset_class = BookFilter def get_queryset(self): books = Book.objects.all() diff --git a/src/wolnelektury/settings/apps.py b/src/wolnelektury/settings/apps.py index d4faa8bfb..b9d507e86 100644 --- a/src/wolnelektury/settings/apps.py +++ b/src/wolnelektury/settings/apps.py @@ -59,6 +59,7 @@ INSTALLED_APPS_CONTRIB = [ 'django.contrib.postgres', 'admin_ordering', 'rest_framework', + 'django_filters', 'fnp_django_pagination', 'pipeline', 'sorl.thumbnail', -- 2.20.1