Collection items: add a transaction endpoint.

This commit is contained in:
Tom Hacohen 2020-04-19 17:32:40 +03:00
parent d66d0640dc
commit df0f7d134d
2 changed files with 34 additions and 1 deletions

View File

@ -71,6 +71,10 @@ class CollectionItem(models.Model):
def content(self): def content(self):
return self.revisions.get(current=True) return self.revisions.get(current=True)
@cached_property
def stoken(self):
return self.content.uid
def chunk_directory_path(instance, filename): def chunk_directory_path(instance, filename):
item = instance.item item = instance.item

View File

@ -14,7 +14,7 @@
from django.conf import settings from django.conf import settings
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.db import IntegrityError from django.db import transaction, IntegrityError
from django.db.models import Max from django.db.models import Max
from django.http import HttpResponseBadRequest, HttpResponse, Http404 from django.http import HttpResponseBadRequest, HttpResponse, Http404
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
@ -215,6 +215,35 @@ class CollectionItemViewSet(BaseViewSet):
} }
return Response(ret, headers={'X-EteSync-SToken': new_stoken}) return Response(ret, headers={'X-EteSync-SToken': new_stoken})
@action_decorator(detail=False, methods=['POST'])
def transaction(self, request, collection_uid=None):
collection_object = get_object_or_404(self.get_collection_queryset(Collection.objects), uid=collection_uid)
items = request.data.get('items')
# FIXME: deps should actually be just pairs of uid and stoken
deps = request.data.get('deps', None)
serializer = self.get_serializer_class()(data=items, context=self.get_serializer_context(), many=True)
deps_serializer = self.get_serializer_class()(data=deps, context=self.get_serializer_context(), many=True)
if serializer.is_valid() and (deps is None or deps_serializer.is_valid()):
try:
with transaction.atomic():
collections = serializer.save(collection=collection_object)
except IntegrityError:
content = {'code': 'integrity_error'}
return Response(content, status=status.HTTP_400_BAD_REQUEST)
ret = {
"data": [collection.stoken for collection in collections],
}
return Response(ret, status=status.HTTP_201_CREATED)
return Response(
{
"items": serializer.errors,
"deps": deps_serializer.errors if deps is not None else [],
},
status=status.HTTP_400_BAD_REQUEST)
class CollectionItemChunkViewSet(viewsets.ViewSet): class CollectionItemChunkViewSet(viewsets.ViewSet):
allowed_methods = ['GET', 'POST'] allowed_methods = ['GET', 'POST']