From 1b0a3cbb7133d1156c4ec0b2a85bd97da5b65d79 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Thu, 23 Oct 2014 11:38:03 -0400 Subject: [PATCH] Improve docstrings of existing metadata API endpoints and add endpoints to view, add and remove metadata types to document types --- mayan/apps/metadata/api_views.py | 118 ++++++++++++++++++++++++++++--- mayan/apps/metadata/urls.py | 6 +- 2 files changed, 112 insertions(+), 12 deletions(-) diff --git a/mayan/apps/metadata/api_views.py b/mayan/apps/metadata/api_views.py index 701cc65786..6e2739790f 100644 --- a/mayan/apps/metadata/api_views.py +++ b/mayan/apps/metadata/api_views.py @@ -3,10 +3,14 @@ from __future__ import absolute_import from django.core.exceptions import PermissionDenied from django.shortcuts import get_object_or_404 -from rest_framework import generics +from rest_framework import generics, status, views +from rest_framework.response import Response from acls.models import AccessEntry -from documents.models import Document +from documents.models import Document, DocumentType +from documents.permissions import (PERMISSION_DOCUMENT_TYPE_VIEW, + PERMISSION_DOCUMENT_TYPE_EDIT) + from permissions.models import Permission from rest_api.filters import MayanObjectPermissionsFilter from rest_api.permissions import MayanPermission @@ -24,10 +28,6 @@ from .serializers import DocumentMetadataSerializer, MetadataTypeSerializer class APIMetadataTypeListView(generics.ListCreateAPIView): - """ - Returns a list of all the metadata type. - """ - serializer_class = MetadataTypeSerializer queryset = MetadataType.objects.all() @@ -36,12 +36,16 @@ class APIMetadataTypeListView(generics.ListCreateAPIView): mayan_object_permissions = {'GET': [PERMISSION_METADATA_TYPE_VIEW]} mayan_view_permissions = {'POST': [PERMISSION_METADATA_TYPE_CREATE]} + def get(self, *args, **kwargs): + """Returns a list of all the metadata types.""" + return super(APIMetadataTypeListView, self).get(*args, **kwargs) + + def post(self, *args, **kwargs): + """Create a new metadata type.""" + return super(APIMetadataTypeListView, self).post(*args, **kwargs) + class APIMetadataTypeView(generics.RetrieveUpdateDestroyAPIView): - """ - Returns the selected metadata type details. - """ - serializer_class = MetadataTypeSerializer queryset = MetadataType.objects.all() @@ -53,6 +57,22 @@ class APIMetadataTypeView(generics.RetrieveUpdateDestroyAPIView): 'DELETE': [PERMISSION_METADATA_TYPE_DELETE] } + def delete(self, *args, **kwargs): + """Delete the selected metadata type.""" + return super(APIMetadataTypeView, self).delete(*args, **kwargs) + + def get(self, *args, **kwargs): + """Return the details of the selected metadata type.""" + return super(APIMetadataTypeView, self).get(*args, **kwargs) + + def patch(self, *args, **kwargs): + """Edit the selected metadata type.""" + return super(APIMetadataTypeView, self).patch(*args, **kwargs) + + def put(self, *args, **kwargs): + """Edit the selected metadata type.""" + return super(APIMetadataTypeView, self).put(*args, **kwargs) + class APIDocumentMetadataListView(generics.ListCreateAPIView): """ @@ -65,7 +85,7 @@ class APIDocumentMetadataListView(generics.ListCreateAPIView): mayan_view_permissions = {'POST': [PERMISSION_METADATA_DOCUMENT_ADD]} def get_queryset(self): - document = get_object_or_404(Document, pk=self.kwargs['pk']) + document = get_object_or_404(Document, pk=self.kwargs['document_pk']) try: Permission.objects.check_permissions(self.request.user, [PERMISSION_METADATA_DOCUMENT_VIEW]) except PermissionDenied: @@ -74,6 +94,14 @@ class APIDocumentMetadataListView(generics.ListCreateAPIView): queryset = document.metadata.all() return queryset + def get(self, *args, **kwargs): + """Returns a list of selected document's metadata types and values.""" + return super(APIDocumentMetadataListView, self).get(*args, **kwargs) + + def post(self, *args, **kwargs): + """Add an existing metadata type and value to the selected document.""" + return super(APIDocumentMetadataListView, self).post(*args, **kwargs) + class APIDocumentMetadataView(generics.RetrieveUpdateDestroyAPIView): """ @@ -90,3 +118,71 @@ class APIDocumentMetadataView(generics.RetrieveUpdateDestroyAPIView): 'PATCH': [PERMISSION_METADATA_DOCUMENT_EDIT], 'DELETE': [PERMISSION_METADATA_DOCUMENT_REMOVE] } + + def delete(self, *args, **kwargs): + """Delete the selected document metadata type and value.""" + return super(APIDocumentMetadataView, self).delete(*args, **kwargs) + + def get(self, *args, **kwargs): + """Return the details of the selected document metadata type and value.""" + return super(APIDocumentMetadataView, self).get(*args, **kwargs) + + def patch(self, *args, **kwargs): + """Edit the selected document metadata type and value.""" + return super(APIDocumentMetadataView, self).patch(*args, **kwargs) + + def put(self, *args, **kwargs): + """Edit the selected document metadata type and value.""" + return super(APIDocumentMetadataView, self).put(*args, **kwargs) + + +class APIDocumentTypeMetadataTypeListView(generics.ListAPIView): + serializer_class = MetadataTypeSerializer + permission_classes = (MayanPermission,) + + mayan_view_permissions = {'POST': [PERMISSION_DOCUMENT_TYPE_EDIT]} + + def get_queryset(self): + document_type = get_object_or_404(DocumentType, pk=self.kwargs['document_type_pk']) + try: + Permission.objects.check_permissions(self.request.user, [PERMISSION_DOCUMENT_TYPE_VIEW]) + except PermissionDenied: + AccessEntry.objects.check_access(PERMISSION_DOCUMENT_TYPE_VIEW, self.request.user, document_type) + + return document_type.metadata.all() + + def get(self, *args, **kwargs): + """Returns a list of selected document type allowed metadata types.""" + return super(APIDocumentTypeMetadataTypeListView, self).get(*args, **kwargs) + + +class APIDocumentTypeMetadataTypeView(views.APIView): + def delete(self, request, *args, **kwargs): + """ + Remove a metadata type from a document type. + """ + + document_type = get_object_or_404(DocumentType, pk=self.kwargs['document_type_pk']) + try: + Permission.objects.check_permissions(self.request.user, [PERMISSION_DOCUMENT_TYPE_EDIT]) + except PermissionDenied: + AccessEntry.objects.check_access(PERMISSION_DOCUMENT_TYPE_EDIT, self.request.user, document_type) + + metadata_type = get_object_or_404(MetadataType, pk=self.kwargs['metadata_type_pk']) + document_type.metadata.remove(metadata_type) + return Response(status=status.HTTP_204_NO_CONTENT) + + def post(self, request, *args, **kwargs): + """ + Add a metadata type to a document type. + """ + + document_type = get_object_or_404(DocumentType, pk=self.kwargs['document_type_pk']) + try: + Permission.objects.check_permissions(self.request.user, [PERMISSION_DOCUMENT_TYPE_EDIT]) + except PermissionDenied: + AccessEntry.objects.check_access(PERMISSION_DOCUMENT_TYPE_EDIT, self.request.user, document_type) + + metadata_type = get_object_or_404(MetadataType, pk=self.kwargs['metadata_type_pk']) + document_type.metadata.add(metadata_type) + return Response(status=status.HTTP_201_CREATED) diff --git a/mayan/apps/metadata/urls.py b/mayan/apps/metadata/urls.py index 12071cd75c..49f8131d74 100644 --- a/mayan/apps/metadata/urls.py +++ b/mayan/apps/metadata/urls.py @@ -1,6 +1,8 @@ from django.conf.urls import patterns, url from .api_views import (APIDocumentMetadataListView, APIDocumentMetadataView, + APIDocumentTypeMetadataTypeListView, + APIDocumentTypeMetadataTypeView, APIMetadataTypeListView, APIMetadataTypeView) urlpatterns = patterns('metadata.views', @@ -23,6 +25,8 @@ urlpatterns = patterns('metadata.views', api_urls = patterns('', url(r'^metadatatypes/$', APIMetadataTypeListView.as_view(), name='metadatatype-list'), url(r'^metadatatypes/(?P[0-9]+)/$', APIMetadataTypeView.as_view(), name='metadatatype-detail'), - url(r'^document/(?P[0-9]+)/metadata/$', APIDocumentMetadataListView.as_view(), name='documentmetadata-list'), + url(r'^document/(?P[0-9]+)/metadata/$', APIDocumentMetadataListView.as_view(), name='documentmetadata-list'), url(r'^document/(?P[0-9]+)/metadata/(?P[0-9]+)/$', APIDocumentMetadataView.as_view(), name='documentmetadata-detail'), + url(r'^document_type/(?P[0-9]+)/metadatatypes/$', APIDocumentTypeMetadataTypeListView.as_view(), name='documenttypemetadatatype-list'), + url(r'^document_type/(?P[0-9]+)/metadatatypes/(?P[0-9]+)/$', APIDocumentTypeMetadataTypeView.as_view(), name='documenttypemetadatatype-detail'), )