Skip to content

Commit 00f5703

Browse files
authored
Merge pull request #45 from cloudblue/opt/LITE-22313
LITE-22313 Optimized RQLLimitOffsetPagination to use only possible limit
2 parents 74702f4 + 367d6c4 commit 00f5703

File tree

2 files changed

+30
-2
lines changed

2 files changed

+30
-2
lines changed

Diff for: dj_rql/drf/paginations.py

+18-2
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,28 @@ def paginate_queryset(self, queryset, request, view=None):
4242
'error': 'Limit and offset are set incorrectly.',
4343
})
4444

45-
if self.get_limit() == 0:
45+
self.limit = self.get_limit(request)
46+
if self.limit == 0:
4647
self.count = self.get_count(queryset)
4748
self.offset = 0
4849
return []
4950

50-
return super(RQLLimitOffsetPagination, self).paginate_queryset(queryset, request, view)
51+
elif self.limit is None:
52+
return None
53+
54+
self.count = self.get_count(queryset)
55+
self.offset = self.get_offset(request)
56+
self.request = request
57+
if self.count > self.limit and self.template is not None:
58+
self.display_page_controls = True
59+
60+
if self.count == 0 or self.offset > self.count:
61+
return []
62+
63+
if self.limit + self.offset > self.count:
64+
self.limit = self.count - self.offset
65+
66+
return list(queryset[self.offset:self.offset + self.limit])
5167

5268
def get_limit(self, *args):
5369
if self._rql_limit is not None:

Diff for: tests/test_drf/test_pagination.py

+12
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,18 @@ def test_max_limit(self):
205205
queryset = self.paginate_queryset(request)
206206
assert queryset == list(range(51, 66))
207207

208+
def test_limit_gt_than_count_wout_offset(self):
209+
self.pagination.max_limit = 500
210+
211+
request = Request(factory.get('/', {'limit': 125}))
212+
queryset = self.paginate_queryset(request)
213+
assert queryset == list(range(1, 101))
214+
215+
def test_limit_gt_than_count_with_offset(self):
216+
request = Request(factory.get('/', {'limit': 125, 'offset': 95}))
217+
queryset = self.paginate_queryset(request)
218+
assert queryset == list(range(96, 101))
219+
208220
def test_rql_operators(self):
209221
limit, offset = 1, 2
210222
request = Request(

0 commit comments

Comments
 (0)