From a85b3b15260a8b791c38a29f50ece9a4fa696e43 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Tue, 7 Oct 2014 08:57:37 -0400 Subject: [PATCH] Add metadata app API endpoints --- mayan/apps/metadata/__init__.py | 23 +++++--- mayan/apps/metadata/api_views.py | 92 ++++++++++++++++++++++++++++++ mayan/apps/metadata/serializers.py | 17 ++++++ mayan/apps/metadata/urls.py | 10 ++++ mayan/apps/metadata/views.py | 31 +++++----- 5 files changed, 151 insertions(+), 22 deletions(-) create mode 100644 mayan/apps/metadata/api_views.py create mode 100644 mayan/apps/metadata/serializers.py diff --git a/mayan/apps/metadata/__init__.py b/mayan/apps/metadata/__init__.py index fecd030fc0..5fc4acaf0c 100644 --- a/mayan/apps/metadata/__init__.py +++ b/mayan/apps/metadata/__init__.py @@ -8,6 +8,7 @@ from documents.models import Document, DocumentType from navigation.api import (register_links, register_multi_item_links, register_sidebar_template, register_model_list_columns) from project_setup.api import register_setup +from rest_api.classes import APIEndPoint from .api import get_metadata_string from .links import (metadata_edit, metadata_view, metadata_multiple_edit, @@ -16,10 +17,12 @@ from .links import (metadata_edit, metadata_view, metadata_multiple_edit, setup_metadata_type_create, setup_metadata_set_list, setup_metadata_set_edit, setup_metadata_set_members, setup_metadata_set_delete, setup_metadata_set_create, setup_document_type_metadata) -from .models import MetadataType, MetadataSet -from .permissions import (PERMISSION_METADATA_DOCUMENT_EDIT, - PERMISSION_METADATA_DOCUMENT_ADD, PERMISSION_METADATA_DOCUMENT_REMOVE, - PERMISSION_METADATA_DOCUMENT_VIEW) +from .models import MetadataSet, MetadataType +from .permissions import (PERMISSION_METADATA_DOCUMENT_ADD, + PERMISSION_METADATA_DOCUMENT_EDIT, + PERMISSION_METADATA_DOCUMENT_REMOVE, + PERMISSION_METADATA_DOCUMENT_VIEW) +from .urls import api_urls register_links(['metadata:metadata_add', 'metadata:metadata_edit', 'metadata:metadata_remove', 'metadata:metadata_view'], [metadata_add, metadata_edit, metadata_remove], menu_name='sidebar') register_links(Document, [metadata_view], menu_name='form_header') @@ -36,14 +39,12 @@ register_links(DocumentType, [setup_document_type_metadata]) register_sidebar_template(['metadata:setup_metadata_type_list'], 'metadata_type_help.html') register_sidebar_template(['metadata:setup_metadata_set_list'], 'metadata_set_help.html') -register_setup(setup_metadata_type_list) register_setup(setup_metadata_set_list) +register_setup(setup_metadata_type_list) class_permissions(Document, [ - PERMISSION_METADATA_DOCUMENT_EDIT, - PERMISSION_METADATA_DOCUMENT_ADD, - PERMISSION_METADATA_DOCUMENT_REMOVE, - PERMISSION_METADATA_DOCUMENT_VIEW, + PERMISSION_METADATA_DOCUMENT_ADD, PERMISSION_METADATA_DOCUMENT_EDIT, + PERMISSION_METADATA_DOCUMENT_REMOVE, PERMISSION_METADATA_DOCUMENT_VIEW, ]) register_model_list_columns(Document, [ @@ -51,3 +52,7 @@ register_model_list_columns(Document, [ 'name': _(u'Metadata'), 'attribute': encapsulate(lambda x: get_metadata_string(x)) }, ]) + +endpoint = APIEndPoint('metadata') +endpoint.register_urls(api_urls) +endpoint.add_endpoint('metadatatype-list', _(u'Returns a list of all the metadata types.')) diff --git a/mayan/apps/metadata/api_views.py b/mayan/apps/metadata/api_views.py new file mode 100644 index 0000000000..2ac1a2be78 --- /dev/null +++ b/mayan/apps/metadata/api_views.py @@ -0,0 +1,92 @@ +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 documents.models import Document +from documents.permissions import PERMISSION_DOCUMENT_VIEW +from permissions.models import Permission +from rest_api.filters import MayanObjectPermissionsFilter +from rest_api.permissions import MayanPermission + +from .models import DocumentMetadata, 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, MetadataTypeSerializer + + +class APIMetadataTypeListView(generics.ListCreateAPIView): + """ + Returns a list of all the metadata type. + """ + + serializer_class = MetadataTypeSerializer + queryset = MetadataType.objects.all() + + permission_classes = (MayanPermission,) + filter_backends = (MayanObjectPermissionsFilter,) + mayan_object_permissions = {'GET': [PERMISSION_METADATA_TYPE_VIEW]} + mayan_view_permissions = {'POST': [PERMISSION_METADATA_TYPE_CREATE]} + + +class APIMetadataTypeView(generics.RetrieveUpdateDestroyAPIView): + """ + Returns the selected metadata type details. + """ + + serializer_class = MetadataTypeSerializer + queryset = MetadataType.objects.all() + + permission_classes = (MayanPermission,) + mayan_object_permissions = { + 'GET': [PERMISSION_METADATA_TYPE_VIEW], + 'PUT': [PERMISSION_METADATA_TYPE_EDIT], + 'PATCH': [PERMISSION_METADATA_TYPE_EDIT], + 'DELETE': [PERMISSION_METADATA_TYPE_DELETE] + } + + +class APIDocumentMetadataListView(generics.ListCreateAPIView): + """ + Returns a list of all the metadata of a document. + """ + + serializer_class = DocumentMetadataSerializer + permission_classes = (MayanPermission,) + + mayan_view_permissions = {'POST': [PERMISSION_METADATA_DOCUMENT_ADD]} + + def get_queryset(self): + document = get_object_or_404(Document, pk=self.kwargs['pk']) + try: + Permission.objects.check_permissions(self.request.user, [PERMISSION_METADATA_DOCUMENT_VIEW]) + except PermissionDenied: + AccessEntry.objects.check_access(PERMISSION_METADATA_DOCUMENT_VIEW, self.request.user, document) + + queryset = document.metadata.all() + return queryset + + +class APIDocumentMetadataView(generics.RetrieveUpdateDestroyAPIView): + """ + Returns the selected document metadata details. + """ + + serializer_class = DocumentMetadataSerializer + queryset = DocumentMetadata.objects.all() + + permission_classes = (MayanPermission,) + mayan_object_permissions = { + 'GET': [PERMISSION_METADATA_DOCUMENT_VIEW], + 'PUT': [PERMISSION_METADATA_DOCUMENT_EDIT], + 'PATCH': [PERMISSION_METADATA_DOCUMENT_EDIT], + 'DELETE': [PERMISSION_METADATA_DOCUMENT_REMOVE] + } diff --git a/mayan/apps/metadata/serializers.py b/mayan/apps/metadata/serializers.py new file mode 100644 index 0000000000..33fbba40d2 --- /dev/null +++ b/mayan/apps/metadata/serializers.py @@ -0,0 +1,17 @@ +from __future__ import absolute_import + +from rest_framework import serializers + +from .models import DocumentMetadata, MetadataType + + +class MetadataTypeSerializer(serializers.ModelSerializer): + class Meta: + fields = ('id', 'name', 'title', 'default', 'lookup') + model = MetadataType + + +class DocumentMetadataSerializer(serializers.ModelSerializer): + class Meta: + fields = ('id', 'document', 'metadata_type', 'value') + model = DocumentMetadata diff --git a/mayan/apps/metadata/urls.py b/mayan/apps/metadata/urls.py index f3f7557e2f..8fc460f0be 100644 --- a/mayan/apps/metadata/urls.py +++ b/mayan/apps/metadata/urls.py @@ -1,5 +1,8 @@ from django.conf.urls import patterns, url +from .api_views import (APIDocumentMetadataListView, APIDocumentMetadataView, + APIMetadataTypeListView, APIMetadataTypeView) + urlpatterns = patterns('metadata.views', url(r'^(?P\d+)/edit/$', 'metadata_edit', (), 'metadata_edit'), url(r'^(?P\d+)/view/$', 'metadata_view', (), 'metadata_view'), @@ -22,3 +25,10 @@ urlpatterns = patterns('metadata.views', url(r'^setup/document/type/(?P\d+)/metadata/default/edit/$', 'setup_document_type_metadata', (), 'setup_document_type_metadata'), ) + +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/(?P[0-9]+)/$', APIDocumentMetadataView.as_view(), name='documentmetadata-detail'), +) diff --git a/mayan/apps/metadata/views.py b/mayan/apps/metadata/views.py index a9cf7127d7..b6a9148690 100644 --- a/mayan/apps/metadata/views.py +++ b/mayan/apps/metadata/views.py @@ -14,22 +14,27 @@ from documents.models import Document, RecentDocument, DocumentType from documents.permissions import PERMISSION_DOCUMENT_TYPE_EDIT from permissions.models import Permission -from common.utils import generate_choices_w_labels, encapsulate, get_object_name +from common.utils import encapsulate, generate_choices_w_labels, get_object_name from common.views import assign_remove from .api import save_metadata_list from .classes import MetadataObjectWrapper -from .forms import (MetadataFormSet, AddMetadataForm, - MetadataRemoveFormSet, MetadataTypeForm, MetadataSetForm) -from .models import (DocumentMetadata, MetadataType, MetadataSet, - MetadataSetItem, DocumentTypeDefaults) -from .permissions import (PERMISSION_METADATA_DOCUMENT_EDIT, - PERMISSION_METADATA_DOCUMENT_ADD, PERMISSION_METADATA_DOCUMENT_REMOVE, - PERMISSION_METADATA_DOCUMENT_VIEW, PERMISSION_METADATA_TYPE_EDIT, - PERMISSION_METADATA_TYPE_CREATE, PERMISSION_METADATA_TYPE_DELETE, - PERMISSION_METADATA_TYPE_VIEW, PERMISSION_METADATA_SET_EDIT, - PERMISSION_METADATA_SET_CREATE, PERMISSION_METADATA_SET_DELETE, - PERMISSION_METADATA_SET_VIEW) +from .forms import (AddMetadataForm, MetadataFormSet, MetadataRemoveFormSet, + MetadataSetForm, MetadataTypeForm) +from .models import (DocumentMetadata, DocumentTypeDefaults, MetadataSet, + MetadataSetItem, MetadataType) +from .permissions import (PERMISSION_METADATA_DOCUMENT_ADD, + PERMISSION_METADATA_DOCUMENT_EDIT, + PERMISSION_METADATA_DOCUMENT_REMOVE, + PERMISSION_METADATA_DOCUMENT_VIEW, + PERMISSION_METADATA_SET_CREATE, + PERMISSION_METADATA_SET_DELETE, + PERMISSION_METADATA_SET_EDIT, + PERMISSION_METADATA_SET_VIEW, + PERMISSION_METADATA_TYPE_CREATE, + PERMISSION_METADATA_TYPE_DELETE, + PERMISSION_METADATA_TYPE_EDIT, + PERMISSION_METADATA_TYPE_VIEW) def metadata_edit(request, document_id=None, document_id_list=None): @@ -152,7 +157,7 @@ def metadata_add(request, document_id=None, document_id_list=None): if len(documents) == 1: return HttpResponseRedirect(u'%s?%s' % ( - reverse(metadata_edit, args=[document.pk]), + reverse('metadata:metadata_edit', args=[document.pk]), urlencode({'next': next})) ) elif len(documents) > 1: