Skip to content

Commit 6232c79

Browse files
Armenak Baburyanauvipy
authored andcommitted
enhancement (#487)
Add enable/disable actions in PeriodicTaskAdmin. Extend list_display and search_fields. Write unit tests. Update change log.
1 parent 83ef918 commit 6232c79

File tree

4 files changed

+113
-1
lines changed

4 files changed

+113
-1
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,5 @@ Documentation/
1717
cover/
1818
coverage.xml
1919
nosetests.xml
20+
djcelery-test-db
21+
.idea/

Changelog

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,18 @@
5757

5858
Fix contributed by Vytis Banaitis.
5959

60+
- PeriodicTask admin list view changes:
61+
62+
- ``task``, ``args``, ``kwargs`` fields added to ``list_display``.
63+
64+
- Added ability to search tasks by ``name`` and ``task``.
65+
66+
- Tasks now ordered by ``('-enabled', 'name')``.
67+
68+
- Added enable/disable actions.
69+
70+
Contributed by Armenak Baburyan.
71+
6072
.. _version-3.1.17:
6173

6274
3.1.17

djcelery/admin.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,15 @@ def clean_kwargs(self):
320320
class PeriodicTaskAdmin(admin.ModelAdmin):
321321
form = PeriodicTaskForm
322322
model = PeriodicTask
323-
list_display = ('__unicode__', 'enabled')
323+
list_display = (
324+
'enabled',
325+
'__unicode__',
326+
'task',
327+
'args',
328+
'kwargs',
329+
)
330+
search_fields = ('name', 'task')
331+
ordering = ('-enabled', 'name')
324332
fieldsets = (
325333
(None, {
326334
'fields': ('name', 'regtask', 'task', 'enabled'),
@@ -339,6 +347,16 @@ class PeriodicTaskAdmin(admin.ModelAdmin):
339347
'classes': ('extrapretty', 'wide', 'collapse'),
340348
}),
341349
)
350+
actions = ['enable_tasks',
351+
'disable_tasks']
352+
353+
@action(_('Enable selected periodic tasks'))
354+
def enable_tasks(self, request, queryset):
355+
queryset.update(enabled=True)
356+
357+
@action(_('Disable selected periodic tasks'))
358+
def disable_tasks(self, request, queryset):
359+
queryset.update(enabled=False)
342360

343361
def changelist_view(self, request, extra_context=None):
344362
extra_context = extra_context or {}

djcelery/tests/test_admin.py

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
from __future__ import unicode_literals
2+
3+
from django.contrib import admin
4+
from django.test import RequestFactory, TestCase
5+
6+
from djcelery.admin import PeriodicTaskAdmin
7+
from djcelery.models import PeriodicTask, IntervalSchedule, PERIOD_CHOICES
8+
9+
10+
class MockRequest(object):
11+
pass
12+
13+
request = MockRequest()
14+
15+
site = admin.AdminSite()
16+
17+
18+
class TestPeriodicTaskAdmin(TestCase):
19+
@classmethod
20+
def setUpTestData(cls):
21+
cls.interval = IntervalSchedule.objects.create(
22+
every=1, period=PERIOD_CHOICES[0][0])
23+
24+
cls.request_factory = RequestFactory()
25+
26+
cls.pt_admin = PeriodicTaskAdmin(PeriodicTask, site)
27+
28+
def test_specified_ordering(self):
29+
"""
30+
Ordering should be by ('-enabled', 'name')
31+
"""
32+
PeriodicTask.objects.bulk_create([
33+
PeriodicTask(name='Bohemian Rhapsody', task='bohemian_rhapsody',
34+
interval=self.interval, enabled=True),
35+
PeriodicTask(name='Somebody to Love', task='somebody_to_love',
36+
interval=self.interval, enabled=False),
37+
PeriodicTask(name='Tie Your Mother Down',
38+
task='tie_your_mother_down',
39+
interval=self.interval, enabled=False),
40+
PeriodicTask(name='Under Pressure', task='under_pressure',
41+
interval=self.interval, enabled=True),
42+
])
43+
names = [b.name for b in self.pt_admin.get_queryset(request)]
44+
self.assertListEqual(['Bohemian Rhapsody', 'Under Pressure',
45+
'Somebody to Love', 'Tie Your Mother Down'],
46+
names)
47+
48+
def test_enable_tasks_should_enable_disabled_periodic_tasks(self):
49+
"""
50+
enable_tasks action should enable selected periodic tasks
51+
"""
52+
PeriodicTask.objects.create(name='Killer Queen', task='killer_queen',
53+
interval=self.interval, enabled=False),
54+
queryset = PeriodicTask.objects.filter(pk=1)
55+
self.pt_admin.enable_tasks(request, queryset)
56+
self.assertTrue(PeriodicTask.objects.get(pk=1).enabled)
57+
58+
def test_disable_tasks_should_disable_enabled_periodic_tasks(self):
59+
"""
60+
disable_tasks action should disable selected periodic tasks
61+
"""
62+
PeriodicTask.objects.create(name='Killer Queen', task='killer_queen',
63+
interval=self.interval, enabled=True),
64+
queryset = PeriodicTask.objects.filter(pk=1)
65+
self.pt_admin.disable_tasks(request, queryset)
66+
self.assertFalse(PeriodicTask.objects.get(pk=1).enabled)
67+
68+
def test_for_valid_search_fields(self):
69+
"""
70+
Valid search fields should be ('name', 'task')
71+
"""
72+
search_fields = self.pt_admin.search_fields
73+
self.assertEqual(search_fields, ('name', 'task'))
74+
75+
for fieldname in search_fields:
76+
query = '%s__icontains' % fieldname
77+
kwargs = {query: 'Queen'}
78+
# We have no content, so the number of results if we search on
79+
# something should be zero.
80+
self.assertEquals(PeriodicTask.objects.filter(**kwargs).count(), 0)

0 commit comments

Comments
 (0)