File tree Expand file tree Collapse file tree 2 files changed +37
-1
lines changed Expand file tree Collapse file tree 2 files changed +37
-1
lines changed Original file line number Diff line number Diff line change @@ -110,7 +110,6 @@ def is_due(self):
110110 now = self ._default_now ()
111111 if getattr (settings , 'DJANGO_CELERY_BEAT_TZ_AWARE' , True ):
112112 now = maybe_make_aware (self ._default_now ())
113-
114113 if now < self .model .start_time :
115114 # The datetime is before the start date - don't run.
116115 # send a delay to retry on start_time
@@ -119,6 +118,14 @@ def is_due(self):
119118 )
120119 return schedules .schedstate (False , delay )
121120
121+ # EXPIRED TASK: Disable task when expired
122+ if self .model .expires is not None :
123+ now = self ._default_now ()
124+ if now >= self .model .expires :
125+ self ._disable (self .model )
126+ # Don't recheck
127+ return schedules .schedstate (False , NEVER_CHECK_TIMEOUT )
128+
122129 # ONE OFF TASK: Disable one off tasks after they've ran once
123130 if self .model .one_off and self .model .enabled \
124131 and self .model .total_run_count > 0 :
Original file line number Diff line number Diff line change @@ -291,6 +291,35 @@ def test_one_off_task(self):
291291 assert not isdue
292292 assert delay == NEVER_CHECK_TIMEOUT
293293
294+ def test_task_with_expires (self ):
295+ interval = 10
296+ right_now = self .app .now ()
297+ one_second_later = right_now + timedelta (seconds = 1 )
298+ m = self .create_model_interval (schedule (timedelta (seconds = interval )),
299+ start_time = right_now ,
300+ expires = one_second_later )
301+ e = self .Entry (m , app = self .app )
302+ isdue , delay = e .is_due ()
303+ assert isdue
304+ assert delay == interval
305+
306+ m2 = self .create_model_interval (schedule (timedelta (seconds = interval )),
307+ start_time = right_now ,
308+ expires = right_now )
309+ e2 = self .Entry (m2 , app = self .app )
310+ isdue , delay = e2 .is_due ()
311+ assert not isdue
312+ assert delay == NEVER_CHECK_TIMEOUT
313+
314+ one_second_ago = right_now - timedelta (seconds = 1 )
315+ m2 = self .create_model_interval (schedule (timedelta (seconds = interval )),
316+ start_time = right_now ,
317+ expires = one_second_ago )
318+ e2 = self .Entry (m2 , app = self .app )
319+ isdue , delay = e2 .is_due ()
320+ assert not isdue
321+ assert delay == NEVER_CHECK_TIMEOUT
322+
294323
295324@pytest .mark .django_db
296325class test_DatabaseSchedulerFromAppConf (SchedulerCase ):
You can’t perform that action at this time.
0 commit comments