91 lines
2.7 KiB
Python
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
|