gault-millau/apps/utils/pagination.py

91 lines
2.7 KiB
Python

"""Pagination settings."""
from base64 import b64encode
from urllib import parse as urlparse
from django.conf import settings
from rest_framework.pagination import CursorPagination, PageNumberPagination
from django_elasticsearch_dsl_drf.pagination import PageNumberPagination as ESPagination
class ProjectPageNumberPagination(PageNumberPagination):
"""Customized pagination class."""
page_size_query_param = 'page_size'
class ProjectCursorPagination(CursorPagination):
"""Customized cursor pagination class."""
def encode_cursor(self, cursor):
"""
Given a Cursor instance, return an url with encoded cursor.
"""
tokens = {}
if cursor.offset != 0:
tokens['o'] = str(cursor.offset)
if cursor.reverse:
tokens['r'] = '1'
if cursor.position is not None:
tokens['p'] = cursor.position
querystring = urlparse.urlencode(tokens, doseq=True)
encoded = b64encode(querystring.encode('ascii')).decode('ascii')
return encoded
class ProjectMobilePagination(ProjectPageNumberPagination):
"""Pagination settings for mobile API."""
def get_next_link(self):
"""Get next link method."""
if not self.page.has_next():
return None
return self.page.next_page_number()
def get_previous_link(self):
"""Get previous link method."""
if not self.page.has_previous():
return None
return self.page.previous_page_number()
class ESDocumentPagination(ESPagination):
"""Pagination class for ES results. (includes facets)"""
page_size_query_param = 'page_size'
def get_next_link(self):
"""Get next link method."""
if not self.page.has_next():
return None
return self.page.next_page_number()
def get_previous_link(self):
"""Get previous link method."""
if not self.page.has_previous():
return None
return self.page.previous_page_number()
def get_facets(self, page=None):
"""Get facets.
:param page:
:return:
"""
if page is None:
page = self.page
if hasattr(self, 'facets_computed'):
ret = {}
for filter_field, bucket_data in self.facets_computed.items():
ret.update({filter_field: bucket_data.__dict__['_d_']})
return ret
elif hasattr(page, 'facets') and hasattr(page.facets, '_d_'):
return page.facets._d_
class PortionPagination(ProjectMobilePagination):
"""
Pagination for app establishments with limit page size equal to 12
"""
page_size = settings.QUERY_OUTPUT_OBJECTS