diff --git a/apps/documents/__init__.py b/apps/documents/__init__.py index 15d691511c..a878425637 100644 --- a/apps/documents/__init__.py +++ b/apps/documents/__init__.py @@ -44,6 +44,7 @@ document_delete = {'text':_('delete'), 'view':'document_delete', 'args':'object. document_multiple_delete = {'text':_('delete'), 'view':'document_multiple_delete', 'famfam':'page_delete', 'permissions':{'namespace':'documents', 'permissions':[PERMISSION_DOCUMENT_DELETE]}} document_edit = {'text':_('edit'), 'view':'document_edit', 'args':'object.id', 'famfam':'page_edit', 'permissions':{'namespace':'documents', 'permissions':[PERMISSION_DOCUMENT_PROPERTIES_EDIT]}} document_edit_metadata = {'text':_('edit metadata'), 'view':'document_edit_metadata', 'args':'object.id', 'famfam':'page_edit', 'permissions':{'namespace':'documents', 'permissions':[PERMISSION_DOCUMENT_METADATA_EDIT]}} +document_multiple_edit_metadata = {'text':_('edit metadata'), 'view':'document_multiple_edit_metadata', 'famfam':'page_edit', 'permissions':{'namespace':'documents', 'permissions':[PERMISSION_DOCUMENT_METADATA_EDIT]}} document_preview = {'text':_('preview'), 'class':'fancybox', 'view':'document_preview', 'args':'object.id', 'famfam':'magnifier', 'permissions':{'namespace':'documents', 'permissions':[PERMISSION_DOCUMENT_VIEW]}} document_download = {'text':_('download'), 'view':'document_download', 'args':'object.id', 'famfam':'page_save', 'permissions':{'namespace':'documents', 'permissions':[PERMISSION_DOCUMENT_DOWNLOAD]}} document_find_duplicates = {'text':_('find duplicates'), 'view':'document_find_duplicates', 'args':'object.id', 'famfam':'page_refresh', 'permissions':{'namespace':'documents', 'permissions':[PERMISSION_DOCUMENT_VIEW]}} @@ -65,7 +66,7 @@ staging_file_delete = {'text':_('delete'), 'view':'staging_file_delete', 'args': register_links(Document, [document_view_simple, document_view, document_edit, document_edit_metadata, document_delete, document_download, document_find_duplicates, document_clear_transformations], menu_name='sidebar') register_links(Document, [document_list, document_create, document_create_multiple, document_create_sibling], menu_name='sidebar') -register_multi_item_links(['document_list'], [document_multiple_clear_transformations, document_multiple_delete]) +register_multi_item_links(['document_list'], [document_multiple_clear_transformations, document_multiple_edit_metadata, document_multiple_delete]) if ENABLE_SINGLE_DOCUMENT_UPLOAD: register_links(['document_list', 'document_create', 'document_create_multiple', 'upload_document_with_type', 'upload_multiple_documents_with_type'], [document_list, document_create, document_create_multiple], menu_name='sidebar') diff --git a/apps/documents/urls.py b/apps/documents/urls.py index 27a399a032..7f9b846c20 100644 --- a/apps/documents/urls.py +++ b/apps/documents/urls.py @@ -24,6 +24,7 @@ urlpatterns = patterns('documents.views', url(r'^document/multiple/delete/$', 'document_multiple_delete', (), 'document_multiple_delete'), url(r'^document/(?P\d+)/edit/$', 'document_edit', (), 'document_edit'), url(r'^document/(?P\d+)/edit/metadata/$', 'document_edit_metadata', (), 'document_edit_metadata'), + url(r'^document/multiple/edit/metadata/$', 'document_multiple_edit_metadata', (), 'document_multiple_edit_metadata'), url(r'^document/(?P\d+)/display/preview/$', 'get_document_image', {'size':PREVIEW_SIZE}, 'document_preview'), url(r'^document/(?P\d+)/display/preview/multipage/$', 'get_document_image', {'size':MULTIPAGE_PREVIEW_SIZE}, 'document_preview_multipage'), diff --git a/apps/documents/views.py b/apps/documents/views.py index 50501db5ab..4788d74099 100644 --- a/apps/documents/views.py +++ b/apps/documents/views.py @@ -441,61 +441,86 @@ def document_edit(request, document_id): }, context_instance=RequestContext(request)) -def document_edit_metadata(request, document_id): +def document_edit_metadata(request, document_id=None, document_id_list=None): check_permissions(request.user, 'documents', [PERMISSION_DOCUMENT_METADATA_EDIT]) - document = get_object_or_404(Document, pk=document_id) + 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(',')] + if len(set([document.document_type for document in documents])) > 1: + messages.error(request, _(u'All documents must be from the same type.')) + return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/')) + else: + messages.error(request, _(u'Must provide at least one document.')) + return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/')) + metadata={} + for document in documents: + for item in DocumentTypeMetadataType.objects.filter(document_type=document.document_type): + value = document.documentmetadata_set.get(metadata_type=item.metadata_type).value if document.documentmetadata_set.filter(metadata_type=item.metadata_type) else u'' + 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] + initial=[] - for item in DocumentTypeMetadataType.objects.filter(document_type=document.document_type): + for key, value in metadata.items(): initial.append({ - 'metadata_type':item.metadata_type, + 'metadata_type':key, 'document_type':document.document_type, - 'value':document.documentmetadata_set.get(metadata_type=item.metadata_type).value if document.documentmetadata_set.filter(metadata_type=item.metadata_type) else None + 'value': u', '.join(value) }) - #for metadata in document.documentmetadata_set.all(): - # initial.append({ - # 'metadata_type':metadata.metadata_type, - # 'document_type':document.document_type, - # 'value':metadata.value, - # }) formset = MetadataFormSet(initial=initial) if request.method == 'POST': formset = MetadataFormSet(request.POST) if formset.is_valid(): - save_metadata_list(formset.cleaned_data, document) - try: - document_delete_fs_links(document) - except Exception, e: - messages.error(request, e) - return HttpResponseRedirect(reverse('document_list')) - - messages.success(request, _(u'Metadata for document %s edited successfully.') % document) - - try: - warnings = document_create_fs_links(document) - - if request.user.is_staff or request.user.is_superuser: - for warning in warnings: - messages.warning(request, warning) - - messages.success(request, _(u'Document filesystem links updated successfully.')) - except Exception, e: - messages.error(request, e) - return HttpResponseRedirect(document.get_absolute_url()) + for document in documents: + save_metadata_list(formset.cleaned_data, document) + try: + document_delete_fs_links(document) + except Exception, e: + messages.error(request, _(u'Error deleting filesystem links for document: %(document)s; %(error)s') % { + 'document':document, 'error':e}) + + messages.success(request, _(u'Metadata for document %s edited successfully.') % document) - return HttpResponseRedirect(document.get_absolute_url()) + try: + warnings = document_create_fs_links(document) + + if request.user.is_staff or request.user.is_superuser: + for warning in warnings: + messages.warning(request, warning) + + messages.success(request, _(u'Filesystem links updated successfully for document: %s.') % document) + except Exception, e: + messages.error(request, _('Error creating filesystem links for document: %(document)s; %(error)s') % { + 'document':document, 'error':e}) + + if len(documents) == 1: + return HttpResponseRedirect(document.get_absolute_url()) + elif len(documents) > 1: + return HttpResponseRedirect(reverse('document_list')) - - return render_to_response('generic_form.html', { + context = { 'form_display_mode_table':True, 'form':formset, - 'object':document, + } + if len(documents) == 1: + context['object'] = documents[0] + context['title'] = _(u'Edit metadata for document: %s?') % ', '.join([unicode(d) for d in documents]) + elif len(documents) > 1: + context['title'] = _(u'Edit metadata for documents: %s?') % ', '.join([unicode(d) for d in documents]) + + + return render_to_response('generic_form.html', context, + context_instance=RequestContext(request)) - }, context_instance=RequestContext(request)) +def document_multiple_edit_metadata(request): + return document_edit_metadata(request, document_id_list=request.GET.get('id_list', [])) - def get_document_image(request, document_id, size=PREVIEW_SIZE, quality=QUALITY_DEFAULT): check_permissions(request.user, 'documents', [PERMISSION_DOCUMENT_VIEW])