Skip to content
Snippets Groups Projects
Verified Commit a3ad476c authored by Eliot Berriot's avatar Eliot Berriot
Browse files

More configurable pagination

parent b36b0338
No related branches found
No related tags found
No related merge requests found
from rest_framework.pagination import PageNumberPagination
from rest_framework.pagination import PageNumberPagination, _positive_int
class FunkwhalePagination(PageNumberPagination):
page_size_query_param = "page_size"
max_page_size = 50
default_max_page_size = 50
default_page_size = None
view = None
def paginate_queryset(self, queryset, request, view=None):
self.view = view
return super().paginate_queryset(queryset, request, view)
def get_page_size(self, request):
max_page_size = (
getattr(self.view, "max_page_size", 0) or self.default_max_page_size
)
page_size = getattr(self.view, "default_page_size", 0) or max_page_size
if self.page_size_query_param:
try:
return _positive_int(
request.query_params[self.page_size_query_param],
strict=True,
cutoff=max_page_size,
)
except (KeyError, ValueError):
pass
return page_size
......@@ -524,6 +524,7 @@ class LicenseViewSet(viewsets.ReadOnlyModelViewSet):
serializer_class = serializers.LicenseSerializer
queryset = models.License.objects.all().order_by("code")
lookup_value_regex = ".*"
max_page_size = 1000
def get_queryset(self):
# ensure our licenses are up to date in DB
......
import pytest
from funkwhale_api.common import pagination
@pytest.mark.parametrize(
"view_max_page_size, view_default_page_size, request_page_size, expected",
[
(50, 50, None, 50),
(50, 25, None, 25),
(25, None, None, 25),
(50, 25, 100, 50),
(50, None, 100, 50),
(50, 25, 33, 33),
],
)
def test_funkwhale_pagination_uses_view_page_size(
view_max_page_size, view_default_page_size, request_page_size, expected, mocker
):
p = pagination.FunkwhalePagination()
p.view = mocker.Mock(
max_page_size=view_max_page_size, default_page_size=view_default_page_size
)
query = {}
if request_page_size:
query["page_size"] = request_page_size
request = mocker.Mock(query_params=query)
assert p.get_page_size(request) == expected
......@@ -612,7 +612,7 @@ def test_list_licenses(api_client, preferences, mocker):
expected = [
serializers.LicenseSerializer(l.conf).data
for l in models.License.objects.order_by("code")[:25]
for l in models.License.objects.order_by("code")
]
url = reverse("api:v1:licenses-list")
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment