Fix and modernize the document checkout API view. Move API logic to serializer.

Signed-off-by: Michael Price <loneviking72@gmail.com>
This commit is contained in:
Michael Price
2018-03-05 01:00:10 -04:00
committed by Roberto Rosario
parent 3165912837
commit 55ba6786b3
2 changed files with 40 additions and 44 deletions

View File

@@ -1,21 +1,14 @@
from __future__ import absolute_import, unicode_literals from __future__ import absolute_import, unicode_literals
import pytz from rest_framework import generics
from django.shortcuts import get_object_or_404
from django.utils.encoding import force_text
from rest_framework import generics, status
from rest_framework.response import Response
from acls.models import AccessControlList from acls.models import AccessControlList
from documents.models import Document
from documents.permissions import permission_document_view from documents.permissions import permission_document_view
from .models import DocumentCheckout from .models import DocumentCheckout
from .permissions import ( from .permissions import (
permission_document_checkin, permission_document_checkin_override, permission_document_checkin, permission_document_checkin_override,
permission_document_checkout, permission_document_checkout_detail_view permission_document_checkout_detail_view
) )
from .serializers import ( from .serializers import (
DocumentCheckoutSerializer, NewDocumentCheckoutSerializer DocumentCheckoutSerializer, NewDocumentCheckoutSerializer
@@ -56,38 +49,9 @@ class APICheckedoutDocumentListView(generics.ListCreateAPIView):
""" """
Checkout a document. Checkout a document.
""" """
return super(
serializer = self.get_serializer(data=request.DATA, files=request.FILES) APICheckedoutDocumentListView, self
).post(request, *args, **kwargs)
if serializer.is_valid():
document = get_object_or_404(
Document, pk=serializer.data['document']
)
AccessControlList.objects.check_access(
permissions=permission_document_checkout, user=request.user,
obj=document
)
timezone = pytz.utc
try:
DocumentCheckout.objects.create(
document=document,
expiration_datetime=timezone.localize(
serializer.data['expiration_datetime']
),
user=request.user,
block_new_version=serializer.data['block_new_version']
)
except Exception as exception:
return Response(
data={'exception': force_text(exception)},
status=status.HTTP_400_BAD_REQUEST
)
return Response(status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class APICheckedoutDocumentView(generics.RetrieveDestroyAPIView): class APICheckedoutDocumentView(generics.RetrieveDestroyAPIView):

View File

@@ -1,10 +1,15 @@
from __future__ import unicode_literals from __future__ import unicode_literals
from django.utils.translation import ugettext_lazy as _
from rest_framework import serializers from rest_framework import serializers
from acls.models import AccessControlList
from documents.models import Document
from documents.serializers import DocumentSerializer from documents.serializers import DocumentSerializer
from .models import DocumentCheckout from .models import DocumentCheckout
from .permissions import permission_document_checkout
class DocumentCheckoutSerializer(serializers.ModelSerializer): class DocumentCheckoutSerializer(serializers.ModelSerializer):
@@ -15,7 +20,34 @@ class DocumentCheckoutSerializer(serializers.ModelSerializer):
model = DocumentCheckout model = DocumentCheckout
class NewDocumentCheckoutSerializer(serializers.Serializer): class NewDocumentCheckoutSerializer(serializers.ModelSerializer):
document = serializers.IntegerField()
expiration_datetime = serializers.DateTimeField()
block_new_version = serializers.BooleanField() block_new_version = serializers.BooleanField()
document_pk = serializers.IntegerField(
help_text=_('Primary key of the document to be checked out.'),
write_only=True
)
expiration_datetime = serializers.DateTimeField()
class Meta:
fields = (
'block_new_version', 'document', 'document_pk',
'expiration_datetime', 'id'
)
model = DocumentCheckout
read_only_fields = ('document',)
write_only_fields = ('document_pk',)
def create(self, validated_data):
document = Document.objects.get(pk=validated_data.pop('document_pk'))
AccessControlList.objects.check_access(
permissions=permission_document_checkout,
user=self.context['request'].user, obj=document
)
validated_data['document'] = document
validated_data['user'] = self.context['request'].user
return super(NewDocumentCheckoutSerializer, self).create(
validated_data
)