Add support for bulk document tag attaching
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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']}
|
||||
|
||||
@@ -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'),
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user