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

1from rest_framework import pagination 

2from rest_framework.response import Response 

3 

4 

5class ViewSetPagination(pagination.PageNumberPagination): 

6 """ 

7 Extends PageNumberPagination to include total pages and page size in the pagination response. 

8 

9 The `page_size` attribute sets the default number of items per page. 

10 """ 

11 

12 page_size = 20 

13 

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 ) 

25 

26 def get_paginated_response_schema(self, schema): 

27 """Keep the OpenAPI contract aligned with the custom response body.""" 

28 

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 

38 

39 

40class ClampedViewSetPagination(ViewSetPagination): 

41 """Recover to the last page when a mutation shrinks a paged result.""" 

42 

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)