Skip to content

Commit 9e86b87

Browse files
bradshjgauvipy
authored andcommitted
added run action to periodic tasks admin (#52)
* added run action to periodic tasks admin * fixed flake8 line length issues * Added tests and updated changelog * map call changed to list comprehension * added self to AUTHORS * Update .travis.yml need rabbitmq service for CI * fixed flake8 line length issues
1 parent f014edc commit 9e86b87

File tree

5 files changed

+83
-2
lines changed

5 files changed

+83
-2
lines changed

.travis.yml

+1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ env:
2727
- TOXENV=pydocstyle
2828
- TOXENV=cov
2929
install: travis_retry pip install -U tox
30+
services: rabbitmq
3031
script: tox -v -- -v
3132
after_success:
3233
- .tox/$TRAVIS_PYTHON_VERSION/bin/coverage xml

AUTHORS

+1
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ Jeffrey Hu <[email protected]>
4646
4747
Jerzy Kozera <[email protected]>
4848
Jesper Noehr <[email protected]>
49+
Jimmy Bradshaw <[email protected]>
4950
Joey Wilhelm <[email protected]>
5051
John Andrews <johna@stjit011.(none)>
5152
John Watson <[email protected]>

Changelog

+9
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,15 @@
44
Change history
55
================
66

7+
.. _version-1.1.0:
8+
9+
1.1.0
10+
=====
11+
:release-date: TODO
12+
:release-by: TODO
13+
14+
- Adds "run now" admin action for tasks.
15+
716
.. _version-1.0.1:
817

918
1.0.1

django_celery_beat/admin.py

+22-2
Original file line numberDiff line numberDiff line change
@@ -111,12 +111,13 @@ def clean_kwargs(self):
111111

112112

113113
class PeriodicTaskAdmin(admin.ModelAdmin):
114-
"""Admin-interface for peridic tasks."""
114+
"""Admin-interface for periodic tasks."""
115115

116116
form = PeriodicTaskForm
117117
model = PeriodicTask
118+
celery_app = current_app
118119
list_display = ('__str__', 'enabled')
119-
actions = ('enable_tasks', 'disable_tasks')
120+
actions = ('enable_tasks', 'disable_tasks', 'run_tasks')
120121
fieldsets = (
121122
(None, {
122123
'fields': ('name', 'regtask', 'task', 'enabled'),
@@ -173,6 +174,25 @@ def disable_tasks(self, request, queryset):
173174
)
174175
disable_tasks.short_description = _('Disable selected tasks')
175176

177+
def run_tasks(self, request, queryset):
178+
self.celery_app.loader.import_default_modules()
179+
tasks = [(self.celery_app.tasks.get(task.task),
180+
loads(task.args),
181+
loads(task.kwargs))
182+
for task in queryset]
183+
task_ids = [task.delay(*args, **kwargs)
184+
for task, args, kwargs in tasks]
185+
tasks_run = len(task_ids)
186+
self.message_user(
187+
request,
188+
_('{0} task{1} {2} successfully run').format(
189+
tasks_run,
190+
pluralize(tasks_run),
191+
pluralize(tasks_run, _('was,were')),
192+
),
193+
)
194+
run_tasks.short_description = _('Run selected tasks')
195+
176196

177197
admin.site.register(IntervalSchedule)
178198
admin.site.register(CrontabSchedule)

t/unit/test_schedulers.py

+50
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,15 @@
55
from datetime import datetime, timedelta
66
from itertools import count
77

8+
from django.contrib.admin.sites import AdminSite
9+
from django.contrib.messages.storage.fallback import FallbackStorage
10+
from django.test import RequestFactory
11+
812
from celery.five import monotonic, text_t
913
from celery.schedules import schedule, crontab
1014

1115
from django_celery_beat import schedulers
16+
from django_celery_beat.admin import PeriodicTaskAdmin
1217
from django_celery_beat.models import (
1318
PeriodicTask, PeriodicTasks, IntervalSchedule, CrontabSchedule,
1419
)
@@ -425,3 +430,48 @@ def test_track_changes(self):
425430
y = PeriodicTasks.last_change()
426431
assert y
427432
assert y > x
433+
434+
435+
@pytest.mark.django_db()
436+
class test_modeladmin_PeriodicTaskAdmin(SchedulerCase):
437+
@pytest.mark.django_db()
438+
@pytest.fixture(autouse=True)
439+
def setup_scheduler(self, app):
440+
self.app = app
441+
self.site = AdminSite()
442+
self.request_factory = RequestFactory()
443+
444+
entry_name, entry = self.create_conf_entry()
445+
self.app.conf.beat_schedule = {entry_name: entry}
446+
self.m1 = PeriodicTask(name=entry_name)
447+
self.m1.task = 'celery.backend_cleanup'
448+
self.m1.save()
449+
450+
entry_name, entry = self.create_conf_entry()
451+
self.app.conf.beat_schedule = {entry_name: entry}
452+
self.m2 = PeriodicTask(name=entry_name)
453+
self.m2.task = 'celery.backend_cleanup'
454+
self.m2.save()
455+
456+
def patch_request(self, request):
457+
"""patch request to allow for django messages storage"""
458+
setattr(request, 'session', 'session')
459+
messages = FallbackStorage(request)
460+
setattr(request, '_messages', messages)
461+
return request
462+
463+
def test_run_task(self):
464+
ma = PeriodicTaskAdmin(PeriodicTask, self.site)
465+
self.request = self.patch_request(self.request_factory.get('/'))
466+
ma.run_tasks(self.request, PeriodicTask.objects.filter(id=self.m1.id))
467+
assert len(self.request._messages._queued_messages) == 1
468+
queued_message = self.request._messages._queued_messages[0].message
469+
assert queued_message == '1 task was successfully run'
470+
471+
def test_run_tasks(self):
472+
ma = PeriodicTaskAdmin(PeriodicTask, self.site)
473+
self.request = self.patch_request(self.request_factory.get('/'))
474+
ma.run_tasks(self.request, PeriodicTask.objects.all())
475+
assert len(self.request._messages._queued_messages) == 1
476+
queued_message = self.request._messages._queued_messages[0].message
477+
assert queued_message == '2 tasks were successfully run'

0 commit comments

Comments
 (0)