Files
mayan-edms/mayan/apps/metadata/api_views.py
Roberto Rosario 8e69178e07 Project: Switch to full app paths
Instead of inserting the path of the apps into the Python app,
the apps are now referenced by their full import path.

This app name claves with external or native Python libraries.
Example: Mayan statistics app vs. Python new statistics library.

Every app reference is now prepended with 'mayan.apps'.

Existing config.yml files need to be updated manually.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2018-12-05 02:04:20 -04:00

255 lines
8.4 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_document_add, permission_metadata_document_remove,
permission_metadata_document_edit, permission_metadata_document_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_document_view
else:
permission_required = permission_metadata_document_add
document = get_object_or_404(
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_document_view
elif self.request.method == 'PUT':
permission_required = permission_metadata_document_edit
elif self.request.method == 'PATCH':
permission_required = permission_metadata_document_edit
elif self.request.method == 'DELETE':
permission_required = permission_metadata_document_remove
document = get_object_or_404(
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(
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(
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