From 7183b975419096401910d53ba622888e0879bdf2 Mon Sep 17 00:00:00 2001 From: Tom Hacohen Date: Tue, 23 Jun 2020 18:25:23 +0300 Subject: [PATCH] Collection revision: implement iteration. --- django_etebase/views.py | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/django_etebase/views.py b/django_etebase/views.py index f44ff5c..0e153a4 100644 --- a/django_etebase/views.py +++ b/django_etebase/views.py @@ -271,15 +271,30 @@ class CollectionItemViewSet(BaseViewSet): @action_decorator(detail=True, methods=['GET']) def revision(self, request, collection_uid=None, uid=None): - # FIXME: need pagination support col = get_object_or_404(self.get_collection_queryset(Collection.objects), main_item__uid=collection_uid) - col_it = get_object_or_404(col.items, uid=uid) + item = get_object_or_404(col.items, uid=uid) + + limit = int(request.GET.get('limit', 50)) + iterator = request.GET.get('iterator', None) + + queryset = item.revisions.exclude(current=True).order_by('-id') + + if iterator is not None: + iterator = get_object_or_404(queryset, uid=iterator) + queryset = queryset.filter(id__lt=iterator.id) + + queryset = queryset[:limit] + serializer = CollectionItemRevisionSerializer(queryset, many=True) + + # This is not the most efficient way of implementing this, but it's good enough + done = len(queryset) < limit + + last_item = len(queryset) > 0 and serializer.data[-1] - revisions = col_it.revisions.exclude(current=True).order_by('-id') - serializer = CollectionItemRevisionSerializer(revisions, many=True) ret = { 'data': serializer.data, - 'done': True, # we always return all the items, so it's always done + 'iterator': last_item and last_item['uid'], + 'done': done, } return Response(ret)