From 0ee01d63974a066f3bef5d7138ab91eaf799ffee Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Thu, 10 Oct 2013 17:13:05 +0200 Subject: [PATCH] Add headers pagination mixin for generic api view or viewsets. --- rest_framework/mixins.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/rest_framework/mixins.py b/rest_framework/mixins.py index 426865ff9..b009eb259 100644 --- a/rest_framework/mixins.py +++ b/rest_framework/mixins.py @@ -10,6 +10,8 @@ from django.http import Http404 from rest_framework import status from rest_framework.response import Response from rest_framework.request import clone_request +from rest_framework.templatetags.rest_framework import replace_query_param + import warnings @@ -187,3 +189,31 @@ class DestroyModelMixin(object): obj = self.get_object() obj.delete() return Response(status=status.HTTP_204_NO_CONTENT) + + +class HeadersPaginationMixin(object): + def paginate_queryset(self, queryset, page_size=None): + page = super().paginate_queryset(queryset=queryset, page_size=page_size) + + if page is None: + return page + + self.headers["X-Pagination-Count"] = page.paginator.count + self.headers["X-Paginated"] = "true" + + if page.has_next(): + num = page.next_page_number() + url = self.request.build_absolute_uri() + url = replace_query_param(url, "page", num) + self.headers["X-Pagination-Next"] = url + + if page.has_previous(): + num = page.previous_page_number() + url = self.request.build_absolute_uri() + url = replace_query_param(url, "page", num) + self.headers["X-Pagination-Prev"] = url + + return page + + def get_pagination_serializer(self, page): + return self.get_serializer(page.object_list, many=True)