Commit 1bcec3a0 by Tom Christie

API tweaks and pagination documentation

parent 564f845e
...@@ -160,11 +160,11 @@ class GenericAPIView(views.APIView): ...@@ -160,11 +160,11 @@ class GenericAPIView(views.APIView):
def paginate_queryset(self, queryset): def paginate_queryset(self, queryset):
if self.pager is None: if self.pager is None:
return None return queryset
return self.pager.paginate_queryset(queryset, self.request, view=self) return self.pager.paginate_queryset(queryset, self.request, view=self)
def get_paginated_response(self, objects): def get_paginated_response(self, data):
return self.pager.get_paginated_response(objects) return self.pager.get_paginated_response(data)
# Concrete view classes that provide method handlers # Concrete view classes that provide method handlers
......
...@@ -25,11 +25,21 @@ def _strict_positive_int(integer_string, cutoff=None): ...@@ -25,11 +25,21 @@ def _strict_positive_int(integer_string, cutoff=None):
return ret return ret
def _get_count(queryset):
"""
Determine an object count, supporting either querysets or regular lists.
"""
try:
return queryset.count()
except AttributeError:
return len(queryset)
class BasePagination(object): class BasePagination(object):
def paginate_queryset(self, queryset, request): def paginate_queryset(self, queryset, request, view):
raise NotImplemented('paginate_queryset() must be implemented.') raise NotImplemented('paginate_queryset() must be implemented.')
def get_paginated_response(self, data, page, request): def get_paginated_response(self, data):
raise NotImplemented('get_paginated_response() must be implemented.') raise NotImplemented('get_paginated_response() must be implemented.')
...@@ -58,8 +68,8 @@ class PageNumberPagination(BasePagination): ...@@ -58,8 +68,8 @@ class PageNumberPagination(BasePagination):
def paginate_queryset(self, queryset, request, view): def paginate_queryset(self, queryset, request, view):
""" """
Paginate a queryset if required, either returning a page object, Paginate a queryset if required, either returning a
or `None` if pagination is not configured for this view. page object, or `None` if pagination is not configured for this view.
""" """
for attr in ( for attr in (
'paginate_by', 'page_query_param', 'paginate_by', 'page_query_param',
...@@ -97,12 +107,12 @@ class PageNumberPagination(BasePagination): ...@@ -97,12 +107,12 @@ class PageNumberPagination(BasePagination):
self.request = request self.request = request
return self.page return self.page
def get_paginated_response(self, objects): def get_paginated_response(self, data):
return Response(OrderedDict([ return Response(OrderedDict([
('count', self.page.paginator.count), ('count', self.page.paginator.count),
('next', self.get_next_link()), ('next', self.get_next_link()),
('previous', self.get_previous_link()), ('previous', self.get_previous_link()),
('results', objects) ('results', data)
])) ]))
def get_page_size(self, request): def get_page_size(self, request):
...@@ -147,16 +157,16 @@ class LimitOffsetPagination(BasePagination): ...@@ -147,16 +157,16 @@ class LimitOffsetPagination(BasePagination):
def paginate_queryset(self, queryset, request, view): def paginate_queryset(self, queryset, request, view):
self.limit = self.get_limit(request) self.limit = self.get_limit(request)
self.offset = self.get_offset(request) self.offset = self.get_offset(request)
self.count = queryset.count() self.count = _get_count(queryset)
self.request = request self.request = request
return queryset[self.offset:self.offset + self.limit] return queryset[self.offset:self.offset + self.limit]
def get_paginated_response(self, objects): def get_paginated_response(self, data):
return Response(OrderedDict([ return Response(OrderedDict([
('count', self.count), ('count', self.count),
('next', self.get_next_link()), ('next', self.get_next_link()),
('previous', self.get_previous_link()), ('previous', self.get_previous_link()),
('results', objects) ('results', data)
])) ]))
def get_limit(self, request): def get_limit(self, request):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment