Skip to content

Commit be6fdae

Browse files
committed
refactor
1 parent 5f61587 commit be6fdae

File tree

5 files changed

+35
-38
lines changed

5 files changed

+35
-38
lines changed

scheduler/models/task.py

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ def failure_callback(job: JobModel, connection, result, *args, **kwargs):
4545
task.job_name = None
4646
task.failed_runs += 1
4747
task.last_failed_run = timezone.now()
48-
task.save(schedule_job=True)
48+
task.save(schedule_job=True, clean=False)
4949

5050

5151
def success_callback(job: JobModel, connection: ConnectionType, result: Any, *args, **kwargs):
@@ -56,7 +56,7 @@ def success_callback(job: JobModel, connection: ConnectionType, result: Any, *ar
5656
task.job_name = None
5757
task.successful_runs += 1
5858
task.last_successful_run = timezone.now()
59-
task.save(schedule_job=True)
59+
task.save(schedule_job=True, clean=False)
6060

6161

6262
def get_queue_choices():
@@ -266,7 +266,7 @@ def unschedule(self) -> bool:
266266
if self.job_name is not None:
267267
self.rqueue.delete_job(self.job_name)
268268
self.job_name = None
269-
self.save(schedule_job=False)
269+
self.save(schedule_job=False, clean=False)
270270
return True
271271

272272
def _schedule_time(self) -> datetime:
@@ -360,7 +360,9 @@ def _schedule(self) -> bool:
360360
return True
361361

362362
def save(self, **kwargs):
363-
self.clean()
363+
should_clean = kwargs.pop("clean", True)
364+
if should_clean:
365+
self.clean()
364366
schedule_job = kwargs.pop("schedule_job", True)
365367
update_fields = kwargs.get("update_fields", None)
366368
if update_fields is not None:
@@ -407,12 +409,6 @@ def clean_interval_unit(self):
407409
code="invalid",
408410
params={"queue": self.queue, "interval": config.SCHEDULER_INTERVAL},
409411
)
410-
if self.interval_seconds() <= config.SCHEDULER_INTERVAL:
411-
raise ValidationError(
412-
_("Job interval is not a multiple of rq_scheduler's interval frequency: %(interval)ss"),
413-
code="invalid",
414-
params={"interval": config.SCHEDULER_INTERVAL},
415-
)
416412

