Coverage for backend/django/core/pagination.py: 89%
19 statements
« prev ^ index » next coverage.py v7.10.7, created at 2026-07-22 05:22 +0000
« prev ^ index » next coverage.py v7.10.7, created at 2026-07-22 05:22 +0000
1from rest_framework import pagination
2from rest_framework.response import Response
5class ViewSetPagination(pagination.PageNumberPagination):
6 """
7 Extends PageNumberPagination to include total pages and page size in the pagination response.
9 The `page_size` attribute sets the default number of items per page.
10 """
12 page_size = 20
14 def get_paginated_response(self, data):
15 return Response(
16 {
17 "next": self.get_next_link(),
18 "previous": self.get_previous_link(),
19 "pages": self.page.paginator.num_pages,
20 "count": self.page.paginator.count,
21 "page_size": self.page_size,
22 "results": data,
23 }
24 )
26 def get_paginated_response_schema(self, schema):
27 """Keep the OpenAPI contract aligned with the custom response body."""
29 response_schema = super().get_paginated_response_schema(schema)
30 response_schema["required"].extend(["pages", "page_size"])
31 response_schema["properties"].update(
32 {
33 "pages": {"type": "integer", "minimum": 1, "example": 7},
34 "page_size": {"type": "integer", "minimum": 1, "example": 20},
35 }
36 )
37 return response_schema
40class ClampedViewSetPagination(ViewSetPagination):
41 """Recover to the last page when a mutation shrinks a paged result."""
43 def get_page_number(self, request, paginator):
44 page_number = super().get_page_number(request, paginator)
45 try:
46 numeric_page = int(page_number)
47 except (TypeError, ValueError):
48 return page_number
49 return min(numeric_page, paginator.num_pages)