Add support for bulk document tag attaching

This commit is contained in:
Roberto Rosario
2012-10-01 12:10:19 -04:00
parent 1fa423b97d
commit c6e8709b84
4 changed files with 48 additions and 17 deletions

View File

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

View File

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

View File

@@ -11,6 +11,7 @@ urlpatterns = patterns('tags.views',
url(r'^(?P<tag_id>\d+)/remove_from_document/(?P<document_id>\d+)/$', 'tag_remove', (), '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'),
url(r'^document/(?P<document_id>\d+)/list/$', 'document_tags', (), 'document_tags'),
url(r'^(?P<tag_pk>\d+)/acl/list/$', 'tag_acl_list', (), 'tag_acl_list'),

View File

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