53 lines
1.6 KiB
Python
53 lines
1.6 KiB
Python
from collections import OrderedDict
|
|
|
|
from django.conf import settings
|
|
from rest_framework.pagination import BasePagination
|
|
from rest_framework.response import Response
|
|
|
|
from .utils import BadRequestError
|
|
|
|
|
|
class WagtailPagination(BasePagination):
|
|
def paginate_queryset(self, queryset, request, view=None):
|
|
limit_max = getattr(settings, "WAGTAILAPI_LIMIT_MAX", 20)
|
|
|
|
try:
|
|
offset = int(request.GET.get("offset", 0))
|
|
if offset < 0:
|
|
raise ValueError()
|
|
except ValueError:
|
|
raise BadRequestError("offset must be a positive integer")
|
|
|
|
try:
|
|
limit_default = 20 if not limit_max else min(20, limit_max)
|
|
limit = int(request.GET.get("limit", limit_default))
|
|
if limit < 0:
|
|
raise ValueError()
|
|
except ValueError:
|
|
raise BadRequestError("limit must be a positive integer")
|
|
|
|
if limit_max and limit > limit_max:
|
|
raise BadRequestError("limit cannot be higher than %d" % limit_max)
|
|
|
|
start = offset
|
|
stop = offset + limit
|
|
|
|
self.view = view
|
|
self.total_count = queryset.count()
|
|
return queryset[start:stop]
|
|
|
|
def get_paginated_response(self, data):
|
|
data = OrderedDict(
|
|
[
|
|
(
|
|
"meta",
|
|
OrderedDict(
|
|
[
|
|
("total_count", self.total_count),
|
|
]
|
|
),
|
|
),
|
|
("items", data),
|
|
]
|
|
)
|
|
return Response(data)
|