More configurable pagination

merge-requests/757/head
Eliot Berriot 2019-04-09 10:30:26 +02:00
rodzic b36b03383e
commit a3ad476c88
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: DD6965E2476E5C27
4 zmienionych plików z 56 dodań i 3 usunięć

Wyświetl plik

@ -1,6 +1,29 @@
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

Wyświetl plik

@ -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

Wyświetl plik

@ -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

Wyświetl plik

@ -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")