Skip to content

Commit abfa28d

Browse files
authored
Fixes: #18150 - Get pagination limit with default 0 (#18151)
* Wait until job1 is scheduled before enqueueing job2 * Clamp limit=0 to default_limit * Handle unspecified limit explicitly so as to return min(PAGINATE_COUNT, MAX_PAGE_SIZE) * Revert original min() * Coerce MAX_PAGE_SIZE to be at least PAGINATE_COUNT * Raise ImproperlyConfigured error if MAX_PAGE_SIZE < PAGINATE_COUNT * Revert test behavior * Revert "Revert test behavior" This reverts commit 5087a11. * Revert "Raise ImproperlyConfigured error if MAX_PAGE_SIZE < PAGINATE_COUNT" This reverts commit 5dd93c0.
1 parent 8e427e5 commit abfa28d

File tree

2 files changed

+19
-4
lines changed

2 files changed

+19
-4
lines changed

netbox/netbox/api/pagination.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,14 @@ def paginate_queryset(self, queryset, request, view=None):
3838

3939
def get_limit(self, request):
4040
if self.limit_query_param:
41+
MAX_PAGE_SIZE = get_config().MAX_PAGE_SIZE
42+
if MAX_PAGE_SIZE:
43+
MAX_PAGE_SIZE = max(MAX_PAGE_SIZE, self.default_limit)
4144
try:
4245
limit = int(request.query_params[self.limit_query_param])
4346
if limit < 0:
4447
raise ValueError()
4548
# Enforce maximum page size, if defined
46-
MAX_PAGE_SIZE = get_config().MAX_PAGE_SIZE
4749
if MAX_PAGE_SIZE:
4850
return MAX_PAGE_SIZE if limit == 0 else min(limit, MAX_PAGE_SIZE)
4951
return limit

netbox/utilities/tests/test_api.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,19 @@ def test_default_page_size(self):
144144
self.assertIsNone(response.data['previous'])
145145
self.assertEqual(len(response.data['results']), page_size)
146146

147+
@override_settings(MAX_PAGE_SIZE=30)
148+
def test_default_page_size_with_small_max_page_size(self):
149+
response = self.client.get(self.url, format='json', **self.header)
150+
page_size = get_config().MAX_PAGE_SIZE
151+
paginate_count = get_config().PAGINATE_COUNT
152+
self.assertLess(page_size, 100, "Default page size not sufficient for data set")
153+
154+
self.assertHttpStatus(response, status.HTTP_200_OK)
155+
self.assertEqual(response.data['count'], 100)
156+
self.assertTrue(response.data['next'].endswith(f'?limit={paginate_count}&offset={paginate_count}'))
157+
self.assertIsNone(response.data['previous'])
158+
self.assertEqual(len(response.data['results']), paginate_count)
159+
147160
def test_custom_page_size(self):
148161
response = self.client.get(f'{self.url}?limit=10', format='json', **self.header)
149162

@@ -153,15 +166,15 @@ def test_custom_page_size(self):
153166
self.assertIsNone(response.data['previous'])
154167
self.assertEqual(len(response.data['results']), 10)
155168

156-
@override_settings(MAX_PAGE_SIZE=20)
169+
@override_settings(MAX_PAGE_SIZE=80)
157170
def test_max_page_size(self):
158171
response = self.client.get(f'{self.url}?limit=0', format='json', **self.header)
159172

160173
self.assertHttpStatus(response, status.HTTP_200_OK)
161174
self.assertEqual(response.data['count'], 100)
162-
self.assertTrue(response.data['next'].endswith('?limit=20&offset=20'))
175+
self.assertTrue(response.data['next'].endswith('?limit=80&offset=80'))
163176
self.assertIsNone(response.data['previous'])
164-
self.assertEqual(len(response.data['results']), 20)
177+
self.assertEqual(len(response.data['results']), 80)
165178

166179
@override_settings(MAX_PAGE_SIZE=0)
167180
def test_max_page_size_disabled(self):

0 commit comments

Comments
 (0)