Add multi document tag removal

This commit is contained in:
Roberto Rosario
2012-10-01 13:10:23 -04:00
parent 3186b8a300
commit 6318ec6076
4 changed files with 45 additions and 18 deletions

View File

@@ -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,

View File

@@ -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]}

View File

@@ -9,6 +9,7 @@ urlpatterns = patterns('tags.views',
url(r'^multiple/delete/$', 'tag_multiple_delete', (), 'tag_multiple_delete'),
url(r'^(?P<tag_id>\d+)/remove_from_document/(?P<document_id>\d+)/$', 'tag_remove', (), 'tag_remove'),
url(r'^(?P<tag_id>\d+)/remove_from_document/multiple/$', 'multiple_document_tag_remove', (), 'multiple_document_tag_remove'),
url(r'^multiple/remove_from_document/(?P<document_id>\d+)/$', 'tag_multiple_remove', (), 'tag_multiple_remove'),
url(r'^document/(?P<document_id>\d+)/add/$', 'tag_attach', (), 'tag_attach'),
url(r'^document/multiple/add/$', 'tag_multiple_attach', (), 'tag_multiple_attach'),

View File

@@ -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)