1- from __future__ import absolute_import
2- from __future__ import with_statement
1+ from __future__ import absolute_import , unicode_literals
32
43from django import forms
54from django .conf import settings
1817from celery .utils .text import abbrtask
1918
2019from .admin_utils import action , display_field , fixedwidth
21- from .models import (TaskState , WorkerState ,
22- PeriodicTask , IntervalSchedule , CrontabSchedule )
20+ from .models import (
21+ TaskState , WorkerState ,
22+ PeriodicTask , IntervalSchedule , CrontabSchedule ,
23+ )
2324from .humanize import naturaldate
2425
2526
26- TASK_STATE_COLORS = {states .SUCCESS : " green" ,
27- states .FAILURE : " red" ,
28- states .REVOKED : " magenta" ,
29- states .STARTED : " yellow" ,
30- states .RETRY : " orange" ,
31- " RECEIVED" : " blue" }
32- NODE_STATE_COLORS = {" ONLINE" : " green" ,
33- " OFFLINE" : " gray" }
27+ TASK_STATE_COLORS = {states .SUCCESS : ' green' ,
28+ states .FAILURE : ' red' ,
29+ states .REVOKED : ' magenta' ,
30+ states .STARTED : ' yellow' ,
31+ states .RETRY : ' orange' ,
32+ ' RECEIVED' : ' blue' }
33+ NODE_STATE_COLORS = {' ONLINE' : ' green' ,
34+ ' OFFLINE' : ' gray' }
3435
3536
3637class MonitorList (main_views .ChangeList ):
@@ -40,38 +41,40 @@ def __init__(self, *args, **kwargs):
4041 self .title = self .model_admin .list_page_title
4142
4243
43- @display_field (_ (" state" ), " state" )
44+ @display_field (_ (' state' ), ' state' )
4445def colored_state (task ):
4546 state = escape (task .state )
46- color = TASK_STATE_COLORS .get (task .state , " black" )
47- return """ <b><span style="color: %s ;">%s </span></b>""" % (color , state )
47+ color = TASK_STATE_COLORS .get (task .state , ' black' )
48+ return ' <b><span style="color: {0} ;">{1} </span></b>' . format (color , state )
4849
4950
50- @display_field (_ (" state" ), " last_heartbeat" )
51+ @display_field (_ (' state' ), ' last_heartbeat' )
5152def node_state (node ):
52- state = node .is_alive () and " ONLINE" or " OFFLINE"
53+ state = node .is_alive () and ' ONLINE' or ' OFFLINE'
5354 color = NODE_STATE_COLORS [state ]
54- return """ <b><span style="color: %s ;">%s </span></b>""" % (color , state )
55+ return ' <b><span style="color: {0} ;">{1} </span></b>' . format (color , state )
5556
5657
57- @display_field (_ (" ETA" ), " eta" )
58+ @display_field (_ (' ETA' ), ' eta' )
5859def eta (task ):
5960 if not task .eta :
60- return """ <span style="color: gray;">none</span>"""
61+ return ' <span style="color: gray;">none</span>'
6162 return escape (task .eta )
6263
6364
64- @display_field (_ (" when" ), " tstamp" )
65+ @display_field (_ (' when' ), ' tstamp' )
6566def tstamp (task ):
66- return """<div title="%s">%s</div>""" % (escape (str (task .tstamp )),
67- escape (naturaldate (task .tstamp )))
67+ return '<div title="{0}">{1}</div>' .format (
68+ escape (str (task .tstamp )), escape (naturaldate (task .tstamp )),
69+ )
6870
6971
70- @display_field (_ (" name" ), " name" )
72+ @display_field (_ (' name' ), ' name' )
7173def name (task ):
7274 short_name = abbrtask (task .name , 16 )
73- return """<div title="%s"><b>%s</b></div>""" % (escape (task .name ),
74- escape (short_name ))
75+ return '<div title="{0}"><b>{1}</b></div>' .format (
76+ escape (task .name ), escape (short_name ),
77+ )
7578
7679
7780class ModelMonitor (admin .ModelAdmin ):
@@ -83,7 +86,7 @@ def get_changelist(self, request, **kwargs):
8386
8487 def change_view (self , request , object_id , extra_context = None ):
8588 extra_context = extra_context or {}
86- extra_context .setdefault (" title" , self .detail_title )
89+ extra_context .setdefault (' title' , self .detail_title )
8790 return super (ModelMonitor , self ).change_view (request , object_id ,
8891 extra_context )
8992
@@ -99,85 +102,85 @@ def has_add_permission(self, request):
99102
100103
101104class TaskMonitor (ModelMonitor ):
102- detail_title = _ (" Task detail" )
103- list_page_title = _ (" Tasks" )
104- rate_limit_confirmation_template = " djcelery/confirm_rate_limit.html"
105- date_hierarchy = " tstamp"
105+ detail_title = _ (' Task detail' )
106+ list_page_title = _ (' Tasks' )
107+ rate_limit_confirmation_template = ' djcelery/confirm_rate_limit.html'
108+ date_hierarchy = ' tstamp'
106109 fieldsets = (
107110 (None , {
108- " fields" : (" state" , " task_id" , " name" , " args" , " kwargs" ,
109- " eta" , " runtime" , " worker" , " tstamp" ),
110- " classes" : (" extrapretty" , ),
111+ ' fields' : (' state' , ' task_id' , ' name' , ' args' , ' kwargs' ,
112+ ' eta' , ' runtime' , ' worker' , ' tstamp' ),
113+ ' classes' : (' extrapretty' , ),
111114 }),
112- (" Details" , {
113- " classes" : (" collapse" , " extrapretty" ),
114- " fields" : (" result" , " traceback" , " expires" ),
115+ (' Details' , {
116+ ' classes' : (' collapse' , ' extrapretty' ),
117+ ' fields' : (' result' , ' traceback' , ' expires' ),
115118 }),
116119 )
117- list_display = (fixedwidth (" task_id" , name = _ (" UUID" ), pt = 8 ),
120+ list_display = (fixedwidth (' task_id' , name = _ (' UUID' ), pt = 8 ),
118121 colored_state ,
119122 name ,
120- fixedwidth (" args" , pretty = True ),
121- fixedwidth (" kwargs" , pretty = True ),
123+ fixedwidth (' args' , pretty = True ),
124+ fixedwidth (' kwargs' , pretty = True ),
122125 eta ,
123126 tstamp ,
124- " worker" )
125- readonly_fields = (" state" , " task_id" , " name" , " args" , " kwargs" ,
126- " eta" , " runtime" , " worker" , " result" , " traceback" ,
127- " expires" , " tstamp" )
128- list_filter = (" state" , " name" , " tstamp" , " eta" , " worker" )
129- search_fields = (" name" , " task_id" , " args" , " kwargs" , " worker__hostname" )
130- actions = [" revoke_tasks" ,
131- " terminate_tasks" ,
132- " kill_tasks" ,
133- " rate_limit_tasks" ]
134-
135- @action (_ (" Revoke selected tasks" ))
127+ ' worker' )
128+ readonly_fields = (' state' , ' task_id' , ' name' , ' args' , ' kwargs' ,
129+ ' eta' , ' runtime' , ' worker' , ' result' , ' traceback' ,
130+ ' expires' , ' tstamp' )
131+ list_filter = (' state' , ' name' , ' tstamp' , ' eta' , ' worker' )
132+ search_fields = (' name' , ' task_id' , ' args' , ' kwargs' , ' worker__hostname' )
133+ actions = [' revoke_tasks' ,
134+ ' terminate_tasks' ,
135+ ' kill_tasks' ,
136+ ' rate_limit_tasks' ]
137+
138+ @action (_ (' Revoke selected tasks' ))
136139 def revoke_tasks (self , request , queryset ):
137140 with current_app .default_connection () as connection :
138141 for state in queryset :
139142 revoke (state .task_id , connection = connection )
140143
141- @action (_ (" Terminate selected tasks" ))
144+ @action (_ (' Terminate selected tasks' ))
142145 def terminate_tasks (self , request , queryset ):
143146 with current_app .default_connection () as connection :
144147 for state in queryset :
145148 revoke (state .task_id , connection = connection , terminate = True )
146149
147- @action (_ (" Kill selected tasks" ))
150+ @action (_ (' Kill selected tasks' ))
148151 def kill_tasks (self , request , queryset ):
149152 with current_app .default_connection () as connection :
150153 for state in queryset :
151154 revoke (state .task_id , connection = connection ,
152- terminate = True , signal = " KILL" )
155+ terminate = True , signal = ' KILL' )
153156
154- @action (_ (" Rate limit selected tasks" ))
157+ @action (_ (' Rate limit selected tasks' ))
155158 def rate_limit_tasks (self , request , queryset ):
156159 tasks = set ([task .name for task in queryset ])
157160 opts = self .model ._meta
158161 app_label = opts .app_label
159- if request .POST .get (" post" ):
160- rate = request .POST [" rate_limit" ]
162+ if request .POST .get (' post' ):
163+ rate = request .POST [' rate_limit' ]
161164 with current_app .default_connection () as connection :
162165 for task_name in tasks :
163166 rate_limit (task_name , rate , connection = connection )
164167 return None
165168
166169 context = {
167- " title" : _ (" Rate limit selection" ),
168- " queryset" : queryset ,
169- " object_name" : force_unicode (opts .verbose_name ),
170- " action_checkbox_name" : helpers .ACTION_CHECKBOX_NAME ,
171- " opts" : opts ,
172- " app_label" : app_label ,
170+ ' title' : _ (' Rate limit selection' ),
171+ ' queryset' : queryset ,
172+ ' object_name' : force_unicode (opts .verbose_name ),
173+ ' action_checkbox_name' : helpers .ACTION_CHECKBOX_NAME ,
174+ ' opts' : opts ,
175+ ' app_label' : app_label ,
173176 }
174177
175178 return render_to_response (self .rate_limit_confirmation_template ,
176179 context , context_instance = RequestContext (request ))
177180
178181 def get_actions (self , request ):
179182 actions = super (TaskMonitor , self ).get_actions (request )
180- actions .pop (" delete_selected" , None )
183+ actions .pop (' delete_selected' , None )
181184 return actions
182185
183186 def queryset (self , request ):
@@ -187,31 +190,31 @@ def queryset(self, request):
187190
188191class WorkerMonitor (ModelMonitor ):
189192 can_add = True
190- detail_title = _ (" Node detail" )
191- list_page_title = _ (" Worker Nodes" )
192- list_display = (" hostname" , node_state )
193- readonly_fields = (" last_heartbeat" , )
194- actions = [" shutdown_nodes" ,
195- " enable_events" ,
196- " disable_events" ]
197-
198- @action (_ (" Shutdown selected worker nodes" ))
193+ detail_title = _ (' Node detail' )
194+ list_page_title = _ (' Worker Nodes' )
195+ list_display = (' hostname' , node_state )
196+ readonly_fields = (' last_heartbeat' , )
197+ actions = [' shutdown_nodes' ,
198+ ' enable_events' ,
199+ ' disable_events' ]
200+
201+ @action (_ (' Shutdown selected worker nodes' ))
199202 def shutdown_nodes (self , request , queryset ):
200- broadcast (" shutdown" , destination = [n .hostname for n in queryset ])
203+ broadcast (' shutdown' , destination = [n .hostname for n in queryset ])
201204
202- @action (_ (" Enable event mode for selected nodes." ))
205+ @action (_ (' Enable event mode for selected nodes.' ))
203206 def enable_events (self , request , queryset ):
204- broadcast (" enable_events" ,
207+ broadcast (' enable_events' ,
205208 destination = [n .hostname for n in queryset ])
206209
207- @action (_ (" Disable event mode for selected nodes." ))
210+ @action (_ (' Disable event mode for selected nodes.' ))
208211 def disable_events (self , request , queryset ):
209- broadcast (" disable_events" ,
212+ broadcast (' disable_events' ,
210213 destination = [n .hostname for n in queryset ])
211214
212215 def get_actions (self , request ):
213216 actions = super (WorkerMonitor , self ).get_actions (request )
214- actions .pop (" delete_selected" , None )
217+ actions .pop (' delete_selected' , None )
215218 return actions
216219
217220admin .site .register (TaskState , TaskMonitor )
@@ -231,25 +234,25 @@ def periodic_task_form():
231234 current_app .loader .import_default_modules ()
232235 tasks = list (sorted (name for name in current_app .tasks
233236 if not name .startswith ('celery.' )))
234- choices = (("" , "" ), ) + tuple (zip (tasks , tasks ))
237+ choices = (('' , '' ), ) + tuple (zip (tasks , tasks ))
235238
236239 class PeriodicTaskForm (forms .ModelForm ):
237- regtask = LaxChoiceField (label = _ (u" Task (registered)" ),
240+ regtask = LaxChoiceField (label = _ (' Task (registered)' ),
238241 choices = choices , required = False )
239- task = forms .CharField (label = _ (" Task (custom)" ), required = False ,
242+ task = forms .CharField (label = _ (' Task (custom)' ), required = False ,
240243 max_length = 200 )
241244
242245 class Meta :
243246 model = PeriodicTask
244247
245248 def clean (self ):
246249 data = super (PeriodicTaskForm , self ).clean ()
247- regtask = data .get (" regtask" )
250+ regtask = data .get (' regtask' )
248251 if regtask :
249- data [" task" ] = regtask
250- if not data [" task" ]:
251- exc = forms .ValidationError (_ (u" Need name of task" ))
252- self ._errors [" task" ] = self .error_class (exc .messages )
252+ data [' task' ] = regtask
253+ if not data [' task' ]:
254+ exc = forms .ValidationError (_ (' Need name of task' ))
255+ self ._errors [' task' ] = self .error_class (exc .messages )
253256 raise exc
254257 return data
255258
@@ -262,20 +265,20 @@ class PeriodicTaskAdmin(admin.ModelAdmin):
262265 list_display = ('__unicode__' , 'enabled' )
263266 fieldsets = (
264267 (None , {
265- " fields" : (" name" , " regtask" , " task" , " enabled" ),
266- " classes" : (" extrapretty" , " wide" ),
268+ ' fields' : (' name' , ' regtask' , ' task' , ' enabled' ),
269+ ' classes' : (' extrapretty' , ' wide' ),
267270 }),
268- (" Schedule" , {
269- " fields" : (" interval" , " crontab" ),
270- " classes" : (" extrapretty" , " wide" , ),
271+ (' Schedule' , {
272+ ' fields' : (' interval' , ' crontab' ),
273+ ' classes' : (' extrapretty' , ' wide' , ),
271274 }),
272- (" Arguments" , {
273- " fields" : (" args" , " kwargs" ),
274- " classes" : (" extrapretty" , " wide" , " collapse" ),
275+ (' Arguments' , {
276+ ' fields' : (' args' , ' kwargs' ),
277+ ' classes' : (' extrapretty' , ' wide' , ' collapse' ),
275278 }),
276- (" Execution Options" , {
277- " fields" : (" expires" , " queue" , " exchange" , " routing_key" ),
278- " classes" : (" extrapretty" , " wide" , " collapse" ),
279+ (' Execution Options' , {
280+ ' fields' : (' expires' , ' queue' , ' exchange' , ' routing_key' ),
281+ ' classes' : (' extrapretty' , ' wide' , ' collapse' ),
279282 }),
280283 )
281284
@@ -285,7 +288,7 @@ def __init__(self, *args, **kwargs):
285288
286289 def changelist_view (self , request , extra_context = None ):
287290 extra_context = extra_context or {}
288- scheduler = getattr (settings , " CELERYBEAT_SCHEDULER" , None )
291+ scheduler = getattr (settings , ' CELERYBEAT_SCHEDULER' , None )
289292 if scheduler != 'djcelery.schedulers.DatabaseScheduler' :
290293 extra_context ['wrong_scheduler' ] = True
291294 return super (PeriodicTaskAdmin , self ).changelist_view (request ,
0 commit comments