Update permission variable name from "permission_document_metadata_" to "permission_metadata_". Fix failing tests. Add test for same metadata type mixin. Split metadata add and remove test into test for GET and POST requests. Remove use of urlencode and instead use furl. Simplify view using self.action_count and self.action_id_list. Use ExternalObjectMixin to remove repeated code. Move the repeated code to test for all documents to be of the same type into its own mixin. Signed-off-by: Roberto Rosario <Roberto.Rosario@mayan-edms.com>
255 lines
8.3 KiB
Python
255 lines
8.3 KiB
Python
from __future__ import absolute_import, unicode_literals
|
|
|
|
from django.shortcuts import get_object_or_404
|
|
|
|
from rest_framework import generics
|
|
|
|
from mayan.apps.acls.models import AccessControlList
|
|
from mayan.apps.documents.models import Document, DocumentType
|
|
from mayan.apps.documents.permissions import (
|
|
permission_document_type_view, permission_document_type_edit
|
|
)
|
|
from mayan.apps.rest_api.filters import MayanObjectPermissionsFilter
|
|
from mayan.apps.rest_api.permissions import MayanPermission
|
|
|
|
from .models import MetadataType
|
|
from .permissions import (
|
|
permission_metadata_add, permission_metadata_remove,
|
|
permission_metadata_edit, permission_metadata_view,
|
|
permission_metadata_type_create, permission_metadata_type_delete,
|
|
permission_metadata_type_edit, permission_metadata_type_view
|
|
)
|
|
from .serializers import (
|
|
DocumentMetadataSerializer, DocumentTypeMetadataTypeSerializer,
|
|
MetadataTypeSerializer, NewDocumentMetadataSerializer,
|
|
NewDocumentTypeMetadataTypeSerializer,
|
|
WritableDocumentTypeMetadataTypeSerializer
|
|
)
|
|
|
|
|
|
class APIDocumentMetadataListView(generics.ListCreateAPIView):
|
|
"""
|
|
get: Returns a list of selected document's metadata types and values.
|
|
post: Add an existing metadata type and value to the selected document.
|
|
"""
|
|
def get_document(self):
|
|
if self.request.method == 'GET':
|
|
permission_required = permission_metadata_view
|
|
else:
|
|
permission_required = permission_metadata_add
|
|
|
|
document = get_object_or_404(
|
|
klass=Document, pk=self.kwargs['document_pk']
|
|
)
|
|
|
|
AccessControlList.objects.check_access(
|
|
permissions=permission_required, user=self.request.user,
|
|
obj=document
|
|
)
|
|
|
|
return document
|
|
|
|
def get_queryset(self):
|
|
return self.get_document().metadata.all()
|
|
|
|
def get_serializer(self, *args, **kwargs):
|
|
if not self.request:
|
|
return None
|
|
|
|
return super(APIDocumentMetadataListView, self).get_serializer(*args, **kwargs)
|
|
|
|
def get_serializer_class(self):
|
|
if self.request.method == 'GET':
|
|
return DocumentMetadataSerializer
|
|
else:
|
|
return NewDocumentMetadataSerializer
|
|
|
|
def get_serializer_context(self):
|
|
"""
|
|
Extra context provided to the serializer class.
|
|
"""
|
|
context = super(APIDocumentMetadataListView, self).get_serializer_context()
|
|
if self.kwargs:
|
|
context.update(
|
|
{
|
|
'document': self.get_document(),
|
|
}
|
|
)
|
|
|
|
return context
|
|
|
|
|
|
class APIDocumentMetadataView(generics.RetrieveUpdateDestroyAPIView):
|
|
"""
|
|
delete: Remove this metadata entry from the selected document.
|
|
get: Return the details of the selected document metadata type and value.
|
|
patch: Edit the selected document metadata type and value.
|
|
put: Edit the selected document metadata type and value.
|
|
"""
|
|
lookup_url_kwarg = 'metadata_pk'
|
|
|
|
def get_document(self):
|
|
if self.request.method == 'GET':
|
|
permission_required = permission_metadata_view
|
|
elif self.request.method == 'PUT':
|
|
permission_required = permission_metadata_edit
|
|
elif self.request.method == 'PATCH':
|
|
permission_required = permission_metadata_edit
|
|
elif self.request.method == 'DELETE':
|
|
permission_required = permission_metadata_remove
|
|
|
|
document = get_object_or_404(
|
|
klass=Document, pk=self.kwargs['document_pk']
|
|
)
|
|
|
|
AccessControlList.objects.check_access(
|
|
permissions=permission_required, user=self.request.user,
|
|
obj=document
|
|
)
|
|
|
|
return document
|
|
|
|
def get_queryset(self):
|
|
return self.get_document().metadata.all()
|
|
|
|
def get_serializer(self, *args, **kwargs):
|
|
if not self.request:
|
|
return None
|
|
|
|
return super(APIDocumentMetadataView, self).get_serializer(*args, **kwargs)
|
|
|
|
def get_serializer_class(self):
|
|
if self.request.method == 'GET':
|
|
return DocumentMetadataSerializer
|
|
else:
|
|
return DocumentMetadataSerializer
|
|
|
|
|
|
class APIMetadataTypeListView(generics.ListCreateAPIView):
|
|
"""
|
|
get: Returns a list of all the metadata types.
|
|
post: Create a new metadata type.
|
|
"""
|
|
filter_backends = (MayanObjectPermissionsFilter,)
|
|
mayan_object_permissions = {'GET': (permission_metadata_type_view,)}
|
|
mayan_view_permissions = {'POST': (permission_metadata_type_create,)}
|
|
permission_classes = (MayanPermission,)
|
|
queryset = MetadataType.objects.all()
|
|
serializer_class = MetadataTypeSerializer
|
|
|
|
|
|
class APIMetadataTypeView(generics.RetrieveUpdateDestroyAPIView):
|
|
"""
|
|
delete: Delete the selected metadata type.
|
|
get: Return the details of the selected metadata type.
|
|
patch: Edit the selected metadata type.
|
|
put: Edit the selected metadata type.
|
|
"""
|
|
lookup_url_kwarg = 'metadata_type_pk'
|
|
mayan_object_permissions = {
|
|
'GET': (permission_metadata_type_view,),
|
|
'PUT': (permission_metadata_type_edit,),
|
|
'PATCH': (permission_metadata_type_edit,),
|
|
'DELETE': (permission_metadata_type_delete,)
|
|
}
|
|
permission_classes = (MayanPermission,)
|
|
queryset = MetadataType.objects.all()
|
|
serializer_class = MetadataTypeSerializer
|
|
|
|
|
|
class APIDocumentTypeMetadataTypeListView(generics.ListCreateAPIView):
|
|
"""
|
|
get: Returns a list of selected document type's metadata types.
|
|
post: Add a metadata type to the selected document type.
|
|
"""
|
|
lookup_url_kwarg = 'metadata_type_pk'
|
|
|
|
def get_document_type(self):
|
|
if self.request.method == 'GET':
|
|
permission_required = permission_document_type_view
|
|
else:
|
|
permission_required = permission_document_type_edit
|
|
|
|
document_type = get_object_or_404(
|
|
klass=DocumentType, pk=self.kwargs['document_type_pk']
|
|
)
|
|
|
|
AccessControlList.objects.check_access(
|
|
permissions=permission_required, user=self.request.user,
|
|
obj=document_type
|
|
)
|
|
|
|
return document_type
|
|
|
|
def get_queryset(self):
|
|
return self.get_document_type().metadata.all()
|
|
|
|
def get_serializer(self, *args, **kwargs):
|
|
if not self.request:
|
|
return None
|
|
|
|
return super(APIDocumentTypeMetadataTypeListView, self).get_serializer(*args, **kwargs)
|
|
|
|
def get_serializer_class(self):
|
|
if self.request.method == 'GET':
|
|
return DocumentTypeMetadataTypeSerializer
|
|
else:
|
|
return NewDocumentTypeMetadataTypeSerializer
|
|
|
|
def get_serializer_context(self):
|
|
"""
|
|
Extra context provided to the serializer class.
|
|
"""
|
|
context = super(APIDocumentTypeMetadataTypeListView, self).get_serializer_context()
|
|
if self.kwargs:
|
|
context.update(
|
|
{
|
|
'document_type': self.get_document_type(),
|
|
}
|
|
)
|
|
|
|
return context
|
|
|
|
|
|
class APIDocumentTypeMetadataTypeView(generics.RetrieveUpdateDestroyAPIView):
|
|
"""
|
|
delete: Remove a metadata type from a document type.
|
|
get: Retrieve the details of a document type metadata type.
|
|
patch: Edit the selected document type metadata type.
|
|
put: Edit the selected document type metadata type.
|
|
"""
|
|
lookup_url_kwarg = 'metadata_type_pk'
|
|
serializer_class = DocumentTypeMetadataTypeSerializer
|
|
|
|
def get_document_type(self):
|
|
if self.request.method == 'GET':
|
|
permission_required = permission_document_type_view
|
|
else:
|
|
permission_required = permission_document_type_edit
|
|
|
|
document_type = get_object_or_404(
|
|
klass=DocumentType, pk=self.kwargs['document_type_pk']
|
|
)
|
|
|
|
AccessControlList.objects.check_access(
|
|
permissions=permission_required, user=self.request.user,
|
|
obj=document_type
|
|
)
|
|
|
|
return document_type
|
|
|
|
def get_queryset(self):
|
|
return self.get_document_type().metadata.all()
|
|
|
|
def get_serializer(self, *args, **kwargs):
|
|
if not self.request:
|
|
return None
|
|
|
|
return super(APIDocumentTypeMetadataTypeView, self).get_serializer(*args, **kwargs)
|
|
|
|
def get_serializer_class(self):
|
|
if self.request.method == 'GET':
|
|
return DocumentTypeMetadataTypeSerializer
|
|
else:
|
|
return WritableDocumentTypeMetadataTypeSerializer
|