Skip to content

Commit

Permalink
Merge pull request #2 from grahamu/add_total_count
Browse files Browse the repository at this point in the history
Adding "paginator" in "meta" for data collections.
  • Loading branch information
brosner committed Apr 7, 2016
2 parents b485afd + fa0d8dd commit 6d46875
Show file tree
Hide file tree
Showing 8 changed files with 469 additions and 26 deletions.
1 change: 0 additions & 1 deletion pinax/api/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
from .registry import register, bind, registry # noqa
from .relationships import Relationship # noqa
from .resource import Resource, Attribute # noqa
from .test import TestCase # noqa
from .urls import URL as url # noqa
from .views import handler404 # noqa
from .viewsets import ResourceEndpointSet, RelationshipEndpointSet # noqa
51 changes: 38 additions & 13 deletions pinax/api/jsonapi.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@
from .resource import Resource


PAGINATOR_PER_PAGE = 100 # default number of items shown per page


class Included(set):

def __init__(self, paths):
Expand Down Expand Up @@ -48,7 +51,7 @@ def __init__(self, data=None, errors=None, links=False, included=None, meta=None
self.errors = errors
self.links = links
self.included = included
self.meta = meta
self.meta = meta if meta else {}
self.linkage = linkage

# internal state
Expand All @@ -59,17 +62,17 @@ def get_serializable_data(self, request=None):
ret = []
data = self.data
if request is not None:
paginator = Paginator(data, 100)
if "page[number]" in request.GET:
try:
page_number = int(request.GET.get("page[number]", "1"))
except ValueError:
page = paginator.page(1)
else:
page = paginator.page(page_number)
else:
page = paginator.page(1)
self._current_page = data = page
per_page, page_number = self.get_pagination_values(request)
paginator = Paginator(data, per_page)
self._current_page = data = paginator.page(page_number)

# Obtain pagination meta-data
paginator = dict(paginator=dict(
count=paginator.count,
num_pages=paginator.num_pages
))
self.meta.update(paginator)

for x in data:
ret.append(x.serializable(
links=self.links,
Expand All @@ -88,6 +91,28 @@ def get_serializable_data(self, request=None):
else:
return self.data

def get_pagination_values(self, request):
if "page[size]" in request.GET:
try:
per_page = int(request.GET.get("page[size]", str(PAGINATOR_PER_PAGE)))
except ValueError:
per_page = PAGINATOR_PER_PAGE
else:
per_page = PAGINATOR_PER_PAGE
if per_page == 0:
# Zero is invalid number of items per page.
# Protect against Django division by zero error.
per_page = PAGINATOR_PER_PAGE

if "page[number]" in request.GET:
try:
page_number = int(request.GET.get("page[number]", "1"))
except ValueError:
page_number = 1
else:
page_number = 1
return per_page, page_number

def build_links(self, request=None):
links = {}
if request is not None:
Expand Down Expand Up @@ -128,7 +153,7 @@ def serializable(self, request=None):
res.update(dict(errors=self.errors))
if self.included:
res.update(dict(included=[r.serializable(links=self.links, request=request) for r in self.included]))
if self.meta is not None:
if self.meta:
res.update(dict(meta=self.meta))
if self.links:
res.update(dict(links=self.build_links(request=request)))
Expand Down
5 changes: 5 additions & 0 deletions pinax/api/tests/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from django.db import models


class TestItem(models.Model):
title = models.CharField(max_length=100)
17 changes: 17 additions & 0 deletions pinax/api/tests/resources.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from pinax import api

from .models import TestItem


@api.register
class TestItemResource(api.Resource):

api_type = "testitem"
model = TestItem
attributes = [
"title",
]

@property
def id(self):
return self.obj.pk
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from __future__ import unicode_literals

from ..test import TestCase
from .test import TestCase


class TestAssertResourceGraph(TestCase):
Expand Down
Loading

0 comments on commit 6d46875

Please sign in to comment.