Refactor diagnostics app

This commit is contained in:
Roberto Rosario
2012-08-06 01:17:02 -04:00
parent 66c398c884
commit 9f84439099
9 changed files with 102 additions and 44 deletions

View File

@@ -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 diagnostics
from .links import diagnostic_list, diagnostic_execute
from .api import DiagnosticTool
register_tool(diagnostics)
register_tool(diagnostic_list)
bind_links(['diagnostic_list'], diagnostic_list, menu_name='secondary_menu')
bind_links([DiagnosticTool], diagnostic_execute)

View File

@@ -1,11 +1,55 @@
from common.utils import reverse_lazy
from navigation.api import bind_links
diagnostics = {}
from .links import diagnostic_list
tools = {}
def register_diagnostic(namespace, title, link):
namespace_dict = diagnostics.get(namespace, {'title': None, 'links': []})
namespace_dict['title'] = title
link.url = getattr(link, 'url', reverse_lazy(link.view))
namespace_dict['links'].append(link)
diagnostics[namespace] = namespace_dict
class DiagnosticNamespace(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 DiagnosticNamespace.tools_by_id[id]
@classmethod
def all(cls):
return DiagnosticNamespace.namespaces.keys()
def __init__(self, label):
self.label = label
self.tools = []
DiagnosticNamespace.namespaces[self] = self
def create_tool(self, link):
tool = DiagnosticTool(self, link)
self.add_tool(tool)
return tool
def add_tool(self, tool_instance):
self.tools.append(tool_instance)
tool_instance.id = len(DiagnosticNamespace.tools_by_id) + 1
DiagnosticNamespace.tools_by_id[tool_instance.id] = tool_instance
bind_links([tool_instance.link.view], diagnostic_list, menu_name='secondary_menu')
def __unicode__(self):
return unicode(self.label)
class DiagnosticTool(object):
def __init__(self, namespace, link):
self.namespace = namespace
self.link = link
def __unicode__(self):
return unicode(self.link.text)

View File

@@ -4,4 +4,5 @@ from django.utils.translation import ugettext_lazy as _
from navigation.api import Link
diagnostics = Link(text=_(u'diagnostics'), view='diagnostics', sprite='pill', icon='pill.png')
diagnostic_list = Link(text=_(u'diagnostics'), view='diagnostic_list', icon='pill.png', sprite='pill')
diagnostic_execute = Link(text=_(u'execute'), view='diagnostic_execute', args='object.id', sprite='lightning')

View File

@@ -1,5 +1,6 @@
from django.conf.urls.defaults import patterns, url
urlpatterns = patterns('diagnostics.views',
url(r'^$', 'diagnostics_view', (), 'diagnostics'),
url(r'^$', 'diagnostic_list', (), 'diagnostic_list'),
url(r'^execute/(?P<diagnostic_tool_id>\w+)/$', 'diagnostic_execute', (), 'diagnostic_execute'),
)

View File

@@ -1,15 +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.utils.text import capfirst
from .api import diagnostics
from common.utils import encapsulate
from permissions.models import Permission
from .api import DiagnosticNamespace
def diagnostics_view(request):
return render_to_response('diagnostics.html', {
'blocks': diagnostics,
'title': _(u'Diagnostics')
},
context_instance=RequestContext(request))
def diagnostic_list(request):
tool_list = []
for tool in DiagnosticNamespace.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'diagnostic 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))
def diagnostic_execute(request, diagnostic_tool_id):
tool = DiagnosticNamespace.tool_get(int(diagnostic_tool_id))
context = RequestContext(request)
resolve_link = tool.link.resolve(context)
return HttpResponseRedirect(resolve_link.url)