Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 6 additions & 10 deletions edi_queue_oca/README.rst
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
.. image:: https://odoo-community.org/readme-banner-image
:target: https://odoo-community.org/get-involved?utm_source=readme
:alt: Odoo Community Association

=============
Edi Queue Oca
=============
Expand All @@ -17,7 +13,7 @@ Edi Queue Oca
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/license-LGPL--3-blue.png
.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png
:target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html
:alt: License: LGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fedi--framework-lightgray.png?logo=github
Expand Down Expand Up @@ -65,11 +61,11 @@ Authors
Contributors
------------

- Simone Orsi <simahawk@gmail.com>
- Enric Tobella <enric.tobella@dixmit.com>
- Manuel Regidor <manuel.regidor@sygel.es>
- Thien Vo <thienvh@trobz.com>
- Jordi Masvidal <jordi.masvidal@forgeflow.com>
- Simone Orsi <simahawk@gmail.com>
- Enric Tobella <enric.tobella@dixmit.com>
- Manuel Regidor <manuel.regidor@sygel.es>
- Thien Vo <thienvh@trobz.com>
- Jordi Masvidal <jordi.masvidal@forgeflow.com>

Maintainers
-----------
Expand Down
2 changes: 1 addition & 1 deletion edi_queue_oca/__manifest__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
{
"name": "Edi Queue Oca",
"summary": """Set Queue Jobs on EDI""",
"version": "18.0.1.0.2",
"version": "18.0.1.0.3",
"license": "LGPL-3",
"author": "Dixmit,Camptocamp,Odoo Community Association (OCA)",
"website": "https://github.com/OCA/edi-framework",
Expand Down
4 changes: 4 additions & 0 deletions edi_queue_oca/data/job_function.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,25 @@
<record id="job_fun_exchange_record_generate" model="queue.job.function">
<field name="model_id" ref="edi_core_oca.model_edi_exchange_record" />
<field name="method">action_exchange_generate</field>
<field name="on_fail_method">_job_on_fail_generate</field>
<field name="channel_id" ref="channel_edi_exchange" />
</record>
<record id="job_fun_exchange_record_send" model="queue.job.function">
<field name="model_id" ref="model_edi_exchange_record" />
<field name="method">action_exchange_send</field>
<field name="on_fail_method">_job_on_fail_send</field>
<field name="channel_id" ref="channel_edi_exchange" />
</record>
<record id="job_fun_exchange_record_receive" model="queue.job.function">
<field name="model_id" ref="edi_core_oca.model_edi_exchange_record" />
<field name="method">action_exchange_receive</field>
<field name="on_fail_method">_job_on_fail_receive</field>
<field name="channel_id" ref="channel_edi_exchange" />
</record>
<record id="job_fun_exchange_record_process" model="queue.job.function">
<field name="model_id" ref="edi_core_oca.model_edi_exchange_record" />
<field name="method">action_exchange_process</field>
<field name="on_fail_method">_job_on_fail_process</field>
<field name="channel_id" ref="channel_edi_exchange" />
</record>
<record id="job_fun_exchange_record_create_ack" model="queue.job.function">
Expand Down
30 changes: 30 additions & 0 deletions edi_queue_oca/migrations/18.0.1.0.3/post-migration.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Copyright 2026 Camptocamp SA (http://www.camptocamp.com)
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).

import logging

from odoo import SUPERUSER_ID, api

_logger = logging.getLogger(__name__)

# The job functions are declared in a ``noupdate`` data file, so databases
# created before the on fail hooks were added never got ``on_fail_method``.
ON_FAIL_METHODS = {
"edi_queue_oca.job_fun_exchange_record_generate": "_job_on_fail_generate",
"edi_queue_oca.job_fun_exchange_record_send": "_job_on_fail_send",
"edi_queue_oca.job_fun_exchange_record_receive": "_job_on_fail_receive",
"edi_queue_oca.job_fun_exchange_record_process": "_job_on_fail_process",
}


def migrate(cr, version):
env = api.Environment(cr, SUPERUSER_ID, {})
for xmlid, method in ON_FAIL_METHODS.items():
job_function = env.ref(xmlid, raise_if_not_found=False)
if not job_function:
_logger.warning("Job function %s not found, skipping", xmlid)
continue
if job_function.on_fail_method:
continue
_logger.info("Setting on_fail_method=%s on %s", method, xmlid)
job_function.on_fail_method = method
27 changes: 27 additions & 0 deletions edi_queue_oca/models/edi_exchange_record.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,3 +91,30 @@ 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 _job_on_fail_generate(self, **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)

def _job_on_fail_receive(self, **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)

def _job_on_fail_update(self, failed_state, **kw):
self.ensure_one()
# ``exc_message`` is the first argument of the exception: it is not
# always a string (e.g. the errno of an ``OSError``) and may be missing.
error = ": ".join(
str(kw[k]) for k in ("exc_name", "exc_message") if kw.get(k) is not None
)
self.write(
{
"edi_exchange_state": failed_state,
"exchange_error": error,
"exchange_error_traceback": kw.get("exc_info"),
}
)
24 changes: 9 additions & 15 deletions edi_queue_oca/static/description/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
<title>README.rst</title>
<title>Edi Queue Oca</title>
<style type="text/css">

/*
Expand Down Expand Up @@ -360,21 +360,16 @@
</style>
</head>
<body>
<div class="document">
<div class="document" id="edi-queue-oca">
<h1 class="title">Edi Queue Oca</h1>


<a class="reference external image-reference" href="https://odoo-community.org/get-involved?utm_source=readme">
<img alt="Odoo Community Association" src="https://odoo-community.org/readme-banner-image" />
</a>
<div class="section" id="edi-queue-oca">
<h1>Edi Queue Oca</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:273ae337ce810a27ea20810513190a340066e443fdb5d1b3d00065665bf8c6aa
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/lgpl-3.0-standalone.html"><img alt="License: LGPL-3" src="https://img.shields.io/badge/license-LGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/edi-framework/tree/18.0/edi_queue_oca"><img alt="OCA/edi-framework" src="https://img.shields.io/badge/github-OCA%2Fedi--framework-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/edi-framework-18-0/edi-framework-18-0-edi_queue_oca"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/edi-framework&amp;target_branch=18.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/lgpl-3.0-standalone.html"><img alt="License: LGPL-3" src="https://img.shields.io/badge/licence-LGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/edi-framework/tree/18.0/edi_queue_oca"><img alt="OCA/edi-framework" src="https://img.shields.io/badge/github-OCA%2Fedi--framework-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/edi-framework-18-0/edi-framework-18-0-edi_queue_oca"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/edi-framework&amp;target_branch=18.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>This module integrates EDI with Queue Job and now the edi exchange
records are generated using queue.</p>
<p>No need of doing a configuration on it, however, we can specify priority
Expand All @@ -392,24 +387,24 @@ <h1>Edi Queue Oca</h1>
</ul>
</div>
<div class="section" id="bug-tracker">
<h2><a class="toc-backref" href="#toc-entry-1">Bug Tracker</a></h2>
<h1><a class="toc-backref" href="#toc-entry-1">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/edi-framework/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/edi-framework/issues/new?body=module:%20edi_queue_oca%0Aversion:%2018.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h2><a class="toc-backref" href="#toc-entry-2">Credits</a></h2>
<h1><a class="toc-backref" href="#toc-entry-2">Credits</a></h1>
<div class="section" id="authors">
<h3><a class="toc-backref" href="#toc-entry-3">Authors</a></h3>
<h2><a class="toc-backref" href="#toc-entry-3">Authors</a></h2>
<ul class="simple">
<li>Dixmit</li>
<li>Camptocamp</li>
</ul>
</div>
<div class="section" id="contributors">
<h3><a class="toc-backref" href="#toc-entry-4">Contributors</a></h3>
<h2><a class="toc-backref" href="#toc-entry-4">Contributors</a></h2>
<ul class="simple">
<li>Simone Orsi &lt;<a class="reference external" href="mailto:simahawk&#64;gmail.com">simahawk&#64;gmail.com</a>&gt;</li>
<li>Enric Tobella &lt;<a class="reference external" href="mailto:enric.tobella&#64;dixmit.com">enric.tobella&#64;dixmit.com</a>&gt;</li>
Expand All @@ -419,7 +414,7 @@ <h3><a class="toc-backref" href="#toc-entry-4">Contributors</a></h3>
</ul>
</div>
<div class="section" id="maintainers">
<h3><a class="toc-backref" href="#toc-entry-5">Maintainers</a></h3>
<h2><a class="toc-backref" href="#toc-entry-5">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org">
<img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" />
Expand All @@ -432,6 +427,5 @@ <h3><a class="toc-backref" href="#toc-entry-5">Maintainers</a></h3>
</div>
</div>
</div>
</div>
</body>
</html>
56 changes: 56 additions & 0 deletions edi_queue_oca/tests/test_backend_jobs.py
Original file line number Diff line number Diff line change
Expand Up @@ -159,3 +159,59 @@ 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"])

def test_on_fail_job_non_string_message(self):
# The message is the first argument of the exception, which is the
# errno for an OSError, or may be missing altogether.
vals = {
"model": self.partner._name,
"res_id": self.partner.id,
}
record = self.backend.create_record("test_csv_output", vals)
job = record.action_exchange_generate()
job.on_fail(
{
"exc_info": "Dummy traceback",
"exc_name": "PermissionError",
"exc_message": 13,
}
)
self.assertEqual(record.edi_exchange_state, "validate_error")
self.assertEqual(record.exchange_error, "PermissionError: 13")
job.on_fail(
{
"exc_info": "Dummy traceback",
"exc_name": "JobFoundDead",
"exc_message": None,
}
)
self.assertEqual(record.exchange_error, "JobFoundDead")
job.on_fail(
{
"exc_info": "Dummy traceback",
"exc_name": None,
"exc_message": "Something went wrong",
}
)
self.assertEqual(record.exchange_error, "Something went wrong")
Loading