Skip to content

Commit 586f32a

Browse files
committed
Added the current page to meta and tests for pagination
1 parent 076d983 commit 586f32a

File tree

4 files changed

+77
-4
lines changed

4 files changed

+77
-4
lines changed

README.rst

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,10 @@ override ``settings.REST_FRAMEWORK``::
103103
}
104104

105105

106-
If PAGINATE_BY is included the renderer will return a ``meta`` object with
107-
record count and the next and previous links.
106+
If `PAGINATE_BY` is set the renderer will return a ``meta`` object with
107+
record count and the next and previous links. Django Rest Framework looks
108+
for the `page` GET parameter by default allowing you to make requests for
109+
subsets of the data with `this.store.find('identity', {page: 2});`.
108110

109111

110112
resource_name property

example/settings.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434

3535
REST_FRAMEWORK = {
3636
'PAGINATE_BY': 1,
37+
'PAGINATE_BY_PARAM': 'page_size',
38+
'MAX_PAGINATE_BY': 100,
3739
'DEFAULT_PAGINATION_SERIALIZER_CLASS':
3840
'rest_framework_ember.pagination.EmberPaginationSerializer',
3941
'DEFAULT_PARSER_CLASSES': (

example/tests/test_model_viewsets.py

Lines changed: 59 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,68 @@ def test_key_in_list_result(self):
3535
}]}
3636

3737
json_content = json.loads(response.content)
38+
meta = json_content.get("meta")
39+
40+
self.assertEquals(expected.get('user'), json_content.get('user'))
41+
self.assertEquals(meta.get('count', 0),
42+
get_user_model().objects.count())
43+
self.assertEquals(meta.get("next"), 2)
44+
self.assertEqual(meta.get("page"), 1)
45+
46+
def test_page_two_in_list_result(self):
47+
"""
48+
Ensure that the second page is reachable and is the correct data.
49+
"""
50+
response = self.client.get(self.list_url, {'page': 2})
51+
self.assertEqual(response.status_code, 200)
52+
53+
user = get_user_model().objects.all()[1]
54+
expected = {"user": [{
55+
'id': user.pk,
56+
'first_name': user.first_name,
57+
'last_name': user.last_name,
58+
'email': user.email
59+
}]}
60+
61+
json_content = json.loads(response.content)
62+
meta = json_content.get("meta")
63+
64+
self.assertEquals(expected.get('user'), json_content.get('user'))
65+
self.assertEquals(meta.get('count', 0),
66+
get_user_model().objects.count())
67+
self.assertIsNone(meta.get("next"))
68+
self.assertEqual(meta.get("previous"), 1)
69+
self.assertEqual(meta.get("page"), 2)
70+
71+
def test_page_range_in_list_result(self):
72+
"""
73+
Ensure that the range of a page can be changed from the client.
74+
"""
75+
response = self.client.get(self.list_url, {'page_size': 2})
76+
self.assertEqual(response.status_code, 200)
77+
78+
users = get_user_model().objects.all()
79+
expected = {"user": [
80+
{
81+
'id': users[0].pk,
82+
'first_name': users[0].first_name,
83+
'last_name': users[0].last_name,
84+
'email': users[0].email
85+
},
86+
{
87+
'id': users[1].pk,
88+
'first_name': users[1].first_name,
89+
'last_name': users[1].last_name,
90+
'email': users[1].email
91+
}]}
92+
93+
json_content = json.loads(response.content)
94+
meta = json_content.get("meta")
3895
self.assertEquals(expected.get('user'), json_content.get('user'))
39-
self.assertEquals(
40-
json_content.get("meta", {}).get('count', 0),
96+
self.assertEquals(meta.get('count', 0),
4197
get_user_model().objects.count())
4298

99+
43100
def test_key_in_detail_result(self):
44101
"""
45102
Ensure the result has a "user" key.

rest_framework_ember/pagination.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,21 @@ def to_native(self, value):
5959
return value.previous_page_number()
6060

6161

62+
class PageField(serializers.Field):
63+
"""
64+
Field that returns a link to the previous page in paginated results.
65+
"""
66+
page_field = 'page'
67+
68+
def to_native(self, value):
69+
return value.number
70+
71+
72+
6273
class EmberPaginationSerializer(pagination.BasePaginationSerializer):
6374
next = NextPageField(source='*')
6475
next_link = NextPageLinkField(source='*')
76+
page = PageField(source='*')
6577
previous = PreviousPageField(source='*')
6678
previous_link = PreviousPageField(source='*')
6779
count = serializers.Field(source='paginator.count')

0 commit comments

Comments
 (0)