authentik.enterprise.search.pagination

 1from rest_framework.response import Response
 2
 3from authentik.api.pagination import Pagination
 4from authentik.enterprise.search.ql import AUTOCOMPLETE_SCHEMA, QLSearch
 5
 6
 7class AutocompletePagination(Pagination):
 8
 9    def paginate_queryset(self, queryset, request, view=None):
10        self.view = view
11        return super().paginate_queryset(queryset, request, view)
12
13    def get_autocomplete(self):
14        schema = QLSearch().get_schema(self.request, self.view)
15        introspections = {}
16        if hasattr(self.view, "get_ql_fields"):
17            from authentik.enterprise.search.schema import AKQLSchemaSerializer
18
19            introspections = AKQLSchemaSerializer().serialize(
20                schema(self.page.paginator.object_list.model)
21            )
22        return introspections
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                "autocomplete": self.get_autocomplete(),
44            }
45        )
46
47    def get_paginated_response_schema(self, schema):
48        final_schema = super().get_paginated_response_schema(schema)
49        final_schema["properties"]["autocomplete"] = AUTOCOMPLETE_SCHEMA.ref
50        final_schema["required"].append("autocomplete")
51        return final_schema
class AutocompletePagination(authentik.api.pagination.Pagination):
 8class AutocompletePagination(Pagination):
 9
10    def paginate_queryset(self, queryset, request, view=None):
11        self.view = view
12        return super().paginate_queryset(queryset, request, view)
13
14    def get_autocomplete(self):
15        schema = QLSearch().get_schema(self.request, self.view)
16        introspections = {}
17        if hasattr(self.view, "get_ql_fields"):
18            from authentik.enterprise.search.schema import AKQLSchemaSerializer
19
20            introspections = AKQLSchemaSerializer().serialize(
21                schema(self.page.paginator.object_list.model)
22            )
23        return introspections
24
25    def get_paginated_response(self, data):
26        previous_page_number = 0
27        if self.page.has_previous():
28            previous_page_number = self.page.previous_page_number()
29        next_page_number = 0
30        if self.page.has_next():
31            next_page_number = self.page.next_page_number()
32        return Response(
33            {
34                "pagination": {
35                    "next": next_page_number,
36                    "previous": previous_page_number,
37                    "count": self.page.paginator.count,
38                    "current": self.page.number,
39                    "total_pages": self.page.paginator.num_pages,
40                    "start_index": self.page.start_index(),
41                    "end_index": self.page.end_index(),
42                },
43                "results": data,
44                "autocomplete": self.get_autocomplete(),
45            }
46        )
47
48    def get_paginated_response_schema(self, schema):
49        final_schema = super().get_paginated_response_schema(schema)
50        final_schema["properties"]["autocomplete"] = AUTOCOMPLETE_SCHEMA.ref
51        final_schema["required"].append("autocomplete")
52        return final_schema

Pagination which includes total pages and current page

def paginate_queryset(self, queryset, request, view=None):
10    def paginate_queryset(self, queryset, request, view=None):
11        self.view = view
12        return super().paginate_queryset(queryset, request, view)

Paginate a queryset if required, either returning a page object, or None if pagination is not configured for this view.

def get_autocomplete(self):
14    def get_autocomplete(self):
15        schema = QLSearch().get_schema(self.request, self.view)
16        introspections = {}
17        if hasattr(self.view, "get_ql_fields"):
18            from authentik.enterprise.search.schema import AKQLSchemaSerializer
19
20            introspections = AKQLSchemaSerializer().serialize(
21                schema(self.page.paginator.object_list.model)
22            )
23        return introspections
def get_paginated_response(self, data):
25    def get_paginated_response(self, data):
26        previous_page_number = 0
27        if self.page.has_previous():
28            previous_page_number = self.page.previous_page_number()
29        next_page_number = 0
30        if self.page.has_next():
31            next_page_number = self.page.next_page_number()
32        return Response(
33            {
34                "pagination": {
35                    "next": next_page_number,
36                    "previous": previous_page_number,
37                    "count": self.page.paginator.count,
38                    "current": self.page.number,
39                    "total_pages": self.page.paginator.num_pages,
40                    "start_index": self.page.start_index(),
41                    "end_index": self.page.end_index(),
42                },
43                "results": data,
44                "autocomplete": self.get_autocomplete(),
45            }
46        )
def get_paginated_response_schema(self, schema):
48    def get_paginated_response_schema(self, schema):
49        final_schema = super().get_paginated_response_schema(schema)
50        final_schema["properties"]["autocomplete"] = AUTOCOMPLETE_SCHEMA.ref
51        final_schema["required"].append("autocomplete")
52        return final_schema