diff --git a/apps/tags/__init__.py b/apps/tags/__init__.py index f23ad857b5..c0e2eeb7e1 100644 --- a/apps/tags/__init__.py +++ b/apps/tags/__init__.py @@ -14,8 +14,7 @@ from taggit.managers import TaggableManager from .links import (tag_list, tag_create, tag_attach, tag_document_remove, tag_document_remove_multiple, tag_document_list, tag_delete, tag_edit, tag_tagged_item_list, tag_multiple_delete, tag_acl_list, - tag_multiple_attach) - + tag_multiple_attach, multiple_document_tag_remove) from .widgets import (get_tags_inline_widget_simple, single_tag_widget) from .permissions import (PERMISSION_TAG_ATTACH, PERMISSION_TAG_REMOVE, PERMISSION_TAG_DELETE, PERMISSION_TAG_EDIT, PERMISSION_TAG_VIEW) @@ -48,6 +47,7 @@ register_links(['document_tags', 'tag_remove', 'tag_multiple_remove', 'tag_attac register_multi_item_links(['document_tags'], [tag_document_remove_multiple]) register_multi_item_links(['document_find_duplicates', 'folder_view', 'index_instance_node_view', 'document_type_document_list', 'search', 'results', 'document_group_view', 'document_list', 'document_list_recent', 'tag_tagged_item_list'], [tag_multiple_attach]) +register_multi_item_links(['tag_tagged_item_list'], [multiple_document_tag_remove]) class_permissions(Document, [ PERMISSION_TAG_ATTACH, diff --git a/apps/tags/links.py b/apps/tags/links.py index 2f93f1c5dd..e5bbc6a8d2 100644 --- a/apps/tags/links.py +++ b/apps/tags/links.py @@ -13,6 +13,7 @@ tag_create = {'text': _(u'create new tag'), 'view': 'tag_create', 'famfam': 'tag tag_attach = {'text': _(u'attach tag'), 'view': 'tag_attach', 'args': 'object.pk', 'famfam': 'tag_blue_add', 'permissions': [PERMISSION_TAG_ATTACH]} tag_multiple_attach = {'text': _(u'attach tag'), 'view': 'tag_multiple_attach', 'famfam': 'tag_blue_add'} tag_document_remove = {'text': _(u'remove'), 'view': 'tag_remove', 'args': ['object.id', 'document.id'], 'famfam': 'tag_blue_delete', 'permissions': [PERMISSION_TAG_REMOVE]} +multiple_document_tag_remove = {'text': _(u'remove tag'), 'view': 'multiple_document_tag_remove', 'args': 'object.id', 'famfam': 'tag_blue_delete'} tag_document_remove_multiple = {'text': _(u'remove'), 'view': 'tag_multiple_remove', 'args': 'document.id', 'famfam': 'tag_blue_delete', 'permissions': [PERMISSION_TAG_REMOVE]} tag_document_list = {'text': _(u'tags'), 'view': 'document_tags', 'args': 'object.pk', 'famfam': 'tag_blue', 'permissions': [PERMISSION_TAG_REMOVE, PERMISSION_TAG_ATTACH], 'children_view_regex': ['tag']} tag_delete = {'text': _(u'delete'), 'view': 'tag_delete', 'args': 'object.id', 'famfam': 'tag_blue_delete', 'permissions': [PERMISSION_TAG_DELETE]} diff --git a/apps/tags/urls.py b/apps/tags/urls.py index bdf5637ce5..d29e86e6ec 100644 --- a/apps/tags/urls.py +++ b/apps/tags/urls.py @@ -9,6 +9,7 @@ urlpatterns = patterns('tags.views', url(r'^multiple/delete/$', 'tag_multiple_delete', (), 'tag_multiple_delete'), url(r'^(?P\d+)/remove_from_document/(?P\d+)/$', 'tag_remove', (), 'tag_remove'), + url(r'^(?P\d+)/remove_from_document/multiple/$', 'multiple_document_tag_remove', (), 'multiple_document_tag_remove'), url(r'^multiple/remove_from_document/(?P\d+)/$', 'tag_multiple_remove', (), 'tag_multiple_remove'), url(r'^document/(?P\d+)/add/$', 'tag_attach', (), 'tag_attach'), url(r'^document/multiple/add/$', 'tag_multiple_attach', (), 'tag_multiple_attach'), diff --git a/apps/tags/views.py b/apps/tags/views.py index baf3d0389d..26b0df578e 100644 --- a/apps/tags/views.py +++ b/apps/tags/views.py @@ -265,15 +265,19 @@ def document_tags(request, document_id): return tag_list(request, queryset=document.tags.all(), extra_context=context) -def tag_remove(request, document_id, tag_id=None, tag_id_list=None): - document = get_object_or_404(Document, pk=document_id) +def tag_remove(request, document_id=None, document_id_list=None, tag_id=None, tag_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(',')] + else: + messages.error(request, _(u'Must provide at least one tagged document.')) + return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/')) try: Permission.objects.check_permissions(request.user, [PERMISSION_TAG_REMOVE]) except PermissionDenied: - AccessEntry.objects.check_access(PERMISSION_TAG_REMOVE, request.user, document) - - post_action_redirect = None + documents = AccessEntry.objects.filter_objects_by_access(PERMISSION_TAG_REMOVE, request.user, documents, exception_on_empty=True) if tag_id: tags = [get_object_or_404(Tag, pk=tag_id)] @@ -283,18 +287,23 @@ def tag_remove(request, document_id, tag_id=None, tag_id_list=None): messages.error(request, _(u'Must provide at least one tag.')) return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/')) + post_action_redirect = None + previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', '/'))) next = request.POST.get('next', request.GET.get('next', post_action_redirect if post_action_redirect else request.META.get('HTTP_REFERER', '/'))) if request.method == 'POST': - for tag in tags: - try: - document.tags.remove(tag) - messages.success(request, _(u'Tag "%s" removed successfully.') % tag) - except Exception, e: - messages.error(request, _(u'Error deleting tag "%(tag)s": %(error)s') % { - 'tag': tag, 'error': e - }) + for document in documents: + for tag in tags: + try: + document.tags.remove(tag) + messages.success(request, _(u'Tag "%(tag)s" removed successfully from document: %(document)s.') % { + 'tag': tag, 'document': document} + ) + except Exception, e: + messages.error(request, _(u'Error deleting tag "%(tag)s" from document "%(document)s"; %(error)s') % { + 'tag': tag, 'error': e, 'document': document + }) return HttpResponseRedirect(next) @@ -302,13 +311,25 @@ def tag_remove(request, document_id, tag_id=None, tag_id_list=None): 'previous': previous, 'next': next, 'form_icon': u'tag_blue_delete.png', - 'object': document, } if len(tags) == 1: - context['title'] = _(u'Are you sure you wish to remove the tag: %s?') % ', '.join([unicode(d) for d in tags]) + if len(documents) == 1: + context['object'] = documents[0] + context['title'] = _(u'Are you sure you wish to remove the tag "%(tag)s" from the document: %(document)s?') % { + 'tag': ', '.join([unicode(d) for d in tags]), 'document': ', '.join([unicode(d) for d in documents])} + else: + context['title'] = _(u'Are you sure you wish to remove the tag "%(tag)s" from the documents: %(documents)s?') % { + 'tag': ', '.join([unicode(d) for d in tags]), 'documents': ', '.join([unicode(d) for d in documents])} elif len(tags) > 1: - context['title'] = _(u'Are you sure you wish to remove the tags: %s?') % ', '.join([unicode(d) for d in tags]) + if len(documents) == 1: + context['object'] = documents[0] + context['title'] = _(u'Are you sure you wish to remove the taqs: %(tags)s from the document: %(document)s?') % { + 'tags': ', '.join([unicode(d) for d in tags]), 'document': ', '.join([unicode(d) for d in documents])} + else: + context['title'] = _(u'Are you sure you wish to remove the tags %(tag)s from the documents: %(documents)s?') % { + 'tags': ', '.join([unicode(d) for d in tags]), 'documents': ', '.join([unicode(d) for d in documents])} + #context['title'] = _(u'Are you sure you wish to remove the tags: %s?') % ', '.join([unicode(d) for d in tags]) return render_to_response('generic_confirm.html', context, context_instance=RequestContext(request)) @@ -318,6 +339,10 @@ def tag_multiple_remove(request, document_id): return tag_remove(request, document_id=document_id, tag_id_list=request.GET.get('id_list', [])) +def multiple_document_tag_remove(request, tag_id): + return tag_remove(request, tag_id=tag_id, document_id_list=request.GET.get('id_list', [])) + + def tag_acl_list(request, tag_pk): tag = get_object_or_404(Tag, pk=tag_pk) logger.debug('tag: %s' % tag)