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): class FunkwhalePagination(PageNumberPagination):
page_size_query_param = "page_size" 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): ...@@ -524,6 +524,7 @@ class LicenseViewSet(viewsets.ReadOnlyModelViewSet):
serializer_class = serializers.LicenseSerializer serializer_class = serializers.LicenseSerializer
queryset = models.License.objects.all().order_by("code") queryset = models.License.objects.all().order_by("code")
lookup_value_regex = ".*" lookup_value_regex = ".*"
max_page_size = 1000
def get_queryset(self): def get_queryset(self):
# ensure our licenses are up to date in DB # 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): ...@@ -612,7 +612,7 @@ def test_list_licenses(api_client, preferences, mocker):
expected = [ expected = [
serializers.LicenseSerializer(l.conf).data 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") url = reverse("api:v1:licenses-list")
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment