Skip to content

Commit c8e10ac

Browse files
dmitry-mukhinmaxmalysh
authored andcommitted
Fix DatabaseScheduler behavior when schedule is changed from interval to crontab (celery#351)
* add regression test for ModelEntry.from_entry * fix ModelEntry.from_entry and ModelEntry.__repr__ behavior
1 parent ee1cf57 commit c8e10ac

File tree

2 files changed

+20
-2
lines changed

2 files changed

+20
-2
lines changed

djcelery/schedulers.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,11 @@ def from_entry(cls, name, skip_fields=('relative', 'options'), **entry):
120120
fields.pop(skip_field, None)
121121
schedule = fields.pop('schedule')
122122
model_schedule, model_field = cls.to_model_schedule(schedule)
123+
124+
# reset schedule
125+
for t in cls.model_schedules:
126+
fields[t[2]] = None
127+
123128
fields[model_field] = model_schedule
124129
fields['args'] = dumps(fields.get('args') or [])
125130
fields['kwargs'] = dumps(fields.get('kwargs') or {})

djcelery/tests/test_schedulers.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,21 @@ def test_entry(self):
100100
self.assertGreater(e3.last_run_at, e2.last_run_at)
101101
self.assertEqual(e3.total_run_count, 1)
102102

103+
def test_from_entry(self):
104+
name = 'interval-vs-crontab'
105+
entry = {'task': 'djcelery.unittest.add{0}'.format(_next_id()),
106+
'args': '[2, 2]',
107+
'schedule': timedelta(hours=24),}
108+
self.Entry.from_entry(name, **entry)
109+
schedule1 = PeriodicTask.objects.get(name=name).schedule
110+
self.assertIsInstance(schedule1, schedule)
111+
112+
# update schedule
113+
entry['schedule'] = crontab(minute=0, hour='*/6')
114+
self.Entry.from_entry(name, **entry)
115+
schedule2 = PeriodicTask.objects.get(name=name).schedule
116+
self.assertIsInstance(schedule2, crontab)
117+
103118

104119
class test_DatabaseScheduler(unittest.TestCase):
105120
Scheduler = TrackingScheduler
@@ -145,8 +160,6 @@ def test_schedule_changed(self):
145160
self.m1.save()
146161
e1 = self.s.schedule[self.m1.name]
147162
self.assertListEqual(e1.args, [32, 32])
148-
e1 = self.s.schedule[self.m1.name]
149-
self.assertListEqual(e1.args, [32, 32])
150163

151164
self.m3.delete()
152165
self.assertRaises(KeyError, self.s.schedule.__getitem__, self.m3.name)

0 commit comments

Comments
 (0)