Files
mayan-edms/mayan/apps/metadata/api_views.py
Roberto Rosario c152156a11 Refactor metadata app API
Signed-off-by: Roberto Rosario <Roberto.Rosario@mayan-edms.com>
2019-03-15 04:49:51 -04:00

161 lines
5.8 KiB
Python

from __future__ import absolute_import, unicode_literals
from rest_framework import status
from rest_framework.decorators import action
from rest_framework.response import Response
from mayan.apps.documents.models import Document
from mayan.apps.documents.permissions import (
permission_document_type_view, permission_document_type_edit,
)
from mayan.apps.rest_api.mixins import ExternalObjectAPIViewSetMixin
from mayan.apps.rest_api.viewsets import (
MayanAPIModelViewSet, MayanRetrieveUpdateAPIViewSet,
)
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 (
DocumentMetadataAddSerializer,
DocumentMetadataSerializer,
MetadataTypeSerializer,
MetadataTypeDocumentTypeRelationSerializer,
MetadataTypeDocumentTypeRelationAddRemoveSerializer,
)
class MetadataTypeDocumentTypeRelationAPIViewSet(ExternalObjectAPIViewSetMixin, MayanRetrieveUpdateAPIViewSet):
external_object_class = MetadataType
external_object_pk_url_kwarg = 'metadata_type_id'
lookup_url_kwarg = 'metadata_type_document_type_relation_id'
object_permission_map = {
'add': permission_metadata_type_edit,
'list': permission_document_type_view,
'partial_update': permission_document_type_edit,
'remove': permission_metadata_type_edit,
'retrieve': permission_document_type_view,
'update': permission_document_type_edit,
}
serializer_class = MetadataTypeDocumentTypeRelationSerializer
def get_external_object_permission(self):
action = getattr(self, 'action', None)
if action is None:
return None
elif action in ['list', 'retrieve']:
return permission_metadata_type_view
else:
return permission_metadata_type_edit
def get_queryset(self):
action = getattr(self, 'action', None)
if action in ['add', 'remove']:
# Return metadata types
return self.get_external_object_queryset()
else:
# Return relations
return self.get_external_object().document_type_relations.all()
@action(
detail=False, lookup_url_kwarg='metadata_type_id', methods=('post',),
serializer_class=MetadataTypeDocumentTypeRelationAddRemoveSerializer,
url_name='add', url_path='add'
)
def add(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.document_type_relations_add(instance=instance)
headers = self.get_success_headers(data=serializer.data)
return Response(
serializer.data, status=status.HTTP_200_OK, headers=headers
)
@action(
detail=False, lookup_url_kwarg='metadata_type_id', methods=('post',),
serializer_class=MetadataTypeDocumentTypeRelationAddRemoveSerializer,
url_name='remove', url_path='remove'
)
def remove(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.document_type_relations_remove(instance=instance)
headers = self.get_success_headers(data=serializer.data)
return Response(
serializer.data, status=status.HTTP_200_OK, headers=headers
)
class MetadataTypeAPIViewSet(MayanAPIModelViewSet):
lookup_url_kwarg = 'metadata_type_id'
object_permission_map = {
'destroy': permission_metadata_type_delete,
'list': permission_metadata_type_view,
'partial_update': permission_metadata_type_edit,
'retrieve': permission_metadata_type_view,
'update': permission_metadata_type_edit,
}
queryset = MetadataType.objects.all()
serializer_class = MetadataTypeSerializer
view_permission_map = {
'create': permission_metadata_type_create
}
class DocumentMetadataAPIViewSet(ExternalObjectAPIViewSetMixin, MayanAPIModelViewSet):
external_object_class = Document
external_object_pk_url_kwarg = 'document_id'
lookup_url_kwarg = 'document_metadata_id'
object_permission_map = {
'list': permission_metadata_view,
'partial_update': permission_metadata_edit,
'destroy': permission_metadata_remove,
'retrieve': permission_metadata_view,
'update': permission_metadata_edit,
}
def get_external_object_permission(self):
action = getattr(self, 'action', None)
if action is None:
return None
elif action == 'create':
return permission_metadata_add
elif action == 'destroy':
return permission_metadata_remove
elif action in ['partial_update', 'update']:
return permission_metadata_edit
else:
return permission_metadata_view
def get_queryset(self):
return self.get_external_object().metadata.all()
def get_serializer_class(self):
action = getattr(self, 'action', None)
if action is None:
return None
if action == 'create':
return DocumentMetadataAddSerializer
else:
return DocumentMetadataSerializer
def get_serializer_context(self):
"""
Extra context provided to the serializer class.
"""
context = super(DocumentMetadataAPIViewSet, self).get_serializer_context()
if self.kwargs:
context.update(
{
'document': self.get_external_object(),
}
)
return context