Skip to content

Commit 3121673

Browse files
committed
fix:creating new ONCE task without a scheduled time #270
1 parent ca2910c commit 3121673

File tree

4 files changed

+25
-2
lines changed

4 files changed

+25
-2
lines changed

docs/changelog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
### 🐛 Bug Fixes
66

77
- Add type hint for `JOB_METHODS_LIST`
8+
- Fix issue creating new `ONCE` task without a scheduled time #270
89

910
### 🧰 Maintenance
1011

scheduler/models/task.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,12 @@ def clean(self):
441441
if self.task_type == TaskType.REPEATABLE:
442442
self.clean_interval_unit()
443443
self.clean_result_ttl()
444+
if self.task_type == TaskType.ONCE and self.scheduled_time is None:
445+
raise ValidationError({"scheduled_time": ValidationError(_("Scheduled time is required"), code="invalid")})
446+
if self.task_type == TaskType.ONCE and self.scheduled_time < timezone.now():
447+
raise ValidationError(
448+
{"scheduled_time": ValidationError(_("Scheduled time must be in the future"), code="invalid")}
449+
)
444450

445451

446452
def get_next_cron_time(cron_string: Optional[str]) -> Optional[timezone.datetime]:

scheduler/tests/test_task_types/test_once_task.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
from datetime import timedelta
1+
from datetime import timedelta, datetime
22

3+
from django.core.exceptions import ValidationError
34
from django.utils import timezone
45

56
from scheduler import settings
@@ -18,6 +19,21 @@ def test_clean(self):
1819
job.callable = "scheduler.tests.jobs.test_job"
1920
self.assertIsNone(job.clean())
2021

22+
def test_create_without_date__fail(self):
23+
task = task_factory(self.task_type, scheduled_time=None, instance_only=True)
24+
self.assertIsNone(task.scheduled_time)
25+
with self.assertRaises(Exception) as cm:
26+
task.clean()
27+
self.assertTrue(isinstance(cm.exception, ValidationError))
28+
self.assertEqual(str(cm.exception), "{'scheduled_time': ['Scheduled time is required']}")
29+
30+
def test_create_with_date_in_the_past__fail(self):
31+
task = task_factory(self.task_type, scheduled_time=datetime.now() - timedelta(days=1), instance_only=True)
32+
with self.assertRaises(Exception) as cm:
33+
task.clean()
34+
self.assertTrue(isinstance(cm.exception, ValidationError))
35+
self.assertEqual(str(cm.exception), "{'scheduled_time': ['Scheduled time must be in the future']}")
36+
2137
def test_unschedulable_old_job(self):
2238
job = task_factory(self.task_type, scheduled_time=timezone.now() - timedelta(hours=1))
2339
self.assertFalse(job.is_scheduled())

uv.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)