417413
def clean_result_ttl(self) -> None:
418414
"""Throws an error if there are repeats left to run and the result_ttl won't last until the next scheduled time.

scheduler/tests/test_internals.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
class TestInternals(SchedulerBaseCase):
1313
def test_get_scheduled_job(self):
14-
task = task_factory(TaskType.ONCE, scheduled_time=timezone.now() - timedelta(hours=1))
14+
task = task_factory(TaskType.ONCE, scheduled_time=timezone.now() + timedelta(hours=1))
1515
self.assertEqual(task, get_scheduled_task(TaskType.ONCE, task.id))
1616
with self.assertRaises(ValueError):
1717
get_scheduled_task(task.task_type, task.id + 1)

scheduler/tests/test_mgmt_commands/test_import.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@ def test_import__should_schedule_job(self):
3232
# assert
3333
self.assertEqual(1, Task.objects.filter(task_type=TaskType.ONCE).count())
3434
self.assertEqual(1, Task.objects.filter(task_type=TaskType.REPEATABLE).count())
35-
tasks = Task.objects.filter(task_type=TaskType.ONCE).first()
35+
db_task = Task.objects.filter(task_type=TaskType.ONCE).first()
3636
attrs = ["name", "queue", "callable", "enabled", "timeout"]
3737
for attr in attrs:
38-
self.assertEqual(getattr(tasks[0], attr), getattr(tasks, attr))
38+
self.assertEqual(getattr(tasks[0], attr), getattr(db_task, attr))
3939

4040
def test_import__should_schedule_job_yaml(self):
4141
tasks = list()

scheduler/tests/test_task_types/test_once_task.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,5 +35,6 @@ def test_create_with_date_in_the_past__fail(self):
3535
self.assertEqual(str(cm.exception), "{'scheduled_time': ['Scheduled time must be in the future']}")
3636

3737
def test_unschedulable_old_job(self):
38-
task = task_factory(self.task_type, scheduled_time=timezone.now() - timedelta(hours=1))
38+
task = task_factory(self.task_type, scheduled_time=timezone.now() - timedelta(hours=1), instance_only=True)
39+
task.save(clean=False)
3940
self.assertFalse(task.is_scheduled())

scheduler/tests/test_task_types/test_repeatable_task.py

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313

1414

1515
class TestRepeatableTask(BaseTestCases.TestSchedulableTask):
16-
task_type = TaskType.REPEATABLE
1716
queue_name = settings.get_queue_names()[0]
1817

1918
def test_create_task_error(self):
@@ -35,6 +34,7 @@ def test_create_task_error(self):
3534
self.assertEqual(task.interval_unit, "seconds")
3635

3736
def test_create_task_without_scheduled_time(self):
37+
settings.SCHEDULER_CONFIG.SCHEDULER_INTERVAL = 10
3838
task = Task.objects.create(
3939
name="konichiva_every_2s",
4040
callable="scheduler.tests.jobs.test_args_kwargs",
@@ -52,34 +52,34 @@ def test_create_task_without_scheduled_time(self):
5252
self.assertEqual(task.interval_unit, "seconds")
5353

5454
def test_unschedulable_old_job(self):
55-
task = task_factory(self.task_type, scheduled_time=timezone.now() - timedelta(hours=1), repeat=0)
55+
task = task_factory(TaskType.REPEATABLE, scheduled_time=timezone.now() - timedelta(hours=1), repeat=0)
5656
self.assertFalse(task.is_scheduled())
5757

5858
def test_schedulable_old_job_repeat_none(self):
5959
# If repeat is None, the job should be scheduled
60-
task = task_factory(self.task_type, scheduled_time=timezone.now() - timedelta(hours=1), repeat=None)
60+
task = task_factory(TaskType.REPEATABLE, scheduled_time=timezone.now() - timedelta(hours=1), repeat=None)
6161
self.assertTrue(task.is_scheduled())
6262

6363
def test_clean(self):
64-
task = task_factory(self.task_type)
64+
task = task_factory(TaskType.REPEATABLE)
6565
task.queue = self.queue_name
6666
task.callable = "scheduler.tests.jobs.test_job"
6767
task.interval = 1
6868
task.success_ttl = -1
6969
self.assertIsNone(task.clean())
7070

7171
def test_clean_seconds(self):
72-
task = task_factory(self.task_type)
72+
task = task_factory(TaskType.REPEATABLE)
7373
task.queue = self.queue_name
7474
task.callable = "scheduler.tests.jobs.test_job"
7575
task.interval = 60
7676
task.success_ttl = -1
7777
task.interval_unit = "seconds"
78-
self.assertIsNone(task.clean())
78+
task.clean()
7979

8080
@override_settings(SCHEDULER_CONFIG=SchedulerConfiguration(SCHEDULER_INTERVAL=10))
8181
def test_clean_too_frequent(self):
82-
task = task_factory(self.task_type)
82+
task = task_factory(TaskType.REPEATABLE)
8383
task.queue = self.queue_name
8484
task.callable = "scheduler.tests.jobs.test_job"
8585
task.interval = 2 # Smaller than 10
@@ -89,7 +89,7 @@ def test_clean_too_frequent(self):
8989
task.clean_interval_unit()
9090

9191
def test_clean_short_result_ttl(self):
92-
task = task_factory(self.task_type)
92+
task = task_factory(TaskType.REPEATABLE)
9393
task.queue = self.queue_name
9494
task.callable = "scheduler.tests.jobs.test_job"
9595
task.interval = 1
@@ -101,7 +101,7 @@ def test_clean_short_result_ttl(self):
101101
task.clean_result_ttl()
102102

103103
def test_clean_indefinite_result_ttl(self):
104-
task = task_factory(self.task_type)
104+
task = task_factory(TaskType.REPEATABLE)
105105
task.queue = self.queue_name
106106
task.callable = "scheduler.tests.jobs.test_job"
107107
task.interval = 1
@@ -110,72 +110,72 @@ def test_clean_indefinite_result_ttl(self):
110110
task.clean_result_ttl()
111111

112112
def test_clean_undefined_result_ttl(self):
113-
task = task_factory(self.task_type)
113+
task = task_factory(TaskType.REPEATABLE)
114114
task.queue = self.queue_name
115115
task.callable = "scheduler.tests.jobs.test_job"
116116
task.interval = 1
117117
task.interval_unit = "hours"
118118
task.clean_result_ttl()
119119

120120
def test_interval_seconds_weeks(self):
121-
task = task_factory(self.task_type, interval=2, interval_unit="weeks")
121+
task = task_factory(TaskType.REPEATABLE, interval=2, interval_unit="weeks")
122122
self.assertEqual(1209600.0, task.interval_seconds())
123123

124124
def test_interval_seconds_days(self):
125-
task = task_factory(self.task_type, interval=2, interval_unit="days")
125+
task = task_factory(TaskType.REPEATABLE, interval=2, interval_unit="days")
126126
self.assertEqual(172800.0, task.interval_seconds())
127127

128128
def test_interval_seconds_hours(self):
129-
task = task_factory(self.task_type, interval=2, interval_unit="hours")
129+
task = task_factory(TaskType.REPEATABLE, interval=2, interval_unit="hours")
130130
self.assertEqual(7200.0, task.interval_seconds())
131131

132132
def test_interval_seconds_minutes(self):
133-
task = task_factory(self.task_type, interval=15, interval_unit="minutes")
133+
task = task_factory(TaskType.REPEATABLE, interval=15, interval_unit="minutes")
134134
self.assertEqual(900.0, task.interval_seconds())
135135

136136
def test_interval_seconds_seconds(self):
137-
task = task_factory(self.task_type, interval=15, interval_unit="seconds")
137+
task = task_factory(TaskType.REPEATABLE, interval=15, interval_unit="seconds")
138138
self.assertEqual(15.0, task.interval_seconds())
139139

140140
def test_result_interval(self):
141-
task = task_factory(self.task_type)
141+
task = task_factory(TaskType.REPEATABLE)
142142
entry = _get_task_scheduled_job_from_registry(task)
143143
self.assertEqual(entry.meta["interval"], 3600)
144144

145145
def test_repeat(self):
146-
task = task_factory(self.task_type, repeat=10)
146+
task = task_factory(TaskType.REPEATABLE, repeat=10)
147147
entry = _get_task_scheduled_job_from_registry(task)
148148
self.assertEqual(entry.meta["repeat"], 10)
149149

150150
def test_repeat_old_job_exhausted(self):
151151
base_time = timezone.now()
152-
task = task_factory(self.task_type, scheduled_time=base_time - timedelta(hours=10), repeat=10)
152+
task = task_factory(TaskType.REPEATABLE, scheduled_time=base_time - timedelta(hours=10), repeat=10)
153153
self.assertEqual(task.is_scheduled(), False)
154154

155155
def test_repeat_old_job_last_iter(self):
156156
base_time = timezone.now()
157-
task = task_factory(self.task_type, scheduled_time=base_time - timedelta(hours=9, minutes=30), repeat=10)
157+
task = task_factory(TaskType.REPEATABLE, scheduled_time=base_time - timedelta(hours=9, minutes=30), repeat=10)
158158
self.assertEqual(task.repeat, 0)
159159
self.assertEqual(task.is_scheduled(), True)
160160

161161
def test_repeat_old_job_remaining(self):
162162
base_time = timezone.now()
163-
task = task_factory(self.task_type, scheduled_time=base_time - timedelta(minutes=30), repeat=5)
163+
task = task_factory(TaskType.REPEATABLE, scheduled_time=base_time - timedelta(minutes=30), repeat=5)
164164
self.assertEqual(task.repeat, 4)
165165
self.assertEqual(task.scheduled_time, base_time + timedelta(minutes=30))
166166
self.assertEqual(task.is_scheduled(), True)
167167

168168
def test_repeat_none_interval_2_min(self):
169169
base_time = timezone.now()
170-
task = task_factory(self.task_type, scheduled_time=base_time - timedelta(minutes=29), repeat=None)
170+
task = task_factory(TaskType.REPEATABLE, scheduled_time=base_time - timedelta(minutes=29), repeat=None)
171171
task.interval = 120
172172
task.interval_unit = "seconds"
173173
task.save()
174174
self.assertTrue(task.scheduled_time > base_time)
175175
self.assertTrue(task.is_scheduled())
176176

177177
def test_check_rescheduled_after_execution(self):
178-
task = task_factory(self.task_type, scheduled_time=timezone.now() + timedelta(seconds=1), repeat=10)
178+
task = task_factory(TaskType.REPEATABLE, scheduled_time=timezone.now() + timedelta(seconds=1), repeat=10)
179179
queue = task.rqueue
180180
first_run_id = task.job_name
181181
entry = JobModel.get(first_run_id, connection=queue.connection)
@@ -190,7 +190,7 @@ def test_check_rescheduled_after_execution(self):
190190

191191
def test_check_rescheduled_after_execution_failed_job(self):
192192
task = task_factory(
193-
self.task_type,
193+
TaskType.REPEATABLE,
194194
callable_name="scheduler.tests.jobs.failing_job",
195195
scheduled_time=timezone.now() + timedelta(seconds=1),
196196
repeat=10,
@@ -209,7 +209,7 @@ def test_check_rescheduled_after_execution_failed_job(self):
209209

210210
def test_check_not_rescheduled_after_last_repeat(self):
211211
task = task_factory(
212-
self.task_type,
212+
TaskType.REPEATABLE,
213213
scheduled_time=timezone.now() + timedelta(seconds=1),
214214
repeat=1,
215215
)

0 commit comments

Comments
 (0)