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,
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.'))

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 .api_views import (APIDocumentMetadataListView, APIDocumentMetadataView,
APIMetadataTypeListView, APIMetadataTypeView)
urlpatterns = patterns('metadata.views',
url(r'^(?P<document_id>\d+)/edit/$', 'metadata_edit', (), 'metadata_edit'),
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'),
)
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 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: