From d1f1db6d1227b32f0b6dee8246285074f936cdfd Mon Sep 17 00:00:00 2001 From: Akim Juillerat Date: Fri, 24 Jul 2026 20:34:04 +0200 Subject: [PATCH 1/7] [IMP] edi_queue_oca: Update exchange record on failed jobs Rely on new on fail hooks from the queue job module. --- edi_queue_oca/models/edi_exchange_record.py | 33 ++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/edi_queue_oca/models/edi_exchange_record.py b/edi_queue_oca/models/edi_exchange_record.py index c8ddeff7d..aca3108c3 100644 --- a/edi_queue_oca/models/edi_exchange_record.py +++ b/edi_queue_oca/models/edi_exchange_record.py @@ -36,7 +36,16 @@ def _register_hook(self): return super()._register_hook() def action_exchange_send_job_options(self): - return {"priority": 0} + return {"priority": 0, "on_fail_method": self._send_job_failed_hook} + + def action_exchange_receive_job_options(self): + return {"on_fail_method": self._receive_job_failed_hook} + + def action_exchange_process_job_options(self): + return {"on_fail_method": self._process_job_failed_hook} + + def action_exchange_generate_job_options(self): + return {"on_fail_method": self._generate_job_failed_hook} def _job_delay_params(self): params = {} @@ -102,3 +111,25 @@ def action_exchange_generate_send_chained(self): # Raise prio to max to send the record out as fast as possible. job1.on_done(self.delayable(priority=0).action_exchange_send()) job1.delay() + + def _generate_job_failed_hook(self, **kw): + return self._job_failed_hook("validate_error", kw=kw) + + def _send_job_failed_hook(self, **kw): + return self._job_failed_hook("output_error_on_send", kw=kw) + + def _receive_job_failed_hook(self, **kw): + return self._job_failed_hook("input_receive_error", kw=kw) + + def _process_job_failed_hook(self, **kw): + return self._job_failed_hook("input_processed_error", kw=kw) + + def _job_failed_hook(self, failed_state, **kw): + self.ensure_one() + self.write( + { + "edi_exchange_state": failed_state, + "exchange_error": ": ".join(kw["exc_name"], kw["exc_message"]), + "exchange_error_traceback": kw["exc_info"], + } + ) From 743075a34724e901cf827aa2021dc0715a67de04 Mon Sep 17 00:00:00 2001 From: Akim Juillerat Date: Fri, 24 Jul 2026 20:38:25 +0200 Subject: [PATCH 2/7] [FIXME] test-requirements.txt --- test-requirements.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 test-requirements.txt diff --git a/test-requirements.txt b/test-requirements.txt new file mode 100644 index 000000000..cc626322b --- /dev/null +++ b/test-requirements.txt @@ -0,0 +1 @@ +odoo-addon-queue_job @ git+https://github.com/OCA/queue.git@refs/pull/955/head#subdirectory=queue_job From acb28029a2642b145c4d68d29f6a6d8f814fe1cd Mon Sep 17 00:00:00 2001 From: Akim Juillerat Date: Thu, 13 Aug 2026 21:37:02 +0200 Subject: [PATCH 3/7] [IMP] edi_queue_oca: Use on fail from queue.job.function Adapt implementation after definition of on fail method was moved from the delayable call to the job function. --- edi_queue_oca/data/job_function.xml | 4 ++++ edi_queue_oca/models/edi_exchange_record.py | 11 +---------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/edi_queue_oca/data/job_function.xml b/edi_queue_oca/data/job_function.xml index aedc76dec..6c0295039 100644 --- a/edi_queue_oca/data/job_function.xml +++ b/edi_queue_oca/data/job_function.xml @@ -2,21 +2,25 @@ action_exchange_generate + _generate_job_failed_hook action_exchange_send + _send_job_failed_hook action_exchange_receive + _receive_job_failed_hook action_exchange_process + _process_job_failed_hook diff --git a/edi_queue_oca/models/edi_exchange_record.py b/edi_queue_oca/models/edi_exchange_record.py index aca3108c3..7e803f353 100644 --- a/edi_queue_oca/models/edi_exchange_record.py +++ b/edi_queue_oca/models/edi_exchange_record.py @@ -36,16 +36,7 @@ def _register_hook(self): return super()._register_hook() def action_exchange_send_job_options(self): - return {"priority": 0, "on_fail_method": self._send_job_failed_hook} - - def action_exchange_receive_job_options(self): - return {"on_fail_method": self._receive_job_failed_hook} - - def action_exchange_process_job_options(self): - return {"on_fail_method": self._process_job_failed_hook} - - def action_exchange_generate_job_options(self): - return {"on_fail_method": self._generate_job_failed_hook} + return {"priority": 0} def _job_delay_params(self): params = {} From cee4de74197971f3d6049cd29b0b5ec76e89ea80 Mon Sep 17 00:00:00 2001 From: Akim Juillerat Date: Thu, 20 Aug 2026 21:49:45 +0200 Subject: [PATCH 4/7] fixup! [IMP] edi_queue_oca: Use on fail from queue.job.function --- edi_queue_oca/data/job_function.xml | 8 ++++---- edi_queue_oca/models/edi_exchange_record.py | 18 +++++++++--------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/edi_queue_oca/data/job_function.xml b/edi_queue_oca/data/job_function.xml index 6c0295039..6183d9c3b 100644 --- a/edi_queue_oca/data/job_function.xml +++ b/edi_queue_oca/data/job_function.xml @@ -2,25 +2,25 @@ action_exchange_generate - _generate_job_failed_hook + _job_on_fail_generate action_exchange_send - _send_job_failed_hook + _job_on_fail_send action_exchange_receive - _receive_job_failed_hook + _job_on_fail_receive action_exchange_process - _process_job_failed_hook + _job_on_fail_process diff --git a/edi_queue_oca/models/edi_exchange_record.py b/edi_queue_oca/models/edi_exchange_record.py index 7e803f353..672d02c71 100644 --- a/edi_queue_oca/models/edi_exchange_record.py +++ b/edi_queue_oca/models/edi_exchange_record.py @@ -103,19 +103,19 @@ def action_exchange_generate_send_chained(self): job1.on_done(self.delayable(priority=0).action_exchange_send()) job1.delay() - def _generate_job_failed_hook(self, **kw): - return self._job_failed_hook("validate_error", kw=kw) + def _job_on_fail_generate(self, **kw): + return self._job_on_fail_update("validate_error", kw=kw) - def _send_job_failed_hook(self, **kw): - return self._job_failed_hook("output_error_on_send", kw=kw) + def _job_on_fail_send(self, **kw): + return self._job_on_fail_update("output_error_on_send", kw=kw) - def _receive_job_failed_hook(self, **kw): - return self._job_failed_hook("input_receive_error", kw=kw) + def _job_on_fail_receive(self, **kw): + return self._job_on_fail_update("input_receive_error", kw=kw) - def _process_job_failed_hook(self, **kw): - return self._job_failed_hook("input_processed_error", kw=kw) + def _job_on_fail_process(self, **kw): + return self._job_on_fail_update("input_processed_error", kw=kw) - def _job_failed_hook(self, failed_state, **kw): + def _job_on_fail_update(self, failed_state, **kw): self.ensure_one() self.write( { From c2b9fa426f695c6a946c903f60100c663310c8e5 Mon Sep 17 00:00:00 2001 From: Akim Juillerat Date: Fri, 21 Aug 2026 17:52:00 +0200 Subject: [PATCH 5/7] fixup! fixup! [IMP] edi_queue_oca: Use on fail from queue.job.function --- edi_queue_oca/models/edi_exchange_record.py | 10 +++++----- edi_queue_oca/tests/test_backend_jobs.py | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/edi_queue_oca/models/edi_exchange_record.py b/edi_queue_oca/models/edi_exchange_record.py index 672d02c71..6bf5b4bb3 100644 --- a/edi_queue_oca/models/edi_exchange_record.py +++ b/edi_queue_oca/models/edi_exchange_record.py @@ -104,23 +104,23 @@ def action_exchange_generate_send_chained(self): job1.delay() def _job_on_fail_generate(self, **kw): - return self._job_on_fail_update("validate_error", kw=kw) + return self._job_on_fail_update("validate_error", **kw) def _job_on_fail_send(self, **kw): - return self._job_on_fail_update("output_error_on_send", kw=kw) + return self._job_on_fail_update("output_error_on_send", **kw) def _job_on_fail_receive(self, **kw): - return self._job_on_fail_update("input_receive_error", kw=kw) + return self._job_on_fail_update("input_receive_error", **kw) def _job_on_fail_process(self, **kw): - return self._job_on_fail_update("input_processed_error", kw=kw) + return self._job_on_fail_update("input_processed_error", **kw) def _job_on_fail_update(self, failed_state, **kw): self.ensure_one() self.write( { "edi_exchange_state": failed_state, - "exchange_error": ": ".join(kw["exc_name"], kw["exc_message"]), + "exchange_error": ": ".join([kw["exc_name"], kw["exc_message"]]), "exchange_error_traceback": kw["exc_info"], } ) diff --git a/edi_queue_oca/tests/test_backend_jobs.py b/edi_queue_oca/tests/test_backend_jobs.py index 61ac106bd..364414162 100644 --- a/edi_queue_oca/tests/test_backend_jobs.py +++ b/edi_queue_oca/tests/test_backend_jobs.py @@ -54,6 +54,24 @@ def _get_related_jobs(self, record): action = record.action_view_related_queue_jobs() return self.env["queue.job"].search(action["domain"]) + def test_on_fail_job(self): + vals = { + "model": self.partner._name, + "res_id": self.partner.id, + } + record = self.backend.create_record("test_csv_output", vals) + self.assertEqual(record.edi_exchange_state, "new") + job = record.action_exchange_generate() + exc_vals = { + "exc_info": "Dummy traceback", + "exc_name": "Dummy exception", + "exc_message": "Dummy message", + } + job.on_fail(exc_vals) + self.assertEqual(record.edi_exchange_state, "validate_error") + self.assertEqual(record.exchange_error, ": ".join([exc_vals["exc_name"], exc_vals["exc_message"]])) + self.assertEqual(record.exchange_error_traceback, exc_vals["exc_info"]) + def test_output(self): job_counter = self.job_counter() vals = { From b07dc9b5f005363def41efda3c7d39c01fa5d609 Mon Sep 17 00:00:00 2001 From: Akim Juillerat Date: Fri, 21 Aug 2026 17:53:02 +0200 Subject: [PATCH 6/7] fixup! fixup! fixup! [IMP] edi_queue_oca: Use on fail from queue.job.function --- edi_queue_oca/tests/test_backend_jobs.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/edi_queue_oca/tests/test_backend_jobs.py b/edi_queue_oca/tests/test_backend_jobs.py index 364414162..cb4e69957 100644 --- a/edi_queue_oca/tests/test_backend_jobs.py +++ b/edi_queue_oca/tests/test_backend_jobs.py @@ -69,7 +69,10 @@ def test_on_fail_job(self): } job.on_fail(exc_vals) self.assertEqual(record.edi_exchange_state, "validate_error") - self.assertEqual(record.exchange_error, ": ".join([exc_vals["exc_name"], exc_vals["exc_message"]])) + self.assertEqual( + record.exchange_error, + ": ".join([exc_vals["exc_name"], exc_vals["exc_message"]]), + ) self.assertEqual(record.exchange_error_traceback, exc_vals["exc_info"]) def test_output(self): From 37d69a1609998ba21afaca23873fbfeeaaca6ba9 Mon Sep 17 00:00:00 2001 From: Akim Juillerat Date: Fri, 21 Aug 2026 18:19:05 +0200 Subject: [PATCH 7/7] fixup! fixup! fixup! fixup! [IMP] edi_queue_oca: Use on fail from queue.job.function --- edi_queue_oca/tests/test_backend_jobs.py | 42 ++++++++++++------------ 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/edi_queue_oca/tests/test_backend_jobs.py b/edi_queue_oca/tests/test_backend_jobs.py index cb4e69957..c5c246e09 100644 --- a/edi_queue_oca/tests/test_backend_jobs.py +++ b/edi_queue_oca/tests/test_backend_jobs.py @@ -54,27 +54,6 @@ def _get_related_jobs(self, record): action = record.action_view_related_queue_jobs() return self.env["queue.job"].search(action["domain"]) - def test_on_fail_job(self): - vals = { - "model": self.partner._name, - "res_id": self.partner.id, - } - record = self.backend.create_record("test_csv_output", vals) - self.assertEqual(record.edi_exchange_state, "new") - job = record.action_exchange_generate() - exc_vals = { - "exc_info": "Dummy traceback", - "exc_name": "Dummy exception", - "exc_message": "Dummy message", - } - job.on_fail(exc_vals) - self.assertEqual(record.edi_exchange_state, "validate_error") - self.assertEqual( - record.exchange_error, - ": ".join([exc_vals["exc_name"], exc_vals["exc_message"]]), - ) - self.assertEqual(record.exchange_error_traceback, exc_vals["exc_info"]) - def test_output(self): job_counter = self.job_counter() vals = { @@ -186,3 +165,24 @@ def test_input_processed_error(self): # Check related jobs record.invalidate_recordset() self.assertEqual(created, self._get_related_jobs(record)) + + def test_on_fail_job(self): + vals = { + "model": self.partner._name, + "res_id": self.partner.id, + } + record = self.backend.create_record("test_csv_output", vals) + self.assertEqual(record.edi_exchange_state, "new") + job = record.action_exchange_generate() + exc_vals = { + "exc_info": "Dummy traceback", + "exc_name": "Dummy exception", + "exc_message": "Dummy message", + } + job.on_fail(exc_vals) + self.assertEqual(record.edi_exchange_state, "validate_error") + self.assertEqual( + record.exchange_error, + ": ".join([exc_vals["exc_name"], exc_vals["exc_message"]]), + ) + self.assertEqual(record.exchange_error_traceback, exc_vals["exc_info"])