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
import pytz
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 rest_framework import generics
from acls.models import AccessControlList
from documents.models import Document
from documents.permissions import permission_document_view
from .models import DocumentCheckout
from .permissions import (
permission_document_checkin, permission_document_checkin_override,
permission_document_checkout, permission_document_checkout_detail_view
permission_document_checkout_detail_view
)
from .serializers import (
DocumentCheckoutSerializer, NewDocumentCheckoutSerializer
@@ -56,38 +49,9 @@ class APICheckedoutDocumentListView(generics.ListCreateAPIView):
"""
Checkout a document.
"""
serializer = self.get_serializer(data=request.DATA, files=request.FILES)
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)
return super(
APICheckedoutDocumentListView, self
).post(request, *args, **kwargs)
class APICheckedoutDocumentView(generics.RetrieveDestroyAPIView):

View File

@@ -1,10 +1,15 @@
from __future__ import unicode_literals
from django.utils.translation import ugettext_lazy as _
from rest_framework import serializers
from acls.models import AccessControlList
from documents.models import Document
from documents.serializers import DocumentSerializer
from .models import DocumentCheckout
from .permissions import permission_document_checkout
class DocumentCheckoutSerializer(serializers.ModelSerializer):
@@ -15,7 +20,34 @@ class DocumentCheckoutSerializer(serializers.ModelSerializer):
model = DocumentCheckout
class NewDocumentCheckoutSerializer(serializers.Serializer):
document = serializers.IntegerField()
expiration_datetime = serializers.DateTimeField()
class NewDocumentCheckoutSerializer(serializers.ModelSerializer):
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
)