Make sure to always return fresh stokens.

This commit is contained in:
Tom Hacohen 2020-05-26 18:14:39 +03:00
parent fce844bfc3
commit 3cdb7783fe
2 changed files with 32 additions and 6 deletions

View File

@ -44,7 +44,7 @@ class Collection(models.Model):
def content(self): def content(self):
return self.main_item.content return self.main_item.content
@cached_property @property
def stoken(self): def stoken(self):
return self.main_item.stoken return self.main_item.stoken
@ -75,7 +75,7 @@ class CollectionItem(models.Model):
def content(self): def content(self):
return self.revisions.get(current=True) return self.revisions.get(current=True)
@cached_property @property
def stoken(self): def stoken(self):
return self.content.uid return self.content.uid

View File

@ -59,6 +59,24 @@ from .serializers import (
User = get_user_model() User = get_user_model()
def get_fresh_stoken(obj):
try:
del obj.main_item
except AttributeError:
pass
return obj.stoken
def get_fresh_item_stoken(obj):
try:
del obj.content
except AttributeError:
pass
return obj.stoken
class BaseViewSet(viewsets.ModelViewSet): class BaseViewSet(viewsets.ModelViewSet):
authentication_classes = tuple(app_settings.API_AUTHENTICATORS) authentication_classes = tuple(app_settings.API_AUTHENTICATORS)
permission_classes = tuple(app_settings.API_PERMISSIONS) permission_classes = tuple(app_settings.API_PERMISSIONS)
@ -141,16 +159,24 @@ class CollectionViewSet(BaseViewSet):
def partial_update(self, request, uid=None): def partial_update(self, request, uid=None):
return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED) return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)
def update(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(instance, data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
return Response({'stoken': get_fresh_stoken(instance)})
def create(self, request, *args, **kwargs): def create(self, request, *args, **kwargs):
serializer = self.serializer_class(data=request.data, context=self.get_serializer_context()) serializer = self.serializer_class(data=request.data, context=self.get_serializer_context())
if serializer.is_valid(): if serializer.is_valid():
try: try:
serializer.save(owner=self.request.user) instance = serializer.save(owner=self.request.user)
except IntegrityError: except IntegrityError:
content = {'code': 'integrity_error'} content = {'code': 'integrity_error'}
return Response(content, status=status.HTTP_400_BAD_REQUEST) return Response(content, status=status.HTTP_400_BAD_REQUEST)
return Response({}, status=status.HTTP_201_CREATED) return Response({'stoken': get_fresh_stoken(instance)}, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
@ -304,7 +330,7 @@ class CollectionItemViewSet(BaseViewSet):
return Response(content, status=status.HTTP_400_BAD_REQUEST) return Response(content, status=status.HTTP_400_BAD_REQUEST)
ret = { ret = {
"data": [item.stoken for item in items], "data": [get_fresh_item_stoken(item) for item in items],
} }
return Response(ret, status=status.HTTP_200_OK) return Response(ret, status=status.HTTP_200_OK)
@ -343,7 +369,7 @@ class CollectionItemViewSet(BaseViewSet):
return Response(content, status=status.HTTP_400_BAD_REQUEST) return Response(content, status=status.HTTP_400_BAD_REQUEST)
ret = { ret = {
"data": [item.stoken for item in items], "data": [get_fresh_item_stoken(item) for item in items],
} }
return Response(ret, status=status.HTTP_200_OK) return Response(ret, status=status.HTTP_200_OK)