authentik.api.pagination

Pagination which includes total pages and current page

 1"""Pagination which includes total pages and current page"""
 2
 3from drf_spectacular.plumbing import build_object_type
 4from rest_framework import pagination
 5from rest_framework.response import Response
 6
 7from authentik.api.v3.schema.pagination import PAGINATION
 8
 9
10class Pagination(pagination.PageNumberPagination):
11    """Pagination which includes total pages and current page"""
12
13    page_query_param = "page"
14    page_size_query_param = "page_size"
15
16    def get_page_size(self, request):
17        if self.page_size_query_param in request.query_params:
18            page_size = super().get_page_size(request)
19            if page_size is not None:
20                return min(super().get_page_size(request), request.tenant.pagination_max_page_size)
21        return request.tenant.pagination_default_page_size
22
23    def get_paginated_response(self, data):
24        previous_page_number = 0
25        if self.page.has_previous():
26            previous_page_number = self.page.previous_page_number()
27        next_page_number = 0
28        if self.page.has_next():
29            next_page_number = self.page.next_page_number()
30        return Response(
31            {
32                "pagination": {
33                    "next": next_page_number,
34                    "previous": previous_page_number,
35                    "count": self.page.paginator.count,
36                    "current": self.page.number,
37                    "total_pages": self.page.paginator.num_pages,
38                    "start_index": self.page.start_index(),
39                    "end_index": self.page.end_index(),
40                },
41                "results": data,
42            }
43        )
44
45    def get_paginated_response_schema(self, schema):
46        return build_object_type(
47            properties={
48                "pagination": PAGINATION.ref,
49                "results": schema,
50            },
51            required=["pagination", "results"],
52        )
53
54
55class SmallerPagination(Pagination):
56    """Smaller pagination for objects which might require a lot of queries
57    to retrieve all data for."""
58
59    max_page_size = 10
class Pagination(rest_framework.pagination.PageNumberPagination):
11class Pagination(pagination.PageNumberPagination):
12    """Pagination which includes total pages and current page"""
13
14    page_query_param = "page"
15    page_size_query_param = "page_size"
16
17    def get_page_size(self, request):
18        if self.page_size_query_param in request.query_params:
19            page_size = super().get_page_size(request)
20            if page_size is not None:
21                return min(super().get_page_size(request), request.tenant.pagination_max_page_size)
22        return request.tenant.pagination_default_page_size
23
24    def get_paginated_response(self, data):
25        previous_page_number = 0
26        if self.page.has_previous():
27            previous_page_number = self.page.previous_page_number()
28        next_page_number = 0
29        if self.page.has_next():
30            next_page_number = self.page.next_page_number()
31        return Response(
32            {
33                "pagination": {
34                    "next": next_page_number,
35                    "previous": previous_page_number,
36                    "count": self.page.paginator.count,
37                    "current": self.page.number,
38                    "total_pages": self.page.paginator.num_pages,
39                    "start_index": self.page.start_index(),
40                    "end_index": self.page.end_index(),
41                },
42                "results": data,
43            }
44        )
45
46    def get_paginated_response_schema(self, schema):
47        return build_object_type(
48            properties={
49                "pagination": PAGINATION.ref,
50                "results": schema,
51            },
52            required=["pagination", "results"],
53        )

Pagination which includes total pages and current page

page_query_param = 'page'
page_size_query_param = 'page_size'
def get_page_size(self, request):
17    def get_page_size(self, request):
18        if self.page_size_query_param in request.query_params:
19            page_size = super().get_page_size(request)
20            if page_size is not None:
21                return min(super().get_page_size(request), request.tenant.pagination_max_page_size)
22        return request.tenant.pagination_default_page_size
def get_paginated_response(self, data):
24    def get_paginated_response(self, data):
25        previous_page_number = 0
26        if self.page.has_previous():
27            previous_page_number = self.page.previous_page_number()
28        next_page_number = 0
29        if self.page.has_next():
30            next_page_number = self.page.next_page_number()
31        return Response(
32            {
33                "pagination": {
34                    "next": next_page_number,
35                    "previous": previous_page_number,
36                    "count": self.page.paginator.count,
37                    "current": self.page.number,
38                    "total_pages": self.page.paginator.num_pages,
39                    "start_index": self.page.start_index(),
40                    "end_index": self.page.end_index(),
41                },
42                "results": data,
43            }
44        )
def get_paginated_response_schema(self, schema):
46    def get_paginated_response_schema(self, schema):
47        return build_object_type(
48            properties={
49                "pagination": PAGINATION.ref,
50                "results": schema,
51            },
52            required=["pagination", "results"],
53        )
class SmallerPagination(Pagination):
56class SmallerPagination(Pagination):
57    """Smaller pagination for objects which might require a lot of queries
58    to retrieve all data for."""
59
60    max_page_size = 10

Smaller pagination for objects which might require a lot of queries to retrieve all data for.

max_page_size = 10