Skip to content

Commit 60ef2ee

Browse files
fdemmerauvipy
authored andcommitted
Add limit/offset and cursor pagination to PaginationKeyBit (chibisov#204)
* Add limit/offset and cursor pagination to PaginationKeyBit * Add tests for key bits of LimitOffsetPagination and CursorPagination
1 parent e2637c8 commit 60ef2ee

File tree

2 files changed

+27
-12
lines changed
  • rest_framework_extensions/key_constructor
  • tests_app/tests/unit/key_constructor/bits

2 files changed

+27
-12
lines changed

rest_framework_extensions/key_constructor/bits.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -170,16 +170,22 @@ class PaginationKeyBit(QueryParamsKeyBit):
170170
{'page_size': 100, 'page': '1'}
171171
172172
"""
173+
paginator_attrs = [
174+
'page_query_param', 'page_size_query_param',
175+
'limit_query_param', 'offset_query_param',
176+
'cursor_query_param',
177+
]
178+
173179
def get_data(self, **kwargs):
174180
kwargs['params'] = []
175-
if hasattr(kwargs['view_instance'], 'paginator'):
176-
if hasattr(kwargs['view_instance'].paginator, 'page_query_param'):
177-
kwargs['params'].append(
178-
kwargs['view_instance'].paginator.page_query_param)
179-
if hasattr(kwargs['view_instance'].paginator,
180-
'page_size_query_param'):
181-
kwargs['params'].append(
182-
kwargs['view_instance'].paginator.page_size_query_param)
181+
paginator = getattr(kwargs['view_instance'], 'paginator', None)
182+
183+
if paginator:
184+
for attr in self.paginator_attrs:
185+
param = getattr(paginator, attr, None)
186+
if param:
187+
kwargs['params'].append(param)
188+
183189
return super(PaginationKeyBit, self).get_data(**kwargs)
184190

185191

tests_app/tests/unit/key_constructor/bits/tests.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ def setUp(self):
340340
'params': None,
341341
'view_instance': Mock(spec_set=['paginator']),
342342
'view_method': None,
343-
'request': factory.get('?page_size=10&page=1'),
343+
'request': factory.get('?page_size=10&page=1&limit=5&offset=15&cursor=foo'),
344344
'args': None,
345345
'kwargs': None
346346
}
@@ -357,24 +357,33 @@ def test_view_with_empty_pagination_arguments(self):
357357
def test_view_with_page_kwarg(self):
358358
self.kwargs['view_instance'].paginator.page_query_param = 'page'
359359
self.kwargs['view_instance'].paginator.page_size_query_param = None
360-
self.assertEqual(PaginationKeyBit().get_data(**self.kwargs), {'page': u'1'})
360+
self.assertEqual(PaginationKeyBit().get_data(**self.kwargs), {'page': '1'})
361361

362362
def test_view_with_paginate_by_param(self):
363363
self.kwargs['view_instance'].paginator.page_query_param = None
364364
self.kwargs['view_instance'].paginator.page_size_query_param = 'page_size'
365-
self.assertEqual(PaginationKeyBit().get_data(**self.kwargs), {'page_size': u'10'})
365+
self.assertEqual(PaginationKeyBit().get_data(**self.kwargs), {'page_size': '10'})
366366

367367
def test_view_with_all_pagination_attrs(self):
368368
self.kwargs['view_instance'].paginator.page_query_param = 'page'
369369
self.kwargs['view_instance'].paginator.page_size_query_param = 'page_size'
370-
self.assertEqual(PaginationKeyBit().get_data(**self.kwargs), {'page_size': u'10', 'page': u'1'})
370+
self.assertEqual(PaginationKeyBit().get_data(**self.kwargs), {'page_size': '10', 'page': '1'})
371371

372372
def test_view_with_all_pagination_attrs__without_query_params(self):
373373
self.kwargs['view_instance'].paginator.page_query_param = 'page'
374374
self.kwargs['view_instance'].paginator.page_size_query_param = 'page_size'
375375
self.kwargs['request'] = factory.get('')
376376
self.assertEqual(PaginationKeyBit().get_data(**self.kwargs), {})
377377

378+
def test_view_with_offset_pagination_attrs(self):
379+
self.kwargs['view_instance'].paginator.limit_query_param = 'limit'
380+
self.kwargs['view_instance'].paginator.offset_query_param = 'offset'
381+
self.assertEqual(PaginationKeyBit().get_data(**self.kwargs), {'limit': '5', 'offset': '15'})
382+
383+
def test_view_with_cursor_pagination_attrs(self):
384+
self.kwargs['view_instance'].paginator.cursor_query_param = 'cursor'
385+
self.assertEqual(PaginationKeyBit().get_data(**self.kwargs), {'cursor': 'foo'})
386+
378387

379388
class ListSqlQueryKeyBitTest(TestCase):
380389
def setUp(self):

0 commit comments

Comments
 (0)