From c1c02812b71246d4a324b5929b1c15fea7d70eef Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Sun, 17 Jun 2012 18:01:26 -0400 Subject: [PATCH] Add scheduled interval list view to the scheduler app --- apps/scheduler/__init__.py | 7 +++- apps/scheduler/api.py | 3 ++ apps/scheduler/links.py | 7 ++++ apps/scheduler/permissions.py | 8 ++++ apps/scheduler/static/images/icons/time.png | Bin 0 -> 2191 bytes apps/scheduler/urls.py | 5 +++ apps/scheduler/views.py | 40 +++++++++++++++++++- urls.py | 1 + 8 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 apps/scheduler/links.py create mode 100644 apps/scheduler/permissions.py create mode 100644 apps/scheduler/static/images/icons/time.png create mode 100644 apps/scheduler/urls.py diff --git a/apps/scheduler/__init__.py b/apps/scheduler/__init__.py index 80c406fd3b..84ee326f65 100644 --- a/apps/scheduler/__init__.py +++ b/apps/scheduler/__init__.py @@ -10,10 +10,12 @@ from django.dispatch import receiver from south.signals import pre_migrate from signaler.signals import pre_collectstatic +from project_tools.api import register_tool +from .links import job_list + logger = logging.getLogger(__name__) - @receiver(post_syncdb, dispatch_uid='scheduler_shutdown_post_syncdb') def scheduler_shutdown_post_syncdb(sender, **kwargs): logger.debug('Scheduler shut down on post syncdb signal') @@ -30,3 +32,6 @@ def sheduler_shutdown_pre_collectstatic(sender, **kwargs): def sheduler_shutdown_pre_migrate(sender, **kwargs): logger.debug('Scheduler shut down on pre_migrate signal') scheduler.shutdown() + + +register_tool(job_list) diff --git a/apps/scheduler/api.py b/apps/scheduler/api.py index 148320c3ab..83a3875eb2 100644 --- a/apps/scheduler/api.py +++ b/apps/scheduler/api.py @@ -25,3 +25,6 @@ def remove_job(name): scheduler.unschedule_job(registered_jobs[name]['job']) registered_jobs.pop(name) + +def get_job_list(): + return registered_jobs.values() diff --git a/apps/scheduler/links.py b/apps/scheduler/links.py new file mode 100644 index 0000000000..7190be22f9 --- /dev/null +++ b/apps/scheduler/links.py @@ -0,0 +1,7 @@ +from __future__ import absolute_import + +from django.utils.translation import ugettext_lazy as _ + +from .permissions import PERMISSION_VIEW_JOB_LIST + +job_list = {'text': _(u'interval job list'), 'view': 'job_list', 'icon': 'time.png', 'permissions': [PERMISSION_VIEW_JOB_LIST]} diff --git a/apps/scheduler/permissions.py b/apps/scheduler/permissions.py new file mode 100644 index 0000000000..203f675ff4 --- /dev/null +++ b/apps/scheduler/permissions.py @@ -0,0 +1,8 @@ +from __future__ import absolute_import + +from django.utils.translation import ugettext_lazy as _ + +from permissions.models import PermissionNamespace, Permission + +namespace = PermissionNamespace('scheduler', _(u'Scheduler')) +PERMISSION_VIEW_JOB_LIST = Permission.objects.register(namespace, 'jobs_list', _(u'View the interval job list')) diff --git a/apps/scheduler/static/images/icons/time.png b/apps/scheduler/static/images/icons/time.png new file mode 100644 index 0000000000000000000000000000000000000000..1caaec21027609b407672ae11726710b4d8cee96 GIT binary patch literal 2191 zcmV;A2ypj_P)MxxlPXn^l2+}HvR-}I9_Ze;;TZj;J{9yc7$8eFH{NgQzTcG< z-8|sesmdK14A)s#(vndZ^J>FvTn$L{N>y7jH4pG`)8b|LqQUC0pOF ziJaUu_<0Nvq5Jk!sJvP2_bj>%x6dudnU-Gkhr6(DZa2P^Ka9$pF({Q`fKa$J9K?r_ z9K6zAio&8YEUqrb2klpI_}%l+hOSli9<2M%^svlifGBx*{~{x=Z5Lf?C#N)=RmRJZzW^hZ;$2HUWG;dKN98uXwKN)t$>9DQBav19Mw z@p#=Dn5Jp}r_nr23uZKiXwkV00@z#n3 zH3*NH$d0w)*Gv15Qy!5KTLsA0#xCV29)5zG(ZInrmG zp_l^Wdgd>?K#M#x86e5^56&toD4lb#@a0eh)g=T#?tNkJaU$1H|D)wty0{W={NqFH{Ow6H z!cXDQZ4a;rCQAz(ky6J_)+ZdsV_e2(9_EANJNxm7V8Q)0vrEz5J%n$}(_n%U&=RPx ztF@CZ9#3Ig-6|}*>x(#c;vAmebre1_f)i0n$^kJ|9B4ODCZONOQJ z)b@=~V=+34sj1a0qrNC%*|^b!3Fcuw=1m)*@lP^oIZ7lN?MRcFJ!WzyvMgnX!z3e~ z+Wr7^I`gl*b{er*96x{h0h)IVwUdi(CQX~v2N}$`JZ7FWubydfiV!%SNG0i18TieM zM+t=7m$I<=2dfF)1+nd=!le6XE@{sTu8_P-x5%;a`~EPgzva=@4zBduJn2Wzyv|J8 zp_4n(#@Vu|Hp2r%LdHn~*8Cpq-1%3$e&nC1tzCj=o_Q4J__z&{b~_)-Ont`#(uQW9 z^gX6e@>8PGghs9--_j}`V`4`PC@3t3N5}4lBWOC&j5Vw7qF8%zb?^o&2SXhdWeZ4lNP>smVa}BL!OMoB&O+W?BX?{ zD{MT*4R|y#5A$VuAcgqI`QE{ilKlJvywgF2qfF4GYXIMNma`MeMbvLwXZy@bn)dPJ ze3+@F;6xO5&XBII2v^e0D5+PV)`0jJF71J&+12v5j=nJbl-b8ybbE@g+dsZ^+>U#? zz;OPUl*MM!ITbd6kTVMF+4>w(!ed;!AyG%$w`c`~hrSpm6W) zWI64SiIk;)Y2AcV0n;9`rnG1Fn>@f?fTr;32Ldm@Pw^j*;=Q)^L|4PwTWCpV+5-ua zp+v{~&$e~-z)v(UHA{qtHO?OUrsGRV8eFe*XRJBn0|%SzH;?&$>8=y*I@V_##$#N@ zXCCHbUYU`!qy2|}(Ks|b*xwoMhhLI15?AnvDb*q$$?3?+v{jO>#;uL zFdpMFKJzdi^JZShaguPj@yF{fb#-GrIu4U+|N4Up{i6=qBM+~&v)eI3a}JT^7|CNP zogTqnN9$RS^%;lp7?<&x$L0H2OU9i_vA^o;iwal$^wnEtm&5C$Hq7hABMT*JZ`ECA zsf>O`xMM3L0|XAAH?hB&idQ_2cr1nsS31#u?Ad$ATi(}Em@Se z@+W^O4;3Mln+HivMRt~fmDLhU=IHoBzWms+>xfu5ec41)i-nQVB&=A1&io)cDeDKD zo?AcOdYZ|*)4Tt~uGlrAM9(X$4&B$#7!2kXlu~`j^7&x|J$9^hYPXcz`Ph5rQcjnY zQWlb935>?Z(H$AU*x1lO-=DT_FbBI@XjzX-u0Hj$9SfmiXm!Ck9VZ^XMcS%Wyj8H}q}jh9rw5*EJ|$ zH!)M2TF$~GNz^4Aa*ta4hQAFzAuL{(T$^D{$~7WBle=ep(jCnI>-nDm0|3{st53%9 Re0Kl<002ovPDHLkV1mmWMbiKP literal 0 HcmV?d00001 diff --git a/apps/scheduler/urls.py b/apps/scheduler/urls.py new file mode 100644 index 0000000000..fde9602994 --- /dev/null +++ b/apps/scheduler/urls.py @@ -0,0 +1,5 @@ +from django.conf.urls.defaults import patterns, url + +urlpatterns = patterns('scheduler.views', + url(r'^list/$', 'job_list', (), 'job_list'), +) diff --git a/apps/scheduler/views.py b/apps/scheduler/views.py index 60f00ef0ef..3b4ef70a9a 100644 --- a/apps/scheduler/views.py +++ b/apps/scheduler/views.py @@ -1 +1,39 @@ -# Create your views here. +from __future__ import absolute_import + +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 permissions.models import Permission +from common.utils import encapsulate + +from .permissions import PERMISSION_VIEW_JOB_LIST +from .api import get_job_list + + +def job_list(request): + Permission.objects.check_permissions(request.user, [PERMISSION_VIEW_JOB_LIST]) + + context = { + 'object_list': get_job_list(), + 'title': _(u'interval jobs'), + 'extra_columns': [ + { + 'name': _(u'label'), + 'attribute': encapsulate(lambda job: job['title']) + }, + { + 'name': _(u'start date time'), + 'attribute': encapsulate(lambda job: job['job'].trigger.start_date) + }, + { + 'name': _(u'interval'), + 'attribute': encapsulate(lambda job: job['job'].trigger.interval) + }, + ], + 'hide_object': True, + } + + return render_to_response('generic_list.html', context, + context_instance=RequestContext(request)) diff --git a/urls.py b/urls.py index 51ea2cd311..acb5126eda 100644 --- a/urls.py +++ b/urls.py @@ -34,6 +34,7 @@ urlpatterns = patterns('', (r'^feedback/', include('feedback.urls')), (r'^checkouts/', include('checkouts.urls')), (r'^installation/', include('installation.urls')), + (r'^scheduler/', include('scheduler.urls')), )