diff --git a/apps/common/templates/generic_detail.html b/apps/common/templates/generic_detail.html
index a4bba054d5..dba9f840dc 100644
--- a/apps/common/templates/generic_detail.html
+++ b/apps/common/templates/generic_detail.html
@@ -99,6 +99,7 @@
{% with subtemplate.main_object as main_object %}
{% with subtemplate.hide_link as hide_link %}
{% with subtemplate.hide_header as hide_header %}
+ {% with subtemplate.navigation_object_links as navigation_object_links %}
@@ -134,6 +135,7 @@
{% endwith %}
{% endwith %}
{% endwith %}
+ {% endwith %}
{% endfor %}
{% endblock %}
diff --git a/apps/documents/views.py b/apps/documents/views.py
index a574ca343b..9c9c6afe3e 100644
--- a/apps/documents/views.py
+++ b/apps/documents/views.py
@@ -24,6 +24,7 @@ from filesystem_serving.api import document_create_fs_links, document_delete_fs_
from filesystem_serving.conf.settings import FILESERVING_ENABLE
from permissions.api import check_permissions
from navigation.utils import resolve_to_name
+from tags.utils import get_tags_subtemplate
from documents.conf.settings import DELETE_STAGING_FILE_AFTER_UPLOAD
from documents.conf.settings import USE_STAGING_DIRECTORY
@@ -289,20 +290,10 @@ def document_view(request, document_id):
'object': document,
},
]
-
+
subtemplates_dict = []
if document.tags.count():
- subtemplates_dict.append(
- {
- 'name': 'generic_list_subtemplate.html',
- 'title': _(u'tags'),
- 'object_list': document.tags.all(),
- 'extra_columns': [
- {'name': _(u'color'), 'attribute': lambda x: u'' % x.tagproperties_set.get().get_color_code()}
- ],
- 'hide_link': True,
- }
- )
+ subtemplates_dict.append(get_tags_subtemplate(document))
subtemplates_dict.append(
{
@@ -851,17 +842,7 @@ def document_view_simple(request, document_id):
subtemplates_dict = []
if document.tags.count():
- subtemplates_dict.append(
- {
- 'name': 'generic_list_subtemplate.html',
- 'title': _(u'tags'),
- 'object_list': document.tags.all(),
- 'extra_columns': [
- {'name': _(u'color'), 'attribute': lambda x: u'' % x.tagproperties_set.get().get_color_code()}
- ],
- 'hide_link': True,
- }
- )
+ subtemplates_dict.append(get_tags_subtemplate(document))
subtemplates_dict.append(
{
diff --git a/apps/navigation/templatetags/navigation_tags.py b/apps/navigation/templatetags/navigation_tags.py
index 1ef1b16571..d117dc2339 100644
--- a/apps/navigation/templatetags/navigation_tags.py
+++ b/apps/navigation/templatetags/navigation_tags.py
@@ -140,6 +140,12 @@ def _get_object_navigation_links(context, menu_name=None, links_dict=object_navi
except VariableDoesNotExist:
obj = None
+ try:
+ navigation_object_links = Variable('navigation_object_links').resolve(context)
+ links_dict = navigation_object_links if navigation_object_links else object_navigation
+ except VariableDoesNotExist:
+ pass
+
try:
links = links_dict[menu_name][current_view]['links']
for link in resolve_links(context, links, current_view, current_path):
diff --git a/apps/tags/__init__.py b/apps/tags/__init__.py
index c9b9afa995..fb6caeab5c 100644
--- a/apps/tags/__init__.py
+++ b/apps/tags/__init__.py
@@ -9,18 +9,26 @@ from taggit.models import Tag
PERMISSION_TAG_CREATE = 'tag_create'
PERMISSION_TAG_ATTACH = 'tag_attach'
+PERMISSION_TAG_REMOVE = 'tag_remove'
PERMISSION_TAG_DELETE = 'tag_delete'
+PERMISSION_TAG_EDIT = 'tag_edit'
register_permissions('tags', [
- {'name': PERMISSION_TAG_CREATE, 'label': _(u'Can create new tags')},
- {'name': PERMISSION_TAG_ATTACH, 'label': _(u'Can attach exising tags')},
- {'name': PERMISSION_TAG_DELETE, 'label': _(u'Can delete tags')},
+ {'name': PERMISSION_TAG_CREATE, 'label': _(u'Create new tags')},
+ {'name': PERMISSION_TAG_ATTACH, 'label': _(u'Attach exising tags')},
+ {'name': PERMISSION_TAG_REMOVE, 'label': _(u'Remove tags from documents')},
+ {'name': PERMISSION_TAG_DELETE, 'label': _(u'Delete global tags')},
+ {'name': PERMISSION_TAG_EDIT, 'label': _(u'Edit global tags')},
])
tag_list = {'text': _('tags'), 'view': 'tag_list', 'famfam': 'tag_blue'}
-tag_delete = {'text': _('delete'), 'view': 'tag_remove', 'args': ['object.id', 'document.id'], 'famfam': 'tag_blue_delete', 'permissions': {'namespace': 'tags', 'permissions': [PERMISSION_TAG_DELETE]}}
+tag_document_remove = {'text': _('delete'), 'view': 'tag_remove', 'args': ['object.id', 'document.id'], 'famfam': 'tag_blue_delete', 'permissions': {'namespace': 'tags', 'permissions': [PERMISSION_TAG_REMOVE]}}
+tag_delete = {'text': _('delete'), 'view': 'tag_delete', 'args': 'object.id', 'famfam': 'tag_blue_delete', 'permissions': {'namespace': 'tags', 'permissions': [PERMISSION_TAG_DELETE]}}
+tag_multiple_delete = {'text': _('delete'), 'view': 'tag_multiple_delete', 'famfam': 'tag_blue_delete', 'permissions': {'namespace': 'tags', 'permissions': [PERMISSION_TAG_DELETE]}}
-register_links(Tag, [tag_delete])
+#register_links(Tag, [tag_delete])
+
+register_multi_item_links(['tag_list'], [tag_multiple_delete])
register_sidebar_template(['document_view', 'document_view_simple'], 'tags_sidebar_template.html')
@@ -32,4 +40,4 @@ tags_menu = [
},
]
-#register_menu(tags_menu)
+register_menu(tags_menu)
diff --git a/apps/tags/urls.py b/apps/tags/urls.py
index 3a7b0dfd30..a64a2b4a19 100644
--- a/apps/tags/urls.py
+++ b/apps/tags/urls.py
@@ -2,6 +2,9 @@ from django.conf.urls.defaults import patterns, url
urlpatterns = patterns('tags.views',
url(r'^list/$', 'tag_list', (), 'tag_list'),
+ url(r'^(?P\d+)/delete/$', 'tag_delete', (), 'tag_delete'),
+ 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'^add_to_document/(?P\d+)/$', 'tag_add', (), 'tag_add'),
)
diff --git a/apps/tags/utils.py b/apps/tags/utils.py
new file mode 100644
index 0000000000..60f2a0159e
--- /dev/null
+++ b/apps/tags/utils.py
@@ -0,0 +1,19 @@
+from django.utils.translation import ugettext as _
+
+from tags import tag_document_remove
+
+
+def get_tags_subtemplate(obj):
+ return {
+ 'name': 'generic_list_subtemplate.html',
+ 'title': _(u'tags'),
+ 'object_list': obj.tags.all(),
+ 'extra_columns': [
+ {'name': _(u'color'), 'attribute': lambda x: u'' % x.tagproperties_set.get().get_color_code()},
+ ],
+ 'hide_link': True,
+ 'navigation_object_links': {None: {
+ 'document_view_simple' : {'links': [tag_document_remove]},
+ 'document_view' : {'links': [tag_document_remove]}
+ }}
+ }
diff --git a/apps/tags/views.py b/apps/tags/views.py
index bd7ac68c5e..2ed9a3fbe3 100644
--- a/apps/tags/views.py
+++ b/apps/tags/views.py
@@ -3,7 +3,7 @@ from django.shortcuts import render_to_response, get_object_or_404
from django.template import RequestContext
from django.contrib import messages
from django.core.urlresolvers import reverse
-from django.utils.translation import ugettext as _
+from django.utils.translation import ugettext_lazy as _
from permissions.api import check_permissions
@@ -13,11 +13,11 @@ from documents.models import Document
from tags.forms import AddTagForm
from tags.models import TagProperties
from tags import PERMISSION_TAG_CREATE, PERMISSION_TAG_ATTACH, \
- PERMISSION_TAG_DELETE
+ PERMISSION_TAG_REMOVE, PERMISSION_TAG_DELETE, PERMISSION_TAG_EDIT
def tag_remove(request, tag_id, document_id):
- check_permissions(request.user, 'tags', [PERMISSION_TAG_DELETE])
+ check_permissions(request.user, 'tags', [PERMISSION_TAG_REMOVE])
tag = get_object_or_404(Tag, pk=tag_id)
document = get_object_or_404(Document, pk=document_id)
@@ -64,14 +64,66 @@ def tag_add(request, document_id):
TagProperties(tag=tag, color=form.cleaned_data['color']).save()
messages.success(request, _(u'Tag "%s" added successfully.') % tag_name)
-
+
return HttpResponseRedirect(previous)
def tag_list(request):
-
return render_to_response('generic_list.html', {
'object_list': Tag.objects.all(),
'title': _(u'tags'),
'hide_link': True,
+ 'multi_select_as_buttons': True,
}, context_instance=RequestContext(request))
+
+
+def tag_delete(request, tag_id=None, tag_id_list=None):
+ check_permissions(request.user, 'tags', [PERMISSION_TAG_DELETE])
+ post_action_redirect = None
+
+ if tag_id:
+ tags = [get_object_or_404(Tag, pk=tag_id)]
+ post_action_redirect = reverse('tag_list')
+ elif tag_id_list:
+ tags = [get_object_or_404(Tag, pk=tag_id) for tag_id in tag_id_list.split(',')]
+ else:
+ messages.error(request, _(u'Must provide at least one tag.'))
+ return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))
+
+ 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:
+ tag.delete()
+ messages.success(request, _(u'Tag "%s" deleted successfully.') % tag)
+ except Exception, e:
+ messages.error(request, _(u'Error deleting tag "%(tag)s": %(error)s') % {
+ 'tag': tag, 'error': e
+ })
+
+ return HttpResponseRedirect(next)
+
+ context = {
+ 'object_name': _(u'tag'),
+ 'delete_view': True,
+ 'previous': previous,
+ 'next': next,
+ }
+ if len(tags) == 1:
+ context['object'] = tags[0]
+ context['title'] = _(u'Are you sure you wish to delete the tag: %s?') % ', '.join([unicode(d) for d in tags])
+ context['message'] = _('Will be removed from all documents.')
+ elif len(tags) > 1:
+ context['title'] = _(u'Are you sure you wish to delete the tags: %s?') % ', '.join([unicode(d) for d in tags])
+ context['message'] = _('Will be removed from all documents.')
+
+ return render_to_response('generic_confirm.html', context,
+ context_instance=RequestContext(request))
+
+
+def tag_multiple_delete(request):
+ return tag_delete(
+ request, tag_id_list=request.GET.get('id_list', [])
+ )