diff --git a/backend/djangoindia/api/views/base.py b/backend/djangoindia/api/views/base.py index 68f26894..0b1c3287 100644 --- a/backend/djangoindia/api/views/base.py +++ b/backend/djangoindia/api/views/base.py @@ -9,6 +9,8 @@ from rest_framework.exceptions import APIException from rest_framework.filters import SearchFilter from rest_framework.permissions import IsAuthenticated +from rest_framework.response import Response +from rest_framework.settings import api_settings from rest_framework.views import APIView from rest_framework.viewsets import ModelViewSet @@ -42,7 +44,39 @@ def initial(self, request, *args, **kwargs): timezone.deactivate() -class BaseViewSet(TimezoneMixin, ModelViewSet): +class PaginationMixin: + @property + def paginator(self): + """ + The paginator instance associated with the view, or `None`. + """ + if not hasattr(self, "_paginator"): + if self.pagination_class is None: + self._paginator = None + else: + self._paginator = self.pagination_class() + return self._paginator + + def paginate_queryset(self, queryset): + """ + Return a single page of results, or `None` if pagination + is disabled. + """ + if self.paginator is None: + return queryset + return self.paginator.paginate_queryset(queryset, self.request, view=self) + + def get_paginated_response(self, data): + """ + Return a paginated style `Response` object for the given + output data. + """ + if self.paginator is None: + return Response(data) + return self.paginator.get_paginated_response(data) + + +class BaseViewSet(TimezoneMixin, PaginationMixin, ModelViewSet): """ Base viewset that provides default configurations for API views. diff --git a/backend/djangoindia/api/views/event.py b/backend/djangoindia/api/views/event.py index c6db3798..f704aac8 100644 --- a/backend/djangoindia/api/views/event.py +++ b/backend/djangoindia/api/views/event.py @@ -146,12 +146,13 @@ def list(self, request, *args, **kwargs): """ queryset = self.get_queryset() all_community_partners = CommunityPartner.objects.all() + page = self.paginate_queryset(queryset) serializer = self.get_serializer( - queryset, + page, many=True, context={"all_community_partners": all_community_partners}, ) - return Response(serializer.data) + return self.get_paginated_response(serializer.data) def retrieve(self, request, *args, **kwargs): """ @@ -471,5 +472,6 @@ def get(self, request, event_slug): {"message": "No registration found"}, status=status.HTTP_404_NOT_FOUND ) - serializer = self.serializer_class(registrations, many=True) - return Response(serializer.data) + page = self.paginate_queryset(registrations) + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) diff --git a/backend/djangoindia/api/views/media_library.py b/backend/djangoindia/api/views/media_library.py index eaf50cce..efabb52a 100644 --- a/backend/djangoindia/api/views/media_library.py +++ b/backend/djangoindia/api/views/media_library.py @@ -99,8 +99,9 @@ def list(self, request, *args, **kwargs): Response: JSON response containing a list of serialized folder data. """ queryset = self.filter_queryset(self.get_queryset()) - serializer = self.get_serializer(queryset, many=True) - return Response(serializer.data) + page = queryset + serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(serializer.data) def retrieve(self, request, *args, **kwargs): """ diff --git a/backend/djangoindia/api/views/partner_and_sponsor.py b/backend/djangoindia/api/views/partner_and_sponsor.py index 96db118c..481137ca 100644 --- a/backend/djangoindia/api/views/partner_and_sponsor.py +++ b/backend/djangoindia/api/views/partner_and_sponsor.py @@ -57,5 +57,6 @@ def get(self, request): Response: Serialized data containing both partners and sponsors. """ queryset = self.get_queryset() - serializer = self.serializer_class(queryset) - return Response(serializer.data) + page = queryset + serializer = CommunityPartnerAndSponsorSerializer(page) + return self.get_paginated_response(serializer.data) diff --git a/backend/djangoindia/settings/base.py b/backend/djangoindia/settings/base.py index 9556f90c..625d844f 100644 --- a/backend/djangoindia/settings/base.py +++ b/backend/djangoindia/settings/base.py @@ -181,6 +181,8 @@ ), "DEFAULT_PERMISSION_CLASSES": ("rest_framework.permissions.IsAuthenticated",), "DEFAULT_SCHEMA_CLASS": "drf_spectacular.openapi.AutoSchema", + "DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.PageNumberPagination", + "PAGE_SIZE": 2, } SPECTACULAR_SETTINGS = {