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

-
-

-

-

- -
- {% 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])