Merge pull request #3664 from vismay-golwala/pagination_cap_api

Cap page_size in pagination urls

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
This commit is contained in:
softwarefactory-project-zuul[bot] 2019-04-26 17:55:51 +00:00 committed by GitHub
commit c707e60bde
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 35 additions and 2 deletions

View File

@ -18,7 +18,7 @@ class Pagination(pagination.PageNumberPagination):
url = self.request and self.request.get_full_path() or ''
url = url.encode('utf-8')
page_number = self.page.next_page_number()
return replace_query_param(url, self.page_query_param, page_number)
return replace_query_param(self.cap_page_size(url), self.page_query_param, page_number)
def get_previous_link(self):
if not self.page.has_previous():
@ -26,4 +26,16 @@ class Pagination(pagination.PageNumberPagination):
url = self.request and self.request.get_full_path() or ''
url = url.encode('utf-8')
page_number = self.page.previous_page_number()
return replace_query_param(url, self.page_query_param, page_number)
return replace_query_param(self.cap_page_size(url), self.page_query_param, page_number)
def cap_page_size(self, url):
if int(self.request.query_params.get(self.page_size_query_param, 0)) > self.max_page_size:
url = replace_query_param(url, self.page_size_query_param, self.max_page_size)
return url
def get_html_context(self):
context = super().get_html_context()
context['page_links'] = [pl._replace(url=self.cap_page_size(pl.url))
for pl in context['page_links']]
return context

View File

@ -1,7 +1,11 @@
import pytest
import json
from unittest.mock import patch
from urllib.parse import urlencode
from awx.main.models.inventory import Group, Host
from awx.api.pagination import Pagination
from awx.api.versioning import reverse
@pytest.fixture
@ -38,3 +42,20 @@ def test_pagination_backend_output_correct_total_count(group, host):
p = Pagination().django_paginator_class(queryset, 10)
p.page(1)
assert p.count == 1
@pytest.mark.django_db
def test_pagination_cap_page_size(get, admin, inventory):
for i in range(20):
Host(name='host-{}'.format(i), inventory=inventory).save()
def host_list_url(params):
request_qs = '?' + urlencode(params)
return reverse('api:host_list', kwargs={'version': 'v2'}) + request_qs
with patch('awx.api.pagination.Pagination.max_page_size', 5):
resp = get(host_list_url({'page': '2', 'page_size': '10'}), user=admin)
jdata = json.loads(resp.content)
assert jdata['previous'] == host_list_url({'page': '1', 'page_size': '5'})
assert jdata['next'] == host_list_url({'page': '3', 'page_size': '5'})