diff --git a/apps/tags/__init__.py b/apps/tags/__init__.py index 11671763c5..c8e882d51d 100644 --- a/apps/tags/__init__.py +++ b/apps/tags/__init__.py @@ -13,7 +13,8 @@ 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_edit, tag_tagged_item_list, tag_multiple_delete, tag_acl_list, + tag_multiple_attach) from .widgets import (get_tags_inline_widget_simple, single_tag_widget) from .permissions import (PERMISSION_TAG_ATTACH, PERMISSION_TAG_REMOVE, @@ -46,6 +47,8 @@ register_links(Document, [tag_document_list], menu_name='form_header') register_links(['document_tags', 'tag_remove', 'tag_multiple_remove', 'tag_attach'], [tag_attach], menu_name='sidebar') 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_multiple_attach]) + class_permissions(Document, [ PERMISSION_TAG_ATTACH, PERMISSION_TAG_REMOVE, diff --git a/apps/tags/links.py b/apps/tags/links.py index 2be8298f98..2f93f1c5dd 100644 --- a/apps/tags/links.py +++ b/apps/tags/links.py @@ -11,6 +11,7 @@ from .permissions import (PERMISSION_TAG_CREATE, PERMISSION_TAG_ATTACH, tag_list = {'text': _(u'tag list'), 'view': 'tag_list', 'famfam': 'tag_blue'} tag_create = {'text': _(u'create new tag'), 'view': 'tag_create', 'famfam': 'tag_blue_add', 'permissions': [PERMISSION_TAG_CREATE]} 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]} 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']} diff --git a/apps/tags/urls.py b/apps/tags/urls.py index 14c9902303..bdf5637ce5 100644 --- a/apps/tags/urls.py +++ b/apps/tags/urls.py @@ -11,6 +11,7 @@ urlpatterns = patterns('tags.views', url(r'^(?P\d+)/remove_from_document/(?P\d+)/$', 'tag_remove', (), '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'), url(r'^document/(?P\d+)/list/$', 'document_tags', (), 'document_tags'), url(r'^(?P\d+)/acl/list/$', 'tag_acl_list', (), 'tag_acl_list'), diff --git a/apps/tags/views.py b/apps/tags/views.py index a153506e02..baf3d0389d 100644 --- a/apps/tags/views.py +++ b/apps/tags/views.py @@ -59,38 +59,64 @@ def tag_create(request): context_instance=RequestContext(request)) -def tag_attach(request, document_id): - document = get_object_or_404(Document, pk=document_id) +def tag_attach(request, document_id=None, document_id_list=None): + if document_id: + documents = [get_object_or_404(Document, pk=document_id)] + post_action_redirect = reverse('tag_list') + 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 document.')) + return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/')) try: Permission.objects.check_permissions(request.user, [PERMISSION_TAG_ATTACH]) except PermissionDenied: - AccessEntry.objects.check_access(PERMISSION_TAG_ATTACH, request.user, document) + documents = AccessEntry.objects.filter_objects_by_access(PERMISSION_TAG_ATTACH, request.user, documents) - next = request.POST.get('next', request.GET.get('next', request.META.get('HTTP_REFERER', reverse('document_tags', args=[document.pk])))) + 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': form = TagListForm(request.POST, user=request.user) if form.is_valid(): tag = form.cleaned_data['tag'] - if tag in document.tags.all(): - messages.warning(request, _(u'Document is already tagged as "%s"') % tag) - return HttpResponseRedirect(next) - - document.tags.add(tag) - - messages.success(request, _(u'Tag "%s" attached successfully.') % tag) + for document in documents: + if tag in document.tags.all(): + messages.warning(request, _(u'Document "%(document)s" is already tagged as "%(tag)s"') % { + 'document': document, 'tag': tag} + ) + else: + document.tags.add(tag) + messages.success(request, _(u'Tag "%(tag)s" attached successfully to document "%(document)s".') % { + 'document': document, 'tag': tag} + ) return HttpResponseRedirect(next) else: form = TagListForm(user=request.user) - return render_to_response('generic_form.html', { - 'title': _(u'attach tag to: %s') % document, + context = { + 'object_name': _(u'document'), 'form': form, - 'object': document, + 'previous': previous, 'next': next, - }, - context_instance=RequestContext(request)) + } + + if len(documents) == 1: + context['object'] = documents[0] + context['title'] = _(u'Attach tag to document: %s.') % ', '.join([unicode(d) for d in documents]) + elif len(documents) > 1: + context['title'] = _(u'Attach tag to documents: %s.') % ', '.join([unicode(d) for d in documents]) + + return render_to_response('generic_form.html', context, + context_instance=RequestContext(request)) + + +def tag_multiple_attach(request): + return tag_attach( + request, document_id_list=request.GET.get('id_list', []) + ) def tag_list(request, queryset=None, extra_context=None):