mirror of
https://gitlab2.federez.net/re2o/re2o
synced 2024-11-05 01:16:27 +00:00
Add custom pagination for setting page_size
This commit is contained in:
parent
7f6126432b
commit
37458db314
2 changed files with 48 additions and 1 deletions
47
api/pagination.py
Normal file
47
api/pagination.py
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
from rest_framework import pagination
|
||||||
|
from django.core import paginator
|
||||||
|
from django.utils.functional import cached_property
|
||||||
|
|
||||||
|
|
||||||
|
class AllowNegativePaginator(paginator.Paginator):
|
||||||
|
"""
|
||||||
|
Paginator subclass to allow negative or null `per_page` argument,
|
||||||
|
meaning to show all items in one page.
|
||||||
|
"""
|
||||||
|
def page(self, number):
|
||||||
|
"""
|
||||||
|
Bypass the default page creation to render all items if `per_page`
|
||||||
|
argument is negative or null.
|
||||||
|
"""
|
||||||
|
if self.per_page <= 0:
|
||||||
|
return self._get_page(self.object_list, 1, self)
|
||||||
|
return super(AllowNegativePaginator, self).page(number)
|
||||||
|
|
||||||
|
@cached_property
|
||||||
|
def num_pages(self):
|
||||||
|
"""
|
||||||
|
Bypass the default number of page to return 1 if `per_page` argument
|
||||||
|
is negative or null.
|
||||||
|
"""
|
||||||
|
if self.per_page <= 0:
|
||||||
|
return 1
|
||||||
|
return super(AllowNegativePaginator, self).num_pages
|
||||||
|
|
||||||
|
|
||||||
|
class PageSizedPagination(pagination.PageNumberPagination):
|
||||||
|
"""
|
||||||
|
Pagination subclass to all to control the page size
|
||||||
|
"""
|
||||||
|
page_size_query_param = 'page_size'
|
||||||
|
all_pages_strings = ('all',)
|
||||||
|
django_paginator_class = AllowNegativePaginator
|
||||||
|
|
||||||
|
def get_page_size(self, request):
|
||||||
|
try:
|
||||||
|
page_size_str = request.query_params[self.page_size_query_param]
|
||||||
|
if page_size_str in self.all_pages_strings:
|
||||||
|
return -1
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
return super(PageSizedPagination, self).get_page_size(request)
|
|
@ -35,7 +35,7 @@ REST_FRAMEWORK = {
|
||||||
'DEFAULT_PERMISSION_CLASSES': (
|
'DEFAULT_PERMISSION_CLASSES': (
|
||||||
'api.permissions.DefaultACLPermission',
|
'api.permissions.DefaultACLPermission',
|
||||||
),
|
),
|
||||||
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
|
'DEFAULT_PAGINATION_CLASS': 'api.pagination.PageSizedPagination',
|
||||||
'PAGE_SIZE': 100
|
'PAGE_SIZE': 100
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue