More configurable pagination
This commit is contained in:
parent
b36b03383e
commit
a3ad476c88
|
@ -1,6 +1,29 @@
|
||||||
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):
|
||||||
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
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
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 = [
|
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")
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue