This commit is contained in:
Andrey Antukh 2014-09-01 13:31:17 +00:00
commit e946a6cdfb

View File

@ -120,6 +120,29 @@ class GenericAPIView(views.APIView):
context = self.get_serializer_context()
return pagination_serializer_class(instance=page, context=context)
def parse_page_number(self):
"""
Parse request parameters and return a valid integer
page number.
Additionally it, parses "last" shortcut and returns -1
when it's received.
In case of invalid data received, ParseError is raised.
"""
page_kwarg = self.kwargs.get(self.page_kwarg)
page_query_param = self.request.QUERY_PARAMS.get(self.page_kwarg)
page = page_kwarg or page_query_param or 1
if page == "last":
page = -1
try:
return int(page)
except (TypeError, ValueError):
raise exceptions.ParseError(_("Page is not 'last', nor can it be converted to an int."))
def paginate_queryset(self, queryset, page_size=None):
"""
Paginate a queryset if required, either returning a page object,
@ -151,16 +174,11 @@ class GenericAPIView(views.APIView):
paginator = self.paginator_class(queryset, page_size,
allow_empty_first_page=self.allow_empty)
page_kwarg = self.kwargs.get(self.page_kwarg)
page_query_param = self.request.QUERY_PARAMS.get(self.page_kwarg)
page = page_kwarg or page_query_param or 1
try:
page_number = paginator.validate_number(page)
except InvalidPage:
if page == 'last':
page_number = paginator.num_pages
else:
raise Http404(_("Page is not 'last', nor can it be converted to an int."))
page_number = self.parse_page_number()
if page_number == -1:
page_number = paginator.num_pages
try:
page = paginator.page(page_number)
except InvalidPage as exc: