Files
awx/awx/api/pagination.py
Vismay Golwala f4dc4d5849 Cap page_size in pagination urls
Currently, even with a `max_page_size` of n, we can see urls
formed in pagination with `page_size` > n. API still caps the
number of results it returns, but the URL remain invalid there.
This is a bit messy solution to make string replacement in URL
if the query param exceeds `max_page_size`

Signed-off-by: Vismay Golwala <vgolwala@redhat.com>
2019-04-18 11:39:22 -04:00

42 lines
1.5 KiB
Python

# Copyright (c) 2015 Ansible, Inc.
# All Rights Reserved.
# Django REST Framework
from django.conf import settings
from rest_framework import pagination
from rest_framework.utils.urls import replace_query_param
class Pagination(pagination.PageNumberPagination):
page_size_query_param = 'page_size'
max_page_size = settings.MAX_PAGE_SIZE
def get_next_link(self):
if not self.page.has_next():
return None
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(self.cap_page_size(url), self.page_query_param, page_number)
def get_previous_link(self):
if not self.page.has_previous():
return None
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(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