Skip to content

Commit 4bf456f

Browse files
committed
[FIX] queue_job: skip on_fail when unconfigured
Job.on_fail_method_name was only set as an instance attribute when the job function configured on_fail_method, so on_fail() raised AttributeError for every job that didn't opt into it.
1 parent 260ea5c commit 4bf456f

2 files changed

Lines changed: 18 additions & 4 deletions

File tree

queue_job/job.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -432,10 +432,11 @@ def __init__(
432432
self.env["queue.job.function"].sudo().job_config(self.job_function_name)
433433
)
434434
on_fail_method_name = self.job_config.on_fail_method_name
435-
if on_fail_method_name:
436-
if not _is_model_method(getattr(self.recordset, on_fail_method_name, None)):
437-
raise TypeError("Job accepts only methods of Models")
438-
self.on_fail_method_name = on_fail_method_name
435+
if on_fail_method_name and not _is_model_method(
436+
getattr(self.recordset, on_fail_method_name, None)
437+
):
438+
raise TypeError("Job accepts only methods of Models")
439+
self.on_fail_method_name = on_fail_method_name
439440

440441
self.state = PENDING
441442

@@ -875,6 +876,8 @@ def set_failed(self, **kw):
875876
setattr(self, k, v)
876877

877878
def on_fail(self, fail_vals):
879+
if not self.on_fail_method_name:
880+
return
878881
on_fail_func = getattr(self.recordset, self.on_fail_method_name, None)
879882
if on_fail_func:
880883
on_fail_func(**fail_vals)

queue_job/tests/test_run_rob_controller.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,14 @@ def test_runjob_on_fail(self):
4949
RunJobController._runjob(self.env, job)
5050
self.assertEqual(job.state, "failed")
5151
self.assertEqual(mocked_hook.call_count, 1)
52+
53+
def test_runjob_on_fail_not_configured(self):
54+
job = self.env["queue.job"].with_delay()._test_job(failure_rate=1)
55+
with (
56+
self.assertRaises(JobError),
57+
patch("odoo.addons.queue_job.job.Job.in_temporary_env") as mocked_temp_env,
58+
mute_logger("odoo.addons.queue_job.controllers.main"),
59+
):
60+
mocked_temp_env.return_value.__enter__.return_value = self.env
61+
RunJobController._runjob(self.env, job)
62+
self.assertEqual(job.state, "failed")

0 commit comments

Comments
 (0)