Browse Source

feat(api): enable OptionalPagination, status filtering, and newest-first ordering for categories and collections

- Add OptionalPagination to Dovodi Category and Collection viewsets (podcast, video, article)
- Support status query filtering (status=true/false) in category and collection viewsets
- Sort categories and collections by newest first (-created_at, -id) across podcast, video, article, and library admin viewsets
master
Mohsen Taba 3 weeks ago
parent
commit
9b56a20180
  1. 16
      apps/article/views.py
  2. 2
      apps/library/views_admin.py
  3. 14
      apps/podcast/views.py
  4. 14
      apps/video/views.py

16
apps/article/views.py

@ -9,7 +9,7 @@ from rest_framework.viewsets import ModelViewSet
from drf_yasg import openapi
from drf_yasg.utils import swagger_auto_schema
from apps.library.pagination import NoPagination
from utils.pagination import StandardResultsSetPagination
from utils.pagination import StandardResultsSetPagination, OptionalPagination
from utils.mixins import CanonicalSlugViewSetMixin, Gone410ViewMixin
@ -279,13 +279,16 @@ class DovodiArticleCategoryViewSet(ModelViewSet):
serializer_class = DovodiArticleCategorySerializer
permission_classes = [IsAuthenticated]
authentication_classes = [TokenAuthentication]
pagination_class = None
pagination_class = OptionalPagination
def get_queryset(self):
queryset = ArticleCategory.objects.all().order_by("order", "title")
queryset = ArticleCategory.objects.all().order_by("-created_at", "-id")
search_query = self.request.query_params.get("search")
if search_query:
queryset = queryset.filter(Q(title__icontains=search_query) | Q(slug__icontains=search_query))
status_filter = self.request.query_params.get("status")
if status_filter in {"true", "false"}:
queryset = queryset.filter(status=status_filter == "true")
return queryset
@ -293,14 +296,17 @@ class DovodiArticleCollectionViewSet(ModelViewSet):
serializer_class = DovodiArticleCollectionSerializer
permission_classes = [IsAuthenticated]
authentication_classes = [TokenAuthentication]
pagination_class = None
pagination_class = OptionalPagination
parser_classes = (MultiPartParser, FormParser, JSONParser)
def get_queryset(self):
queryset = ArticleCollection.objects.all().order_by("display_position", "order", "title")
queryset = ArticleCollection.objects.all().order_by("-created_at", "-id")
search_query = self.request.query_params.get("search")
if search_query:
queryset = queryset.filter(Q(title__icontains=search_query) | Q(slug__icontains=search_query))
status_filter = self.request.query_params.get("status")
if status_filter in {"true", "false"}:
queryset = queryset.filter(status=status_filter == "true")
return queryset
@action(detail=True, methods=["post"], url_path="assign-items")

2
apps/library/views_admin.py

@ -49,7 +49,7 @@ class DovodiAdminLibraryCategoryViewSet(ModelViewSet):
if status_filter in {"true", "false"}:
queryset = queryset.filter(status=status_filter == "true")
return queryset.order_by("title", "id")
return queryset.order_by("-created_at", "-id")
class AdminLibraryCollectionViewSet(ModelViewSet):

14
apps/podcast/views.py

@ -375,13 +375,16 @@ class DovodiPodcastCategoryViewSet(ModelViewSet):
serializer_class = DovodiPodcastCategorySerializer
permission_classes = [IsAuthenticated]
authentication_classes = [TokenAuthentication]
pagination_class = None
pagination_class = OptionalPagination
def get_queryset(self):
queryset = PodcastCategory.objects.all().order_by("order", "title")
queryset = PodcastCategory.objects.all().order_by("-created_at", "-id")
search_query = self.request.query_params.get("search")
if search_query:
queryset = queryset.filter(Q(title__icontains=search_query) | Q(slug__icontains=search_query))
status_filter = self.request.query_params.get("status")
if status_filter in {"true", "false"}:
queryset = queryset.filter(status=status_filter == "true")
return queryset
@ -389,14 +392,17 @@ class DovodiPodcastCollectionViewSet(ModelViewSet):
serializer_class = DovodiPodcastCollectionSerializer
permission_classes = [IsAuthenticated]
authentication_classes = [TokenAuthentication]
pagination_class = None
pagination_class = OptionalPagination
parser_classes = (MultiPartParser, FormParser, JSONParser)
def get_queryset(self):
queryset = PodcastCollection.objects.all().order_by("display_position", "order", "title")
queryset = PodcastCollection.objects.all().order_by("-created_at", "-id")
search_query = self.request.query_params.get("search")
if search_query:
queryset = queryset.filter(Q(title__icontains=search_query) | Q(slug__icontains=search_query))
status_filter = self.request.query_params.get("status")
if status_filter in {"true", "false"}:
queryset = queryset.filter(status=status_filter == "true")
return queryset
@action(detail=True, methods=["post"], url_path="assign-items")

14
apps/video/views.py

@ -458,13 +458,16 @@ class DovodiVideoCategoryViewSet(ModelViewSet):
serializer_class = DovodiVideoCategorySerializer
permission_classes = [IsAuthenticated]
authentication_classes = [TokenAuthentication]
pagination_class = None
pagination_class = OptionalPagination
def get_queryset(self):
queryset = VideoCategory.objects.all().order_by("order", "title")
queryset = VideoCategory.objects.all().order_by("-created_at", "-id")
search_query = self.request.query_params.get("search")
if search_query:
queryset = queryset.filter(Q(title__icontains=search_query) | Q(slug__icontains=search_query))
status_filter = self.request.query_params.get("status")
if status_filter in {"true", "false"}:
queryset = queryset.filter(status=status_filter == "true")
return queryset
@ -472,14 +475,17 @@ class DovodiVideoCollectionViewSet(ModelViewSet):
serializer_class = DovodiVideoCollectionSerializer
permission_classes = [IsAuthenticated]
authentication_classes = [TokenAuthentication]
pagination_class = None
pagination_class = OptionalPagination
parser_classes = (MultiPartParser, FormParser, JSONParser)
def get_queryset(self):
queryset = VideoCollection.objects.all().order_by("display_position", "order", "title")
queryset = VideoCollection.objects.all().order_by("-created_at", "-id")
search_query = self.request.query_params.get("search")
if search_query:
queryset = queryset.filter(Q(title__icontains=search_query) | Q(slug__icontains=search_query))
status_filter = self.request.query_params.get("status")
if status_filter in {"true", "false"}:
queryset = queryset.filter(status=status_filter == "true")
return queryset
@action(detail=True, methods=["post"], url_path="assign-items")

Loading…
Cancel
Save