diff --git a/apps/document_indexing/__init__.py b/apps/document_indexing/__init__.py
index 34e3bdb9ec..23b06aa730 100644
--- a/apps/document_indexing/__init__.py
+++ b/apps/document_indexing/__init__.py
@@ -9,7 +9,7 @@ from django.db.models.signals import post_save, pre_delete, post_delete
from navigation.api import (register_top_menu, register_sidebar_template,
bind_links, Link)
-from maintenance.api import register_maintenance_links
+from maintenance.api import MaintenanceNamespace
from documents.models import Document
from metadata.models import DocumentMetadata
from project_setup.api import register_setup
@@ -25,7 +25,10 @@ from .links import (index_setup, index_setup_list, index_setup_create,
logger = logging.getLogger(__name__)
register_top_menu('indexes', link=Link(text=_('indexes'), sprite='tab', view='index_list', children_view_regex=[r'^index_[i,l]']))
-register_maintenance_links([rebuild_index_instances], namespace='document_indexing', title=_(u'Indexes'))
+
+namespace = MaintenanceNamespace(_(u'indexes'))
+namespace.create_tool(rebuild_index_instances)
+
register_sidebar_template(['index_instance_list'], 'indexing_help.html')
bind_links([IndexInstanceNode], [index_parent])
diff --git a/apps/documents/__init__.py b/apps/documents/__init__.py
index 2fd33a65a0..573cbf4607 100644
--- a/apps/documents/__init__.py
+++ b/apps/documents/__init__.py
@@ -9,7 +9,7 @@ from navigation.api import (bind_links, register_top_menu,
register_model_list_columns,
register_sidebar_template, Link, register_multi_item_links)
from diagnostics.api import register_diagnostic
-from maintenance.api import register_maintenance_links
+from maintenance.api import MaintenanceNamespace
from history.permissions import PERMISSION_HISTORY_VIEW
from project_setup.api import register_setup
from acls.api import class_permissions
@@ -87,7 +87,10 @@ bind_links(['document_page_transformation_edit', 'document_page_transformation_d
register_diagnostic('documents', _(u'Documents'), document_missing_list)
-register_maintenance_links([document_find_all_duplicates, document_update_page_count, document_clear_image_cache], namespace='documents', title=_(u'documents'))
+namespace = MaintenanceNamespace(_(u'documents'))
+namespace.create_tool(document_find_all_duplicates)
+namespace.create_tool(document_update_page_count)
+namespace.create_tool(document_clear_image_cache)
register_multi_item_links(['folder_view', 'search', 'results', 'index_instance_node_view', 'document_find_duplicates', 'document_type_document_list', 'document_group_view', 'document_list', 'document_list_recent'], [document_multiple_clear_transformations, document_multiple_delete, document_multiple_download])
diff --git a/apps/main/templates/tools.html b/apps/main/templates/tools.html
deleted file mode 100644
index 876fb77dcd..0000000000
--- a/apps/main/templates/tools.html
+++ /dev/null
@@ -1,22 +0,0 @@
-{% extends "base.html" %}
-
-{% block title %} :: {{ title|capfirst }}{% endblock %}
-
-{% block content %}
- {% for key, value in blocks.items %}
-
-
{{ value.title|capfirst }}
-
-
-
- {% for link in value.links %}
- -
- {% include "generic_subnavigation.html" %}{% if link.description %} - {{ link.description }}{% endif %}
-
- {% endfor %}
-
-
-
-
- {% endfor %}
-{% endblock %}
diff --git a/apps/maintenance/__init__.py b/apps/maintenance/__init__.py
index 8d4272726f..35fb1a199a 100644
--- a/apps/maintenance/__init__.py
+++ b/apps/maintenance/__init__.py
@@ -1,7 +1,11 @@
from __future__ import absolute_import
from project_tools.api import register_tool
+from navigation.api import bind_links
-from .links import maintenance_menu
+from .links import maintenance_menu, maintenance_execute
+from .api import MaintenanceTool
register_tool(maintenance_menu)
+bind_links(['maintenance_menu'], maintenance_menu, menu_name='secondary_menu')
+bind_links([MaintenanceTool], maintenance_execute)
diff --git a/apps/maintenance/api.py b/apps/maintenance/api.py
index 414a0a5f6d..e22f1dbe2e 100644
--- a/apps/maintenance/api.py
+++ b/apps/maintenance/api.py
@@ -1,12 +1,55 @@
-from common.utils import reverse_lazy
+from navigation.api import bind_links
+
+from .links import maintenance_menu
tools = {}
-def register_maintenance_links(links, title=None, namespace=None):
- namespace_dict = tools.get(namespace, {'title': None, 'links': []})
- namespace_dict['title'] = title
- for link in links:
- link.url = getattr(link, 'url', reverse_lazy(link.view))
- namespace_dict['links'].append(link)
- tools[namespace] = namespace_dict
+class MaintenanceNamespace(object):
+ namespaces = {}
+ tools_by_id = {}
+
+ @classmethod
+ def tool_all(cls):
+ tool_list = []
+ for namespace in cls.all():
+ for tool in namespace.tools:
+ tool_list.append(tool)
+
+ return tool_list
+
+ @classmethod
+ def tool_get(cls, id):
+ return MaintenanceNamespace.tools_by_id[id]
+
+ @classmethod
+ def all(cls):
+ return MaintenanceNamespace.namespaces.keys()
+
+ def __init__(self, label):
+ self.label = label
+ self.tools = []
+ MaintenanceNamespace.namespaces[self] = self
+
+ def create_tool(self, link):
+ tool = MaintenanceTool(self, link)
+ self.add_tool(tool)
+ return tool
+
+ def add_tool(self, tool_instance):
+ self.tools.append(tool_instance)
+ tool_instance.id = len(MaintenanceNamespace.tools_by_id) + 1
+ MaintenanceNamespace.tools_by_id[tool_instance.id] = tool_instance
+ bind_links([tool_instance.link.view], maintenance_menu, menu_name='secondary_menu')
+
+ def __unicode__(self):
+ return unicode(self.label)
+
+
+class MaintenanceTool(object):
+ def __init__(self, namespace, link):
+ self.namespace = namespace
+ self.link = link
+
+ def __unicode__(self):
+ return unicode(self.link.text)
diff --git a/apps/maintenance/links.py b/apps/maintenance/links.py
index cfe134213d..faa90660ea 100644
--- a/apps/maintenance/links.py
+++ b/apps/maintenance/links.py
@@ -4,4 +4,5 @@ from django.utils.translation import ugettext_lazy as _
from navigation.api import Link
-maintenance_menu = Link(text=_(u'maintenance'), view='maintenance_menu', sprite='wrench', icon='wrench.png')
+maintenance_menu = Link(text=_(u'maintenance tools'), view='maintenance_menu', icon='rainbow.png', sprite='rainbow')
+maintenance_execute = Link(text=_(u'execute'), view='maintenance_execute', args='object.id', sprite='lightning')
diff --git a/apps/maintenance/static/images/icons/rainbow.png b/apps/maintenance/static/images/icons/rainbow.png
new file mode 100755
index 0000000000..dc1fee0736
Binary files /dev/null and b/apps/maintenance/static/images/icons/rainbow.png differ
diff --git a/apps/maintenance/urls.py b/apps/maintenance/urls.py
index d12c9e8067..b04e289029 100644
--- a/apps/maintenance/urls.py
+++ b/apps/maintenance/urls.py
@@ -2,4 +2,5 @@ from django.conf.urls.defaults import patterns, url
urlpatterns = patterns('maintenance.views',
url(r'^$', 'maintenance_menu', (), 'maintenance_menu'),
+ url(r'^execute/(?P\w+)/$', 'maintenance_execute', (), 'maintenance_execute'),
)
diff --git a/apps/maintenance/views.py b/apps/maintenance/views.py
index d398466cf7..99e6b4b5e7 100644
--- a/apps/maintenance/views.py
+++ b/apps/maintenance/views.py
@@ -1,32 +1,43 @@
from __future__ import absolute_import
+from django.core.exceptions import PermissionDenied
+from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.utils.translation import ugettext_lazy as _
-from django.core.exceptions import PermissionDenied
+from django.utils.text import capfirst
+from common.utils import encapsulate
from permissions.models import Permission
-from .api import tools
+from .api import MaintenanceNamespace
def maintenance_menu(request):
- user_tools = {}
- for namespace, values in tools.items():
- user_tools[namespace] = {
- 'title': values['title']
- }
- user_tools[namespace].setdefault('links', [])
- for link in values['links']:
- try:
- permissions = link.permissions
- Permission.objects.check_permissions(request.user, permissions)
- user_tools[namespace]['links'].append(link)
- except PermissionDenied:
- pass
+ tool_list = []
+
+ for tool in MaintenanceNamespace.tool_all():
+ try:
+ Permission.objects.check_permissions(request.user, tool.link.permissions)
+ except PermissionDenied:
+ pass
+ else:
+ tool_list.append(tool)
+
+ return render_to_response('generic_list.html', {
+ 'title': _(u'maintenance tools'),
+ 'object_list': tool_list,
+ 'extra_columns': [
+ {'name': _(u'namespace'), 'attribute': encapsulate(lambda x: capfirst(x.namespace))},
+ {'name': _(u'label'), 'attribute': encapsulate(lambda x: capfirst(x.link.text))},
+ {'name': _(u'description'), 'attribute': 'link.description'},
+ ],
+ 'hide_object': True,
+ }, context_instance=RequestContext(request))
- return render_to_response('tools.html', {
- 'blocks': user_tools,
- 'title': _(u'maintenance menu')
- },
- context_instance=RequestContext(request))
+
+def maintenance_execute(request, maintenante_tool_id):
+ tool = MaintenanceNamespace.tool_get(int(maintenante_tool_id))
+ context = RequestContext(request)
+ resolve_link = tool.link.resolve(context)
+ return HttpResponseRedirect(resolve_link.url)
diff --git a/apps/ocr/__init__.py b/apps/ocr/__init__.py
index b5447d8fa7..6951824d64 100644
--- a/apps/ocr/__init__.py
+++ b/apps/ocr/__init__.py
@@ -12,7 +12,7 @@ from django.db.utils import DatabaseError
from navigation.api import (bind_links, register_multi_item_links,
register_multi_item_links)
from documents.models import Document, DocumentVersion
-from maintenance.api import register_maintenance_links
+from maintenance.api import MaintenanceNamespace
from project_tools.api import register_tool
from acls.api import class_permissions
from statistics.api import register_statistics
@@ -40,7 +40,8 @@ bind_links([Document], [submit_document])
bind_links([OCRProcessingSingleton], [ocr_disable, ocr_enable])
#register_multi_item_links(['queue_document_list'], [re_queue_multiple_document, queue_document_multiple_delete])
-register_maintenance_links([all_document_ocr_cleanup], namespace='ocr', title=_(u'OCR'))
+namespace = MaintenanceNamespace(label=_(u'OCR'))
+namespace.create_tool(all_document_ocr_cleanup)
register_multi_item_links(['folder_view', 'search', 'results', 'index_instance_node_view', 'document_find_duplicates', 'document_type_document_list', 'document_group_view', 'document_list', 'document_list_recent'], [submit_document_multiple])