From b01152e961d79d262eabd7bb364487d0c51b70bf Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 21 Apr 2014 12:53:38 +0200 Subject: [PATCH 1/2] Add parse_page_number method to GenericAPIView. --- rest_framework/generics.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/rest_framework/generics.py b/rest_framework/generics.py index 7bac510f7..12651be9d 100644 --- a/rest_framework/generics.py +++ b/rest_framework/generics.py @@ -113,6 +113,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, From e5e1bd1ad96810e5e43fd51988fdfa75f76a9190 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 21 Apr 2014 12:54:53 +0200 Subject: [PATCH 2/2] Use new parse_page_number method in paginate_queryset. Additionally remove duplicate page number validation. --- rest_framework/generics.py | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/rest_framework/generics.py b/rest_framework/generics.py index 12651be9d..a2d59985d 100644 --- a/rest_framework/generics.py +++ b/rest_framework/generics.py @@ -167,16 +167,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 e: