Skip to content

Commit e64c029

Browse files
ldmbermanauvipy
authored andcommitted
#360 - adding classmethods to DatabaseScheduler for simple dynamic task ... (#361)
* #360 - adding classmethods to DatabaseScheduler for simple dynamic task manipulations * Update Changelog
1 parent 8d830b2 commit e64c029

File tree

3 files changed

+47
-0
lines changed

3 files changed

+47
-0
lines changed

Changelog

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@
4141

4242
Fix contributed by Vytis Banaitis.
4343

44+
- Added friendly API for dynamically creating/updating/deleting tasks
45+
46+
Fix contributed by Lev Berman
47+
4448
.. _version-3.1.17:
4549

4650
3.1.17

djcelery/schedulers.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,3 +254,17 @@ def schedule(self):
254254
repr(entry) for entry in itervalues(self._schedule)),
255255
)
256256
return self._schedule
257+
258+
@classmethod
259+
def create_or_update_task(cls, name, **schedule_dict):
260+
if 'schedule' not in schedule_dict:
261+
try:
262+
schedule_dict['schedule'] = \
263+
PeriodicTask._default_manager.get(name=name).schedule
264+
except PeriodicTask.DoesNotExist:
265+
pass
266+
cls.Entry.from_entry(name, **schedule_dict)
267+
268+
@classmethod
269+
def delete_task(cls, name):
270+
PeriodicTask._default_manager.get(name=name).delete()

djcelery/tests/test_schedulers.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,35 @@ def test_sync_rollback_on_save_error(self):
214214
self.s._dirty.add(self.m1.name)
215215
self.assertRaises(RuntimeError, self.s.sync)
216216

217+
def test_dynamic_create_update_delete_task(self):
218+
schedule_dict = {
219+
'task': 'some_task',
220+
'schedule': timedelta(seconds=5),
221+
'args': ('arg1', 'arg2'),
222+
}
223+
task1_name = 'test_task 1'
224+
task2_name = 'test_task 2'
225+
schedulers.DatabaseScheduler.create_or_update_task(task1_name,
226+
**schedule_dict)
227+
schedulers.DatabaseScheduler.create_or_update_task(task2_name,
228+
**schedule_dict)
229+
PeriodicTask.objects.get(name=task1_name) # assert not raises
230+
PeriodicTask.objects.get(name=task2_name)
231+
schedulers.DatabaseScheduler.create_or_update_task(task1_name,
232+
args=('arg3',))
233+
self.assertEqual(PeriodicTask.objects.get(name=task1_name).args,
234+
u'["arg3"]')
235+
schedulers.DatabaseScheduler.create_or_update_task(
236+
task2_name, schedule=timedelta(10))
237+
self.assertEqual(PeriodicTask.objects.get(name=task2_name).schedule,
238+
timedelta(10))
239+
schedulers.DatabaseScheduler.delete_task(task1_name)
240+
schedulers.DatabaseScheduler.delete_task(task2_name)
241+
self.assertRaises(PeriodicTask.DoesNotExist,
242+
lambda: PeriodicTask.objects.get(name=task1_name))
243+
self.assertRaises(PeriodicTask.DoesNotExist,
244+
lambda: PeriodicTask.objects.get(name=task2_name))
245+
217246

218247
class test_models(unittest.TestCase):
219248

0 commit comments

Comments
 (0)