Add metadata app API endpoints

This commit is contained in:
Roberto Rosario
2014-10-07 08:57:37 -04:00
parent eb48909399
commit a85b3b1526
5 changed files with 151 additions and 22 deletions

View File

@@ -8,6 +8,7 @@ from documents.models import Document, DocumentType
from navigation.api import (register_links, register_multi_item_links, from navigation.api import (register_links, register_multi_item_links,
register_sidebar_template, register_model_list_columns) register_sidebar_template, register_model_list_columns)
from project_setup.api import register_setup from project_setup.api import register_setup
from rest_api.classes import APIEndPoint
from .api import get_metadata_string from .api import get_metadata_string
from .links import (metadata_edit, metadata_view, metadata_multiple_edit, 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_type_create, setup_metadata_set_list, setup_metadata_set_edit,
setup_metadata_set_members, setup_metadata_set_delete, setup_metadata_set_create, setup_metadata_set_members, setup_metadata_set_delete, setup_metadata_set_create,
setup_document_type_metadata) setup_document_type_metadata)
from .models import MetadataType, MetadataSet from .models import MetadataSet, MetadataType
from .permissions import (PERMISSION_METADATA_DOCUMENT_EDIT, from .permissions import (PERMISSION_METADATA_DOCUMENT_ADD,
PERMISSION_METADATA_DOCUMENT_ADD, PERMISSION_METADATA_DOCUMENT_REMOVE, PERMISSION_METADATA_DOCUMENT_EDIT,
PERMISSION_METADATA_DOCUMENT_VIEW) 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(['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') 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_type_list'], 'metadata_type_help.html')
register_sidebar_template(['metadata:setup_metadata_set_list'], 'metadata_set_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_set_list)
register_setup(setup_metadata_type_list)
class_permissions(Document, [ class_permissions(Document, [
PERMISSION_METADATA_DOCUMENT_EDIT, PERMISSION_METADATA_DOCUMENT_ADD, PERMISSION_METADATA_DOCUMENT_EDIT,
PERMISSION_METADATA_DOCUMENT_ADD, PERMISSION_METADATA_DOCUMENT_REMOVE, PERMISSION_METADATA_DOCUMENT_VIEW,
PERMISSION_METADATA_DOCUMENT_REMOVE,
PERMISSION_METADATA_DOCUMENT_VIEW,
]) ])
register_model_list_columns(Document, [ 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)) '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.'))

View File

@@ -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]
}

View File

@@ -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

View File

@@ -1,5 +1,8 @@
from django.conf.urls import patterns, url from django.conf.urls import patterns, url
from .api_views import (APIDocumentMetadataListView, APIDocumentMetadataView,
APIMetadataTypeListView, APIMetadataTypeView)
urlpatterns = patterns('metadata.views', urlpatterns = patterns('metadata.views',
url(r'^(?P<document_id>\d+)/edit/$', 'metadata_edit', (), 'metadata_edit'), url(r'^(?P<document_id>\d+)/edit/$', 'metadata_edit', (), 'metadata_edit'),
url(r'^(?P<document_id>\d+)/view/$', 'metadata_view', (), 'metadata_view'), url(r'^(?P<document_id>\d+)/view/$', 'metadata_view', (), 'metadata_view'),
@@ -22,3 +25,10 @@ urlpatterns = patterns('metadata.views',
url(r'^setup/document/type/(?P<document_type_id>\d+)/metadata/default/edit/$', 'setup_document_type_metadata', (), 'setup_document_type_metadata'), url(r'^setup/document/type/(?P<document_type_id>\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<pk>[0-9]+)/$', APIMetadataTypeView.as_view(), name='metadatatype-detail'),
url(r'^document/(?P<pk>[0-9]+)/metadata/$', APIDocumentMetadataListView.as_view(), name='documentmetadata-list'),
url(r'^document/(?P<document_pk>[0-9]+)/metadata/(?P<pk>[0-9]+)/$', APIDocumentMetadataView.as_view(), name='documentmetadata-detail'),
)

View File

@@ -14,22 +14,27 @@ from documents.models import Document, RecentDocument, DocumentType
from documents.permissions import PERMISSION_DOCUMENT_TYPE_EDIT from documents.permissions import PERMISSION_DOCUMENT_TYPE_EDIT
from permissions.models import Permission 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 common.views import assign_remove
from .api import save_metadata_list from .api import save_metadata_list
from .classes import MetadataObjectWrapper from .classes import MetadataObjectWrapper
from .forms import (MetadataFormSet, AddMetadataForm, from .forms import (AddMetadataForm, MetadataFormSet, MetadataRemoveFormSet,
MetadataRemoveFormSet, MetadataTypeForm, MetadataSetForm) MetadataSetForm, MetadataTypeForm)
from .models import (DocumentMetadata, MetadataType, MetadataSet, from .models import (DocumentMetadata, DocumentTypeDefaults, MetadataSet,
MetadataSetItem, DocumentTypeDefaults) MetadataSetItem, MetadataType)
from .permissions import (PERMISSION_METADATA_DOCUMENT_EDIT, from .permissions import (PERMISSION_METADATA_DOCUMENT_ADD,
PERMISSION_METADATA_DOCUMENT_ADD, PERMISSION_METADATA_DOCUMENT_REMOVE, PERMISSION_METADATA_DOCUMENT_EDIT,
PERMISSION_METADATA_DOCUMENT_VIEW, PERMISSION_METADATA_TYPE_EDIT, PERMISSION_METADATA_DOCUMENT_REMOVE,
PERMISSION_METADATA_TYPE_CREATE, PERMISSION_METADATA_TYPE_DELETE, PERMISSION_METADATA_DOCUMENT_VIEW,
PERMISSION_METADATA_TYPE_VIEW, PERMISSION_METADATA_SET_EDIT, PERMISSION_METADATA_SET_CREATE,
PERMISSION_METADATA_SET_CREATE, PERMISSION_METADATA_SET_DELETE, PERMISSION_METADATA_SET_DELETE,
PERMISSION_METADATA_SET_VIEW) 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): 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: if len(documents) == 1:
return HttpResponseRedirect(u'%s?%s' % ( return HttpResponseRedirect(u'%s?%s' % (
reverse(metadata_edit, args=[document.pk]), reverse('metadata:metadata_edit', args=[document.pk]),
urlencode({'next': next})) urlencode({'next': next}))
) )
elif len(documents) > 1: elif len(documents) > 1: