Issue #56, #8, now that metadata types are automatically added to a document upon type change, there is no more need for the document metadata add and remove code, view, API

This commit is contained in:
Roberto Rosario
2014-10-28 02:16:53 -04:00
parent 6eb6c43807
commit c390fc21d7
6 changed files with 9 additions and 200 deletions

View File

@@ -15,16 +15,12 @@ from project_setup.api import register_setup
from rest_api.classes import APIEndPoint from rest_api.classes import APIEndPoint
from .api import get_metadata_string from .api import get_metadata_string
from .links import (metadata_add, metadata_edit, metadata_multiple_add, from .links import (metadata_edit, metadata_multiple_edit, metadata_view,
metadata_multiple_edit, metadata_multiple_remove,
metadata_remove, metadata_view,
setup_document_type_metadata, setup_metadata_type_create, setup_document_type_metadata, setup_metadata_type_create,
setup_metadata_type_delete, setup_metadata_type_edit, setup_metadata_type_delete, setup_metadata_type_edit,
setup_metadata_type_list) setup_metadata_type_list)
from .models import MetadataType from .models import MetadataType
from .permissions import (PERMISSION_METADATA_DOCUMENT_ADD, from .permissions import (PERMISSION_METADATA_DOCUMENT_EDIT,
PERMISSION_METADATA_DOCUMENT_EDIT,
PERMISSION_METADATA_DOCUMENT_REMOVE,
PERMISSION_METADATA_DOCUMENT_VIEW) PERMISSION_METADATA_DOCUMENT_VIEW)
from .urls import api_urls from .urls import api_urls
@@ -54,18 +50,16 @@ def post_post_document_type_change_metadata(sender, instance, **kwargs):
DocumentType.add_to_class('metadata', document_type_metadata) DocumentType.add_to_class('metadata', document_type_metadata)
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_edit', 'metadata:metadata_view'], [metadata_edit], menu_name='sidebar')
register_links(Document, [metadata_view], menu_name='form_header') register_links(Document, [metadata_view], menu_name='form_header')
register_links(DocumentType, [setup_document_type_metadata]) register_links(DocumentType, [setup_document_type_metadata])
register_links(MetadataType, [setup_metadata_type_edit, setup_metadata_type_delete]) register_links(MetadataType, [setup_metadata_type_edit, setup_metadata_type_delete])
register_links([MetadataType, 'metadata:setup_metadata_type_list', 'metadata:setup_metadata_type_create'], [setup_metadata_type_list, setup_metadata_type_create], menu_name='secondary_menu') register_links([MetadataType, 'metadata:setup_metadata_type_list', 'metadata:setup_metadata_type_create'], [setup_metadata_type_list, setup_metadata_type_create], menu_name='secondary_menu')
register_links([Document], [link_spacer, metadata_multiple_add, metadata_multiple_edit, metadata_multiple_remove], menu_name='multi_item_links')
register_setup(setup_metadata_type_list) register_setup(setup_metadata_type_list)
class_permissions(Document, [ class_permissions(Document, [
PERMISSION_METADATA_DOCUMENT_ADD, PERMISSION_METADATA_DOCUMENT_EDIT, PERMISSION_METADATA_DOCUMENT_EDIT, PERMISSION_METADATA_DOCUMENT_VIEW,
PERMISSION_METADATA_DOCUMENT_REMOVE, PERMISSION_METADATA_DOCUMENT_VIEW,
]) ])
register_model_list_columns(Document, [ register_model_list_columns(Document, [

View File

@@ -16,9 +16,7 @@ from rest_api.filters import MayanObjectPermissionsFilter
from rest_api.permissions import MayanPermission from rest_api.permissions import MayanPermission
from .models import DocumentMetadata, MetadataType from .models import DocumentMetadata, MetadataType
from .permissions import (PERMISSION_METADATA_DOCUMENT_ADD, from .permissions import (PERMISSION_METADATA_DOCUMENT_EDIT,
PERMISSION_METADATA_DOCUMENT_REMOVE,
PERMISSION_METADATA_DOCUMENT_EDIT,
PERMISSION_METADATA_DOCUMENT_VIEW, PERMISSION_METADATA_DOCUMENT_VIEW,
PERMISSION_METADATA_TYPE_CREATE, PERMISSION_METADATA_TYPE_CREATE,
PERMISSION_METADATA_TYPE_DELETE, PERMISSION_METADATA_TYPE_DELETE,
@@ -74,15 +72,8 @@ class APIMetadataTypeView(generics.RetrieveUpdateDestroyAPIView):
return super(APIMetadataTypeView, self).put(*args, **kwargs) return super(APIMetadataTypeView, self).put(*args, **kwargs)
class APIDocumentMetadataListView(generics.ListCreateAPIView): class APIDocumentMetadataListView(generics.ListAPIView):
"""
Returns a list of all the metadata of a document.
"""
serializer_class = DocumentMetadataSerializer serializer_class = DocumentMetadataSerializer
permission_classes = (MayanPermission,)
mayan_view_permissions = {'POST': [PERMISSION_METADATA_DOCUMENT_ADD]}
def get_queryset(self): def get_queryset(self):
document = get_object_or_404(Document, pk=self.kwargs['document_pk']) document = get_object_or_404(Document, pk=self.kwargs['document_pk'])
@@ -98,16 +89,8 @@ class APIDocumentMetadataListView(generics.ListCreateAPIView):
"""Returns a list of selected document's metadata types and values.""" """Returns a list of selected document's metadata types and values."""
return super(APIDocumentMetadataListView, self).get(*args, **kwargs) 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):
"""
Returns the selected document metadata details.
"""
class APIDocumentMetadataView(generics.RetrieveUpdateAPIView):
serializer_class = DocumentMetadataSerializer serializer_class = DocumentMetadataSerializer
queryset = DocumentMetadata.objects.all() queryset = DocumentMetadata.objects.all()
@@ -116,13 +99,8 @@ class APIDocumentMetadataView(generics.RetrieveUpdateDestroyAPIView):
'GET': [PERMISSION_METADATA_DOCUMENT_VIEW], 'GET': [PERMISSION_METADATA_DOCUMENT_VIEW],
'PUT': [PERMISSION_METADATA_DOCUMENT_EDIT], 'PUT': [PERMISSION_METADATA_DOCUMENT_EDIT],
'PATCH': [PERMISSION_METADATA_DOCUMENT_EDIT], '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): def get(self, *args, **kwargs):
"""Return the details of the selected document metadata type and value.""" """Return the details of the selected document metadata type and value."""
return super(APIDocumentMetadataView, self).get(*args, **kwargs) return super(APIDocumentMetadataView, self).get(*args, **kwargs)

View File

@@ -4,23 +4,16 @@ from django.utils.translation import ugettext_lazy as _
from documents.permissions import PERMISSION_DOCUMENT_TYPE_EDIT from documents.permissions import PERMISSION_DOCUMENT_TYPE_EDIT
from .permissions import (PERMISSION_METADATA_DOCUMENT_ADD, from .permissions import (PERMISSION_METADATA_DOCUMENT_EDIT,
PERMISSION_METADATA_DOCUMENT_EDIT,
PERMISSION_METADATA_DOCUMENT_REMOVE,
PERMISSION_METADATA_DOCUMENT_VIEW, PERMISSION_METADATA_DOCUMENT_VIEW,
PERMISSION_METADATA_TYPE_CREATE, PERMISSION_METADATA_TYPE_CREATE,
PERMISSION_METADATA_TYPE_DELETE, PERMISSION_METADATA_TYPE_DELETE,
PERMISSION_METADATA_TYPE_EDIT, PERMISSION_METADATA_TYPE_EDIT,
PERMISSION_METADATA_TYPE_VIEW) PERMISSION_METADATA_TYPE_VIEW)
metadata_edit = {'text': _(u'Edit metadata'), 'view': 'metadata:metadata_edit', 'args': 'object.pk', 'famfam': 'xhtml_go', 'permissions': [PERMISSION_METADATA_DOCUMENT_EDIT]} metadata_edit = {'text': _(u'Edit metadata'), 'view': 'metadata:metadata_edit', 'args': 'object.pk', 'famfam': 'xhtml_go', 'permissions': [PERMISSION_METADATA_DOCUMENT_EDIT]}
metadata_view = {'text': _(u'Metadata'), 'view': 'metadata:metadata_view', 'args': 'object.pk', 'famfam': 'xhtml_go', 'permissions': [PERMISSION_METADATA_DOCUMENT_VIEW], 'children_view_regex': ['metadata']} metadata_view = {'text': _(u'Metadata'), 'view': 'metadata:metadata_view', 'args': 'object.pk', 'famfam': 'xhtml_go', 'permissions': [PERMISSION_METADATA_DOCUMENT_VIEW], 'children_view_regex': ['metadata']}
metadata_multiple_edit = {'text': _(u'Edit metadata'), 'view': 'metadata:metadata_multiple_edit', 'famfam': 'xhtml_go', 'permissions': [PERMISSION_METADATA_DOCUMENT_EDIT]} metadata_multiple_edit = {'text': _(u'Edit metadata'), 'view': 'metadata:metadata_multiple_edit', 'famfam': 'xhtml_go', 'permissions': [PERMISSION_METADATA_DOCUMENT_EDIT]}
metadata_add = {'text': _(u'Add metadata'), 'view': 'metadata:metadata_add', 'args': 'object.pk', 'famfam': 'xhtml_add', 'permissions': [PERMISSION_METADATA_DOCUMENT_ADD]}
metadata_multiple_add = {'text': _(u'Add metadata'), 'view': 'metadata:metadata_multiple_add', 'famfam': 'xhtml_add', 'permissions': [PERMISSION_METADATA_DOCUMENT_ADD]}
metadata_remove = {'text': _(u'Remove metadata'), 'view': 'metadata:metadata_remove', 'args': 'object.pk', 'famfam': 'xhtml_delete', 'permissions': [PERMISSION_METADATA_DOCUMENT_REMOVE]}
metadata_multiple_remove = {'text': _(u'Remove metadata'), 'view': 'metadata:metadata_multiple_remove', 'famfam': 'xhtml_delete', 'permissions': [PERMISSION_METADATA_DOCUMENT_REMOVE]}
setup_document_type_metadata = {'text': _(u'Metadata'), 'view': 'metadata:setup_document_type_metadata', 'args': 'document_type.pk', 'famfam': 'xhtml', 'permissions': [PERMISSION_DOCUMENT_TYPE_EDIT]} setup_document_type_metadata = {'text': _(u'Metadata'), 'view': 'metadata:setup_document_type_metadata', 'args': 'document_type.pk', 'famfam': 'xhtml', 'permissions': [PERMISSION_DOCUMENT_TYPE_EDIT]}

View File

@@ -6,8 +6,6 @@ from permissions.models import Permission, PermissionNamespace
metadata_namespace = PermissionNamespace('metadata', _(u'Metadata')) metadata_namespace = PermissionNamespace('metadata', _(u'Metadata'))
PERMISSION_METADATA_DOCUMENT_EDIT = Permission.objects.register(metadata_namespace, 'metadata_document_edit', _(u'Edit a document\'s metadata')) PERMISSION_METADATA_DOCUMENT_EDIT = Permission.objects.register(metadata_namespace, 'metadata_document_edit', _(u'Edit a document\'s metadata'))
PERMISSION_METADATA_DOCUMENT_ADD = Permission.objects.register(metadata_namespace, 'metadata_document_add', _(u'Add metadata to a document'))
PERMISSION_METADATA_DOCUMENT_REMOVE = Permission.objects.register(metadata_namespace, 'metadata_document_remove', _(u'Remove metadata from a document'))
PERMISSION_METADATA_DOCUMENT_VIEW = Permission.objects.register(metadata_namespace, 'metadata_document_view', _(u'View metadata from a document')) PERMISSION_METADATA_DOCUMENT_VIEW = Permission.objects.register(metadata_namespace, 'metadata_document_view', _(u'View metadata from a document'))
metadata_setup_namespace = PermissionNamespace('metadata_setup', _(u'Metadata setup')) metadata_setup_namespace = PermissionNamespace('metadata_setup', _(u'Metadata setup'))

View File

@@ -9,10 +9,6 @@ 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'),
url(r'^multiple/edit/$', 'metadata_multiple_edit', (), 'metadata_multiple_edit'), url(r'^multiple/edit/$', 'metadata_multiple_edit', (), 'metadata_multiple_edit'),
url(r'^(?P<document_id>\d+)/add/$', 'metadata_add', (), 'metadata_add'),
url(r'^multiple/add/$', 'metadata_multiple_add', (), 'metadata_multiple_add'),
url(r'^(?P<document_id>\d+)/remove/$', 'metadata_remove', (), 'metadata_remove'),
url(r'^multiple/remove/$', 'metadata_multiple_remove', (), 'metadata_multiple_remove'),
url(r'^setup/type/list/$', 'setup_metadata_type_list', (), 'setup_metadata_type_list'), url(r'^setup/type/list/$', 'setup_metadata_type_list', (), 'setup_metadata_type_list'),
url(r'^setup/type/create/$', 'setup_metadata_type_create', (), 'setup_metadata_type_create'), url(r'^setup/type/create/$', 'setup_metadata_type_create', (), 'setup_metadata_type_create'),

View File

@@ -22,9 +22,7 @@ from .classes import MetadataObjectWrapper
from .forms import (AddMetadataForm, MetadataFormSet, MetadataRemoveFormSet, from .forms import (AddMetadataForm, MetadataFormSet, MetadataRemoveFormSet,
MetadataTypeForm) MetadataTypeForm)
from .models import DocumentMetadata, DocumentTypeDefaults, MetadataType from .models import DocumentMetadata, DocumentTypeDefaults, MetadataType
from .permissions import (PERMISSION_METADATA_DOCUMENT_ADD, from .permissions import (PERMISSION_METADATA_DOCUMENT_EDIT,
PERMISSION_METADATA_DOCUMENT_EDIT,
PERMISSION_METADATA_DOCUMENT_REMOVE,
PERMISSION_METADATA_DOCUMENT_VIEW, PERMISSION_METADATA_DOCUMENT_VIEW,
PERMISSION_METADATA_TYPE_CREATE, PERMISSION_METADATA_TYPE_CREATE,
PERMISSION_METADATA_TYPE_DELETE, PERMISSION_METADATA_TYPE_DELETE,
@@ -115,154 +113,6 @@ def metadata_multiple_edit(request):
return metadata_edit(request, document_id_list=request.GET.get('id_list', '')) return metadata_edit(request, document_id_list=request.GET.get('id_list', ''))
def metadata_add(request, document_id=None, document_id_list=None):
if document_id:
documents = [get_object_or_404(Document, pk=document_id)]
elif document_id_list:
documents = [get_object_or_404(Document, pk=document_id) for document_id in document_id_list.split(',')]
try:
Permission.objects.check_permissions(request.user, [PERMISSION_METADATA_DOCUMENT_ADD])
except PermissionDenied:
documents = AccessEntry.objects.filter_objects_by_access(PERMISSION_METADATA_DOCUMENT_ADD, request.user, documents)
if not documents:
messages.error(request, _(u'Must provide at least one document.'))
return HttpResponseRedirect(request.META.get('HTTP_REFERER', reverse('main:home')))
for document in documents:
document.add_as_recent_document_for_user(request.user)
post_action_redirect = reverse('documents:document_list_recent')
next = request.POST.get('next', request.GET.get('next', request.META.get('HTTP_REFERER', post_action_redirect)))
if request.method == 'POST':
form = AddMetadataForm(request.POST)
if form.is_valid():
metadata_type = form.cleaned_data['metadata_type']
for document in documents:
document_metadata, created = DocumentMetadata.objects.get_or_create(document=document, metadata_type=metadata_type, defaults={'value': u''})
if created:
messages.success(request, _(u'Metadata type: %(metadata_type)s successfully added to document %(document)s.') % {
'metadata_type': metadata_type, 'document': document})
else:
messages.warning(request, _(u'Metadata type: %(metadata_type)s already present in document %(document)s.') % {
'metadata_type': metadata_type, 'document': document})
if len(documents) == 1:
return HttpResponseRedirect(u'%s?%s' % (
reverse('metadata:metadata_edit', args=[document.pk]),
urlencode({'next': next}))
)
elif len(documents) > 1:
return HttpResponseRedirect(u'%s?%s' % (
reverse('metadata:metadata_multiple_edit'),
urlencode({'id_list': document_id_list, 'next': next}))
)
else:
form = AddMetadataForm()
context = {
'form': form,
'next': next,
}
if len(documents) == 1:
context['object'] = documents[0]
context['title'] = _(u'Add metadata type to document: %s') % ', '.join([unicode(d) for d in documents])
elif len(documents) > 1:
context['title'] = _(u'Add metadata type to documents: %s') % ', '.join([unicode(d) for d in documents])
return render_to_response('main/generic_form.html', context,
context_instance=RequestContext(request))
def metadata_multiple_add(request):
return metadata_add(request, document_id_list=request.GET.get('id_list', []))
def metadata_remove(request, document_id=None, document_id_list=None):
if document_id:
documents = [get_object_or_404(Document, pk=document_id)]
if documents[0].metadata.count() == 0:
messages.warning(request, _(u'The selected document doesn\'t have any metadata.'))
return HttpResponseRedirect(request.META.get('HTTP_REFERER', reverse('main:home')))
elif document_id_list:
documents = [get_object_or_404(Document, pk=document_id) for document_id in document_id_list.split(',')]
try:
Permission.objects.check_permissions(request.user, [PERMISSION_METADATA_DOCUMENT_REMOVE])
except PermissionDenied:
documents = AccessEntry.objects.filter_objects_by_access(PERMISSION_METADATA_DOCUMENT_REMOVE, request.user, documents)
if not documents:
messages.error(request, _(u'Must provide at least one document.'))
return HttpResponseRedirect(request.META.get('HTTP_REFERER', reverse('main:home')))
post_action_redirect = reverse('documents:document_list_recent')
next = request.POST.get('next', request.GET.get('next', request.META.get('HTTP_REFERER', post_action_redirect)))
metadata = {}
for document in documents:
document.add_as_recent_document_for_user(request.user)
for item in document.metadata.all():
value = item.value
if item.metadata_type in metadata:
if value not in metadata[item.metadata_type]:
metadata[item.metadata_type].append(value)
else:
metadata[item.metadata_type] = [value] if value else u''
initial = []
for key, value in metadata.items():
initial.append({
'metadata_type': key,
'value': u', '.join(value)
})
formset = MetadataRemoveFormSet(initial=initial)
if request.method == 'POST':
formset = MetadataRemoveFormSet(request.POST)
if formset.is_valid():
for document in documents:
for form in formset.forms:
if form.cleaned_data['update']:
metadata_type = get_object_or_404(MetadataType, pk=form.cleaned_data['id'])
try:
document_metadata = DocumentMetadata.objects.get(document=document, metadata_type=metadata_type)
document_metadata.delete()
messages.success(request, _(u'Successfully remove metadata type: %(metadata_type)s from document: %(document)s.') % {
'metadata_type': metadata_type, 'document': document})
except:
messages.error(request, _(u'Error removing metadata type: %(metadata_type)s from document: %(document)s.') % {
'metadata_type': metadata_type, 'document': document})
return HttpResponseRedirect(next)
context = {
'form_display_mode_table': True,
'form': formset,
'next': next,
}
if len(documents) == 1:
context['object'] = documents[0]
context['title'] = _(u'Remove metadata types from document: %s') % ', '.join([unicode(d) for d in documents])
elif len(documents) > 1:
context['title'] = _(u'Remove metadata types from documents: %s') % ', '.join([unicode(d) for d in documents])
return render_to_response('main/generic_form.html', context,
context_instance=RequestContext(request))
def metadata_multiple_remove(request):
return metadata_remove(request, document_id_list=request.GET.get('id_list', []))
def metadata_view(request, document_id): def metadata_view(request, document_id):
document = get_object_or_404(Document, pk=document_id) document = get_object_or_404(Document, pk=document_id)