aboutsummaryrefslogtreecommitdiffstats
path: root/djangorestframework/mixins.py
diff options
context:
space:
mode:
authorTom Christie2011-07-19 20:39:20 +0100
committerTom Christie2011-07-19 20:39:20 +0100
commite956d5177e032611d79ea46e6b629713bf90d2c0 (patch)
treecabd32b0dba3013b812182ca1b845655fd013dfc /djangorestframework/mixins.py
parent20a95db60ae560a4364e8990e5fb97d0d3c3b7ec (diff)
downloaddjango-rest-framework-e956d5177e032611d79ea46e6b629713bf90d2c0.tar.bz2
Revert "Added pagination mixin. Need to write tests"
This reverts commit 1eb2dfcc3a84deb21aeae5a427cc8b11f578c00c.
Diffstat (limited to 'djangorestframework/mixins.py')
-rw-r--r--djangorestframework/mixins.py89
1 files changed, 0 insertions, 89 deletions
diff --git a/djangorestframework/mixins.py b/djangorestframework/mixins.py
index 56f17393..bb26ad96 100644
--- a/djangorestframework/mixins.py
+++ b/djangorestframework/mixins.py
@@ -4,7 +4,6 @@ classes that can be added to a `View`.
"""
from django.contrib.auth.models import AnonymousUser
-from django.core.paginator import Paginator
from django.db.models.query import QuerySet
from django.db.models.fields.related import ForeignKey
from django.http import HttpResponse
@@ -638,92 +637,4 @@ class ListModelMixin(object):
queryset = queryset.order_by(*args)
return queryset.filter(**kwargs)
-########## Pagination Mixins ##########
-
-class PaginatorMixin(object):
- """
- Adds pagination support to GET requests
- Obviously should only be used on lists :)
-
- A default limit can be set by setting `limit` on the object. This will also
- be used as the maximum if the client sets the `limit` GET param
- """
- limit = 20
-
- def get_limit(self):
- """ Helper method to determine what the `limit` should be """
- try:
- limit = int(self.request.GET.get('limit', self.limit))
- return min(limit, self.limit)
- except ValueError:
- return self.limit
-
- def url_with_page_number(self, page_number):
- """ Constructs a url used for getting the next/previous urls """
- url = "%s?page=%d" % (self.request.path, page_number)
-
- limit = self.get_limit()
- if limit != self.limit:
- url = "%s&limit=%d" % (url, limit)
-
- return url
-
- def next(self, page):
- """ Returns a url to the next page of results (if any) """
- if not page.has_next():
- return None
-
- return self.url_with_page_number(page.next_page_number())
-
- def previous(self, page):
- """ Returns a url to the previous page of results (if any) """
- if not page.has_previous():
- return None
-
- return self.url_with_page_number(page.previous_page_number())
-
- def serialize_page_info(self, page):
- """ This is some useful information that is added to the response """
- return {
- 'next': self.next(page),
- 'page': page.number,
- 'pages': page.paginator.num_pages,
- 'per_page': self.get_limit(),
- 'previous': self.previous(page),
- 'total': page.paginator.count,
- }
-
- def filter_response(self, obj):
- """
- Given the response content, paginate and then serialize.
-
- The response is modified to include to useful data relating to the number
- of objects, number of pages, next/previous urls etc. etc.
-
- The serialised objects are put into `results` on this new, modified
- response
- """
-
- # We don't want to paginate responses for anything other than GET requests
- if self.method.upper() != 'GET':
- return self._resource.filter_response(obj)
-
- paginator = Paginator(obj, self.get_limit())
-
- try:
- page_num = int(self.request.GET.get('page', '1'))
- except ValueError:
- page_num = 1
-
- if page_num not in paginator.page_range:
- raise ErrorResponse(status.HTTP_404_NOT_FOUND, {'detail': 'That page contains no results'})
-
- page = paginator.page(page_num)
-
- serialized_object_list = self._resource.filter_response(page.object_list)
- serialized_page_info = self.serialize_page_info(page)
-
- serialized_page_info['results'] = serialized_object_list
-
- return serialized_page_info