From 18899f78f2b3b6ac43abf0ac85400154a09a9edc Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Thu, 18 Aug 2011 11:24:25 -0400 Subject: [PATCH] Improved tools menu using horizontal button widget just like the project_setup app --- apps/converter/__init__.py | 5 +++- .../static/images/icons/pictures.png | Bin 0 -> 1347 bytes apps/document_indexing/__init__.py | 4 +-- apps/documents/__init__.py | 4 +-- apps/history/__init__.py | 5 ++-- apps/history/static/images/icons/book.png | Bin 0 -> 858 bytes apps/main/__init__.py | 25 +++++++----------- apps/main/api.py | 2 +- .../static/images/icons/blackboard_sum.png | Bin 0 -> 1021 bytes apps/main/static/images/icons/bug.png | Bin 0 -> 2078 bytes apps/main/static/images/icons/pill.png | Bin 0 -> 1408 bytes apps/main/static/images/icons/wrench.png | Bin 0 -> 1347 bytes apps/main/urls.py | 2 +- apps/main/views.py | 4 +-- apps/ocr/__init__.py | 4 +-- apps/project_tools/__init__.py | 11 ++++++++ apps/project_tools/api.py | 5 ++++ apps/project_tools/models.py | 3 +++ apps/project_tools/tests.py | 23 ++++++++++++++++ apps/project_tools/urls.py | 5 ++++ apps/project_tools/views.py | 16 +++++++++++ settings.py | 1 + urls.py | 1 + 23 files changed, 91 insertions(+), 29 deletions(-) create mode 100644 apps/converter/static/images/icons/pictures.png create mode 100644 apps/history/static/images/icons/book.png create mode 100644 apps/main/static/images/icons/blackboard_sum.png create mode 100644 apps/main/static/images/icons/bug.png create mode 100644 apps/main/static/images/icons/pill.png create mode 100644 apps/main/static/images/icons/wrench.png create mode 100644 apps/project_tools/__init__.py create mode 100644 apps/project_tools/api.py create mode 100644 apps/project_tools/models.py create mode 100644 apps/project_tools/tests.py create mode 100644 apps/project_tools/urls.py create mode 100644 apps/project_tools/views.py diff --git a/apps/converter/__init__.py b/apps/converter/__init__.py index ffaef00c09..de30bc2350 100644 --- a/apps/converter/__init__.py +++ b/apps/converter/__init__.py @@ -2,11 +2,12 @@ from django.utils.translation import ugettext_lazy as _ from django.core.exceptions import ImproperlyConfigured from navigation.api import register_sidebar_template +from project_tools.api import register_tool from converter.utils import load_backend from converter.conf.settings import GRAPHICS_BACKEND -formats_list = {'text': _('file formats'), 'view': 'formats_list', 'famfam': 'pictures'} +formats_list = {'text': _('file formats'), 'view': 'formats_list', 'famfam': 'pictures', 'icon': 'pictures.png'} register_sidebar_template(['formats_list'], 'converter_file_formats_help.html') @@ -14,3 +15,5 @@ try: backend = load_backend().ConverterClass() except ImproperlyConfigured: raise ImproperlyConfigured(u'Missing or incorrect converter backend: %s' % GRAPHICS_BACKEND) + +register_tool(formats_list) diff --git a/apps/converter/static/images/icons/pictures.png b/apps/converter/static/images/icons/pictures.png new file mode 100644 index 0000000000000000000000000000000000000000..c392e90768301df0d93f0b8c16226723846927d8 GIT binary patch literal 1347 zcmV-J1-$x+P)IOiM?MTGvW$&3h3}(P$F)}6M4X8lKGB|7(g$610=9XmmdZZs}zFMbS08D!J8jRtw zhu34Pa{@#7Ot+nvAKj#1+8-5(xtEXWw32psH376eO0PK)E8oX{NLVtirEI_HSF=LUO!+)gyXrFCL8pf`}=hmu@snN699?3xlug*Qc-h8s{v8G{oqM# zw#W6vX2hNHi0cubaeve#VOAVauym#O7>$Vc?Zk3<5d+zI{fzg$tjDSGYOc+q*jyfO zkGQff2|b(?<8^c(P)Jt?5`bs6oB*d|=CAKl*giG~r$jT<7}i_$uuEK= z0Ew9mxSV{7SY7ptbbGh~7LCGO6u5NpMGE9SYPXU6XOi$0K}Q#+llw4u^O)ZJQffcq z1fbM_xPF2LIlz0dyhNKaB^8SXSycv+g)4|0e3U>exK>iTh`7_Eyn@`oZv4@|TXRRX z8n=E!g-A&Y5pNwUVg#REhtrg78-9Uumd#&&;W{b~JpWRT~Qd-#dQHJ(#@YUz1 zYBJ-*iH++oU~s@jtXM`V5hU(f0Nw^)zIVIUvGv0<$Q*eAlpyOSDCR}UuY2iLN|1Q< zPy!qJzQ9B0V#p6$NO{Dq9=_5KKyX&aIupGrLH*oWf~xA=vQ4DNW^w*IBJNv3;`&*j zh2fYB=XM@B{k-k6kGdG5f_IgmrfLbwKPm$>nn9QEA}05G#h$KIi5 zpO2K0^r0Vr3M8lnI-1!7x^qa5q3Cf*E?urEqWg(2yld1__%iW-5)^cT zGI99LD@`(^taA?3m0D*Bswy+?M^o<}z*&0$x=B!~#3CH&PqW%m|Aj>zat7&C67iLN zqS@uapP-c0)rGj1pbCXwFgQ`d^l$~KR8Z%_;K+WmV?;%x&hjek1;wl;9_T(n)l3Cu zsLnUA&r||v2_TrDe0}5wt`gLpXfvJ9d+KWQPFVNasuGmK96BwPxx7p|-_%s+on12`@nLJ6vqQq}p@R{x8v*om4) zJagQ!nLWLC1vKJ~M{nWT{TVn%pbMB0JiQ`p*aB`pem~P#GJol66TlWR!F=xF<<|r7 z-Us`|mmgp-p8+8fu3tO@8bf1s0YHW7JWFtrl&DR>vVoVcadhg{k!;qqs^0}2Y1nq6 zoIs^uVz511O7kk)aTO#|p_kV%S?L4J|fpTPT`x(OzUgeid{jyPsS>JBoq3 zANF9&Vn~7dYiHB8Hz-QSOIwk98lQXhrBeY^ex1D*11Jwk>G`O7)q|FyisR<%T}cBC zmV)lzEDW67l-(3H;DlOiaj?cfpq*n1s$`Ss;Q7^aqZqjJZZERP(I51tAiQ-AMv#kb z1of>q--DB*FrXq-7Su;%pf3foA*wy5pp@j1*xCoIc(Y@g5Q;yD49vwJVy_5St0340 zMt4F^tf?P2CsorNMzx8%q_X@N25L4qaLDMqO(a}uTVN~a=qDcu@VfWt}Xml&@|Az*++ny!` zy~nX!pD7+hdY=#W6m2k-qNnwiX4@YT9t*%iI-z{WMO)T69|5axDAI>YHvlGI?e6b< zIv*||g@yf{&oIrW>GIYsVScZyHNK8d$N&Wqy-+ps||(Hst4oUgsxl kKV74g`A4fh+rWS48a&I#ec!dHotCv&HBE# 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 IM6N<$f(-xdw*UYD literal 0 HcmV?d00001 diff --git a/apps/main/static/images/icons/pill.png b/apps/main/static/images/icons/pill.png new file mode 100644 index 0000000000000000000000000000000000000000..d483c825f0daf7ea67b9c14ea6ad2a128b7c260a GIT binary patch literal 1408 zcmV-`1%LX9P)gK2Fg|+5at0F{M{#dT3VZfn>OBuN0v!wba5CXU@Wa6 zmNAjYkckXKMlqo42I_s)h$hmj#I~)&>7P#jOk-I5eBo-QH5t?^MCZdw)$O$Ad` zcpUb$1wV}=kz~hw;Q@DPaGl^x)4&;eA@iK&MnLd&pCWkRj^Ujg7JY&oaR~0x#H^R&bZRnT7H2yeAnW+=r3YQ4(XaLkO#V!WE zNptpDu`yv|v+ZCyNGdnsrt@W!^JnT$JbExO5MXR z%?!6AKya`OEwv1S*N4T)AK;z1fOFR4WFkG8>1J{G4N_t{e0mv5wGs|BZ0Q1A>!?Z2 z0yijnmJTM%$fOlG0zG zX~W?H)((b3sgFY?!3z;^Saw0!tCT%+wS2hOrDG9w)(h7Vx@$j5hX0#{c0)GQ9C*@1 zd2lbs@Y{8S*1uIAe9Ay>b)@svksMqt7jA_%94sF`Wq>LtrVd@ErC}hKgzUe87s{|= zT`Tyeis*yxrsjN;(Tc;hg@qRka9^CqjqM$*!)+y6T=jK1xO^*I({ieEl9+)@H?6bt zg%=Fik4na|v-ojaTjpLVJ=!cdc^I5Pv!yy$b*Qw!BohjFGUlbzzx@?QAAKJO^S%9! z;nO!Hc0Z^lHGTL3p4-}nE>{I=1tE8WNfs5_;`d#}sU1i0d44&iWI<~BW7d2O6ij$X z^&}t3HSK>Zzkx{RHxsG+u{qxdORh*&i1~*G=WYM7Jaj?8|C`r80t^7Oz=+|=0l-)Q O0000sDbxhifn0-*AL0K>{Ap;iRi#q)< zHenF6iE&CPv1PpW4a!?v`Z9WZea_u&EDJD!yLgi)oR-t``# z5LrJM41(D_0$01Qfz>*h-}u#+e-jZh2{R|~$-La$)RK~C;r5?{(AW1X;7$mkN>xGO zt^&x&NQb72&BHifff1BS0R8?c-K*(pHNuOb`+5&>p%Abv3vRcYWDG;5A-LAvO*S1E zh9l~O=VTwHuzX?Y1|ZWQ1&%^-+@#l=N9clP6hIA=L({(NL0l>h~vb*d^wDQr6d z(=-J#nGD488jXgEVwR*7z>;Efdptmhr09qUxtxv8czV^dld1xV02zZB8{ZEcVp->1SG#U*Q?A$4Q zW?2U8HV1Tcb=?u$a7zMMRo#^-n&(s@Ed@_KUH~_58^Q1QVfaB269Y-xw+mu~0!2SC z4G)9KWI{imcz~&9Wa+rpJkx{5%ED$zc zpJ{Bm_%f*rQsk*>b-dHzAUz+#SQNo?1WuY~BLb+Dw;MIe>^zI^`Db9j=?9x90HH7s z%RB`E6k#&`22&qZ7USG048PcAl=$W&f`a1rp^bI{mGssZkLBbSn)NRf!4H=Cf8n?+ zhs!T`<{(JPiQ!l=>`~Sm5wK|=ppxGFJV#UTr1_J|BKY1+;QlB$1upj-SSQS`nGg3L z5Vtwn_xY{(0G(XhdUS7o?ziuh?|~mNbGw(oVI_Rh;- zfzP)$91+`U!|=5P$P!O?wZBpFbX7%R24+5s@Zjq3w(~Ff{`%$CX5p&|U=nqm?bZ8> zs!FsfXfw`&b1nEK{Slw>#;u5B!0Uame+e3-y56Zq2V@ZeCt9^nHbJounW z|1SaD*&$7Dhqeq2j_*q-aruH;}9I| z)r)XqG=Z(cqjx}|RVISdhb!ZmqsItFL$;m3$EM5>nsfBHS`95Y*CzIQSc;28L;&sZ zc<}}Ug2@m8E8w&C9{Yu3$8nxRN_g}U@UycEV4eEA(Lq5H1?xJxwmYLc?OE`yWQ;EAI3E=kt#M0|2Ppl4@!D+LQnQ002ovPDHLk FV1hY&c{%_9 literal 0 HcmV?d00001 diff --git a/apps/main/urls.py b/apps/main/urls.py index 7dfcdac26a..7ee8ceca8d 100644 --- a/apps/main/urls.py +++ b/apps/main/urls.py @@ -2,7 +2,7 @@ from django.conf.urls.defaults import patterns, url urlpatterns = patterns('main.views', url(r'^$', 'home', (), 'home'), - url(r'^tools_menu/$', 'tools_menu', (), 'tools_menu'), + url(r'^maintenance_menu/$', 'maintenance_menu', (), 'maintenance_menu'), url(r'^statistics/$', 'statistics', (), 'statistics'), url(r'^diagnostics/$', 'diagnostics_view', (), 'diagnostics'), ) diff --git a/apps/main/views.py b/apps/main/views.py index 879f4622b2..6a8bd805d3 100644 --- a/apps/main/views.py +++ b/apps/main/views.py @@ -21,7 +21,7 @@ def home(request): context_instance=RequestContext(request)) -def tools_menu(request): +def maintenance_menu(request): user_tools = {} for namespace, values in tools.items(): for link in values['links']: @@ -38,7 +38,7 @@ def tools_menu(request): return render_to_response('tools.html', { 'blocks': user_tools, - 'title': _(u'tools menu') + 'title': _(u'maintenance menu') }, context_instance=RequestContext(request)) diff --git a/apps/ocr/__init__.py b/apps/ocr/__init__.py index 0c558617dc..8a47afe201 100644 --- a/apps/ocr/__init__.py +++ b/apps/ocr/__init__.py @@ -14,7 +14,7 @@ from django.db.models.signals import post_save from navigation.api import register_links, register_top_menu, register_multi_item_links from permissions.api import register_permission, set_namespace_title from documents.models import Document -from main.api import register_tool +from main.api import register_maintenance from scheduler.api import register_interval_job @@ -68,7 +68,7 @@ register_multi_item_links(['queue_document_list'], [re_queue_multiple_document, register_links(['setup_queue_transformation_create', 'setup_queue_transformation_edit', 'setup_queue_transformation_delete', 'document_queue_disable', 'document_queue_enable', 'queue_document_list', 'node_active_list', 'setup_queue_transformation_list'], [queue_document_list, node_active_list], menu_name='secondary_menu') register_links(['setup_queue_transformation_edit', 'setup_queue_transformation_delete', 'setup_queue_transformation_list', 'setup_queue_transformation_create'], [setup_queue_transformation_create], menu_name='sidebar') -register_tool(all_document_ocr_cleanup, namespace='ocr', title=_(u'OCR')) +register_maintenance(all_document_ocr_cleanup, namespace='ocr', title=_(u'OCR')) #Menus register_top_menu('ocr', link={'text': _('OCR'), 'famfam': 'hourglass', 'view': 'queue_document_list'}, children_path_regex=[r'^ocr/']) diff --git a/apps/project_tools/__init__.py b/apps/project_tools/__init__.py new file mode 100644 index 0000000000..93f5de9f6e --- /dev/null +++ b/apps/project_tools/__init__.py @@ -0,0 +1,11 @@ +from django.utils.translation import ugettext_lazy as _ + +from navigation.api import register_top_menu + + +#TODO: FIXME dynamic children_path_regext on api register_setup +#register_top_menu('setup_menu', link={'text': _(u'setup'), 'view': 'setup_list', 'famfam': 'cog'}, children_path_regex=[r'^settings/', r'^user_management/', r'^permissions', r'^documents/type', r'^metadata/setup', r'sources/setup'], position=-2) + + +register_top_menu('tools', link={'text': _(u'tools'), 'view': 'tools_list', 'famfam': 'wrench'}, children_views=['statistics', 'history_list', 'formats_list'], position=-3) +#register_links(['tools_menu', 'statistics', 'history_list', 'history_view', 'formats_list'], [tools_menu, statistics, history_list, formats_list, sentry], menu_name='secondary_menu') diff --git a/apps/project_tools/api.py b/apps/project_tools/api.py new file mode 100644 index 0000000000..873a901af4 --- /dev/null +++ b/apps/project_tools/api.py @@ -0,0 +1,5 @@ +tool_items = [] + + +def register_tool(link): + tool_items.append(link) diff --git a/apps/project_tools/models.py b/apps/project_tools/models.py new file mode 100644 index 0000000000..71a8362390 --- /dev/null +++ b/apps/project_tools/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/apps/project_tools/tests.py b/apps/project_tools/tests.py new file mode 100644 index 0000000000..2247054b35 --- /dev/null +++ b/apps/project_tools/tests.py @@ -0,0 +1,23 @@ +""" +This file demonstrates two different styles of tests (one doctest and one +unittest). These will both pass when you run "manage.py test". + +Replace these with more appropriate tests for your application. +""" + +from django.test import TestCase + +class SimpleTest(TestCase): + def test_basic_addition(self): + """ + Tests that 1 + 1 always equals 2. + """ + self.failUnlessEqual(1 + 1, 2) + +__test__ = {"doctest": """ +Another way to test that 1 + 1 is equal to 2. + +>>> 1 + 1 == 2 +True +"""} + diff --git a/apps/project_tools/urls.py b/apps/project_tools/urls.py new file mode 100644 index 0000000000..f2ea9accf9 --- /dev/null +++ b/apps/project_tools/urls.py @@ -0,0 +1,5 @@ +from django.conf.urls.defaults import patterns, url + +urlpatterns = patterns('project_tools.views', + url(r'^list/$', 'tools_list', (), 'tools_list'), +) diff --git a/apps/project_tools/views.py b/apps/project_tools/views.py new file mode 100644 index 0000000000..19b01da3f6 --- /dev/null +++ b/apps/project_tools/views.py @@ -0,0 +1,16 @@ +from django.shortcuts import render_to_response, get_object_or_404 +from django.template import RequestContext +from django.utils.translation import ugettext_lazy as _ + +from project_tools.api import tool_items +from project_setup.widgets import setup_button_widget + + +def tools_list(request): + context = { + 'object_list': [setup_button_widget(request, item) for item in tool_items], + 'title': _(u'tools'), + } + + return render_to_response('generic_list_horizontal.html', context, + context_instance=RequestContext(request)) diff --git a/settings.py b/settings.py index d40a1b900b..32867a3281 100644 --- a/settings.py +++ b/settings.py @@ -126,6 +126,7 @@ INSTALLED_APPS = ( 'django.contrib.comments', 'django.contrib.staticfiles', 'project_setup', + 'project_tools', 'smart_settings', 'navigation', 'web_theme', diff --git a/urls.py b/urls.py index b5449b71ef..6127fe570e 100644 --- a/urls.py +++ b/urls.py @@ -27,6 +27,7 @@ urlpatterns = patterns('', (r'^converter/', include('converter.urls')), (r'^sources/', include('sources.urls')), (r'^project_setup/', include('project_setup.urls')), + (r'^project_tools/', include('project_tools.urls')), )