From 8a9fda00ebd1f6d416f55ff32e137915252e450e Mon Sep 17 00:00:00 2001
From: Simone Orsi
Date: Tue, 24 Nov 2020 18:18:52 +0100
Subject: [PATCH 01/99] Add edi_exchange_template
---
edi_exchange_template_oca/README.rst | 83 ++++
edi_exchange_template_oca/__init__.py | 2 +
edi_exchange_template_oca/__manifest__.py | 18 +
.../components/__init__.py | 2 +
.../components/common.py | 20 +
.../components/output_mixin.py | 42 ++
edi_exchange_template_oca/models/__init__.py | 3 +
.../models/edi_backend.py | 35 ++
.../models/edi_exchange_template_mixin.py | 119 +++++
.../models/edi_exchange_template_output.py | 108 +++++
.../readme/CONTRIBUTORS.rst | 1 +
.../readme/DESCRIPTION.rst | 6 +
.../security/ir_model_access.xml | 12 +
.../static/description/icon.png | Bin 0 -> 9455 bytes
.../static/description/index.html | 430 ++++++++++++++++++
edi_exchange_template_oca/tests/__init__.py | 1 +
.../tests/test_edi_backend_output.py | 124 +++++
edi_exchange_template_oca/utils.py | 40 ++
.../edi_exchange_template_output_views.xml | 134 ++++++
19 files changed, 1180 insertions(+)
create mode 100644 edi_exchange_template_oca/README.rst
create mode 100644 edi_exchange_template_oca/__init__.py
create mode 100644 edi_exchange_template_oca/__manifest__.py
create mode 100644 edi_exchange_template_oca/components/__init__.py
create mode 100644 edi_exchange_template_oca/components/common.py
create mode 100644 edi_exchange_template_oca/components/output_mixin.py
create mode 100644 edi_exchange_template_oca/models/__init__.py
create mode 100644 edi_exchange_template_oca/models/edi_backend.py
create mode 100644 edi_exchange_template_oca/models/edi_exchange_template_mixin.py
create mode 100644 edi_exchange_template_oca/models/edi_exchange_template_output.py
create mode 100644 edi_exchange_template_oca/readme/CONTRIBUTORS.rst
create mode 100644 edi_exchange_template_oca/readme/DESCRIPTION.rst
create mode 100644 edi_exchange_template_oca/security/ir_model_access.xml
create mode 100644 edi_exchange_template_oca/static/description/icon.png
create mode 100644 edi_exchange_template_oca/static/description/index.html
create mode 100644 edi_exchange_template_oca/tests/__init__.py
create mode 100644 edi_exchange_template_oca/tests/test_edi_backend_output.py
create mode 100644 edi_exchange_template_oca/utils.py
create mode 100644 edi_exchange_template_oca/views/edi_exchange_template_output_views.xml
diff --git a/edi_exchange_template_oca/README.rst b/edi_exchange_template_oca/README.rst
new file mode 100644
index 000000000..2a497ce50
--- /dev/null
+++ b/edi_exchange_template_oca/README.rst
@@ -0,0 +1,83 @@
+=====================
+EDI Exchange Template
+=====================
+
+.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! This file is generated by oca-gen-addon-readme !!
+ !! changes will be overwritten. !!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+.. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png
+ :target: https://odoo-community.org/page/development-status
+ :alt: Alpha
+.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
+ :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
+ :alt: License: AGPL-3
+.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fedi-lightgray.png?logo=github
+ :target: https://github.com/OCA/edi/tree/13.0/edi_exchange_template
+ :alt: OCA/edi
+.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
+ :target: https://translation.odoo-community.org/projects/edi-13-0/edi-13-0-edi_exchange_template
+ :alt: Translate me on Weblate
+.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
+ :target: https://runbot.odoo-community.org/runbot/226/13.0
+ :alt: Try me on Runbot
+
+|badge1| |badge2| |badge3| |badge4| |badge5|
+
+Provide EDI exchange templates to control input/output records contents.
+
+Provides following models:
+
+1. EDI exchange output template, generates output using QWeb templates
+2. [TODO] EDI exchange input template
+
+.. IMPORTANT::
+ This is an alpha version, the data model and design can change at any time without warning.
+ Only for development or testing purpose, do not use in production.
+ `More details on development status `_
+
+**Table of contents**
+
+.. contents::
+ :local:
+
+Bug Tracker
+===========
+
+Bugs are tracked on `GitHub Issues `_.
+In case of trouble, please check there if your issue has already been reported.
+If you spotted it first, help us smashing it by providing a detailed and welcomed
+`feedback `_.
+
+Do not contact contributors directly about support or help with technical issues.
+
+Credits
+=======
+
+Authors
+~~~~~~~
+
+* ACSONE
+
+Contributors
+~~~~~~~~~~~~
+
+* Simone Orsi
+
+Maintainers
+~~~~~~~~~~~
+
+This module is maintained by the OCA.
+
+.. image:: https://odoo-community.org/logo.png
+ :alt: Odoo Community Association
+ :target: https://odoo-community.org
+
+OCA, or the Odoo Community Association, is a nonprofit organization whose
+mission is to support the collaborative development of Odoo features and
+promote its widespread use.
+
+This module is part of the `OCA/edi `_ project on GitHub.
+
+You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/edi_exchange_template_oca/__init__.py b/edi_exchange_template_oca/__init__.py
new file mode 100644
index 000000000..0f00a6730
--- /dev/null
+++ b/edi_exchange_template_oca/__init__.py
@@ -0,0 +1,2 @@
+from . import models
+from . import components
diff --git a/edi_exchange_template_oca/__manifest__.py b/edi_exchange_template_oca/__manifest__.py
new file mode 100644
index 000000000..219dd0834
--- /dev/null
+++ b/edi_exchange_template_oca/__manifest__.py
@@ -0,0 +1,18 @@
+# Copyright 2020 ACSONE
+# @author: Simone Orsi
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+{
+ "name": "EDI Exchange Template",
+ "summary": """Allows definition of exchanges via templates.""",
+ "version": "13.0.1.0.0",
+ "development_status": "Alpha",
+ "license": "AGPL-3",
+ "author": "ACSONE,Odoo Community Association (OCA)",
+ "maintainers": ["simahawk"],
+ "depends": ["edi", "component"],
+ "data": [
+ "security/ir_model_access.xml",
+ "views/edi_exchange_template_output_views.xml",
+ ],
+}
diff --git a/edi_exchange_template_oca/components/__init__.py b/edi_exchange_template_oca/components/__init__.py
new file mode 100644
index 000000000..ed5b32801
--- /dev/null
+++ b/edi_exchange_template_oca/components/__init__.py
@@ -0,0 +1,2 @@
+from . import common
+from . import output_mixin
diff --git a/edi_exchange_template_oca/components/common.py b/edi_exchange_template_oca/components/common.py
new file mode 100644
index 000000000..06d6a876f
--- /dev/null
+++ b/edi_exchange_template_oca/components/common.py
@@ -0,0 +1,20 @@
+# Copyright 2020 ACSONE
+# @author: Simone Orsi
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from odoo.addons.component.core import AbstractComponent
+
+
+class EDIExchangeInfoMixin(AbstractComponent):
+ """Abstract component mixin provide info for exchanges."""
+
+ _name = "edi.info.provider.mixin"
+ _collection = "edi.backend"
+ # Enable validation of work context attributes
+ _work_context_validate_attrs = []
+
+ def __init__(self, work_context):
+ super().__init__(work_context)
+ for key in self._work_context_validate_attrs:
+ if not hasattr(work_context, key):
+ raise AttributeError(f"`{key}` is required for this component!")
diff --git a/edi_exchange_template_oca/components/output_mixin.py b/edi_exchange_template_oca/components/output_mixin.py
new file mode 100644
index 000000000..4567480ea
--- /dev/null
+++ b/edi_exchange_template_oca/components/output_mixin.py
@@ -0,0 +1,42 @@
+# Copyright 2020 ACSONE
+# @author: Simone Orsi
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+import datetime
+
+import pytz
+
+from odoo import fields
+
+from odoo.addons.component.core import AbstractComponent
+
+
+class EDIExchangeInfoOutputMixin(AbstractComponent):
+ """Abstract component mixin to generate GS1 compliant XML files."""
+
+ _name = "edi.output.mixin"
+ _inherit = "edi.info.provider.mixin"
+ # Enable validation of work context attributes
+ _work_context_validate_attrs = ["exchange_record"]
+
+ @property
+ def record(self):
+ return self.work.exchange_record.record
+
+ def generate_info(self):
+ """Generate and return data for output info.
+
+ :return: odoo.tools.DotDict
+ """
+ raise NotImplementedError()
+
+ # helper methods
+ @staticmethod
+ def _utc_now():
+ return datetime.datetime.utcnow().isoformat()
+
+ @staticmethod
+ def date_to_string(dt, utc=True):
+ if utc:
+ dt = dt.astimezone(pytz.UTC)
+ return fields.Date.to_string(dt)
diff --git a/edi_exchange_template_oca/models/__init__.py b/edi_exchange_template_oca/models/__init__.py
new file mode 100644
index 000000000..a98be2011
--- /dev/null
+++ b/edi_exchange_template_oca/models/__init__.py
@@ -0,0 +1,3 @@
+from . import edi_backend
+from . import edi_exchange_template_mixin
+from . import edi_exchange_template_output
diff --git a/edi_exchange_template_oca/models/edi_backend.py b/edi_exchange_template_oca/models/edi_backend.py
new file mode 100644
index 000000000..559df9756
--- /dev/null
+++ b/edi_exchange_template_oca/models/edi_backend.py
@@ -0,0 +1,35 @@
+# Copyright 2020 ACSONE SA
+# @author Simone Orsi
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from odoo import models
+
+
+class EDIBackend(models.Model):
+ _inherit = "edi.backend"
+
+ def _generate_output(self, exchange_record, **kw):
+ # Template take precedence over component lookup
+ tmpl = self._get_output_template(exchange_record)
+ if tmpl:
+ return tmpl.generate_output(exchange_record, **kw)
+ return super()._generate_output(exchange_record, **kw)
+
+ @property
+ def output_template_model(self):
+ return self.env["edi.exchange.template.output"]
+
+ def _get_output_template(self, exchange_record, code=None):
+ """Retrieve output templates by convention.
+
+ Template's code must match the same component usage as per normal components.
+ """
+ tmpl = None
+ candidates = self._generate_output_component_usage_candidates(exchange_record)
+ if code:
+ candidates.insert(code)
+ for usage in candidates:
+ tmpl = self.output_template_model.search([("code", "=", usage)], limit=1)
+ if tmpl:
+ break
+ return tmpl
diff --git a/edi_exchange_template_oca/models/edi_exchange_template_mixin.py b/edi_exchange_template_oca/models/edi_exchange_template_mixin.py
new file mode 100644
index 000000000..ea4dec728
--- /dev/null
+++ b/edi_exchange_template_oca/models/edi_exchange_template_mixin.py
@@ -0,0 +1,119 @@
+# Copyright 2020 ACSONE SA
+# @author Simone Orsi
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+import datetime
+import logging
+import textwrap
+import time
+
+import dateutil
+import pytz
+
+from odoo import fields, models
+from odoo.tools import DotDict
+from odoo.tools.safe_eval import safe_eval
+
+_logger = logging.getLogger(__name__)
+
+
+class EDIExchangeTemplateMixin(models.AbstractModel):
+ """Define a common ground for EDI exchange templates.
+ """
+
+ _name = "edi.exchange.template.mixin"
+ _description = "EDI Exchange Output Mixin"
+
+ name = fields.Char(required=True)
+ # TODO: make unique, autocompute slugified name
+ code = fields.Char(required=True, index=True)
+ backend_type_id = fields.Many2one(
+ string="EDI Backend type",
+ comodel_name="edi.backend.type",
+ ondelete="restrict",
+ required=True,
+ )
+ type_id = fields.Many2one(
+ string="EDI Exchange type",
+ comodel_name="edi.exchange.type",
+ ondelete="cascade",
+ auto_join=True,
+ )
+ backend_id = fields.Many2one(
+ comodel_name="edi.backend",
+ ondelete="cascade",
+ # TODO: default to type_id if given, validate otherwise
+ )
+ # TODO: add default content w/ comment on what you can use
+ code_snippet = fields.Text()
+ code_snippet_docs = fields.Text(
+ compute="_compute_code_snippet_docs",
+ default=lambda self: self._default_code_snippet_docs(),
+ )
+
+ def _compute_code_snippet_docs(self):
+ for rec in self:
+ rec.code_snippet_docs = textwrap.dedent(rec._default_code_snippet_docs())
+
+ def _default_code_snippet_docs(self):
+ return """
+ Available vars:
+ * datetime
+ * dateutil
+ * time
+ * uid
+ * user
+ * DotDict
+ """
+
+ def _code_snippet_valued(self):
+ snippet = self.code_snippet or ""
+ return bool(
+ [
+ not line.startswith("#")
+ for line in (snippet.splitlines())
+ if line.strip("")
+ ]
+ )
+
+ @staticmethod
+ def _utc_now():
+ return datetime.datetime.utcnow().isoformat()
+
+ @staticmethod
+ def _date_to_string(dt, utc=True):
+ if utc:
+ dt = dt.astimezone(pytz.UTC)
+ return fields.Date.to_string(dt)
+
+ def _get_code_snippet_eval_context(self):
+ """Prepare the context used when evaluating python code
+
+ :returns: dict -- evaluation context given to safe_eval
+ """
+ return {
+ "datetime": datetime,
+ "dateutil": dateutil,
+ "time": time,
+ "uid": self.env.uid,
+ "user": self.env.user,
+ "DotDict": DotDict,
+ }
+
+ def _evaluate_code_snippet(self, **render_values):
+ if not self._code_snippet_valued():
+ return {}
+ eval_ctx = dict(render_values, **self._get_code_snippet_eval_context())
+ safe_eval(self.code_snippet, eval_ctx, mode="exec", nocopy=True)
+ result = eval_ctx.get("result", {})
+ if not isinstance(result, dict):
+ _logger.error("code_snippet should return a dict into `result`")
+ return {}
+ return result
+
+ def _get_validator(self, exchange_record):
+ # TODO: lookup for validator (
+ # can be to validate received file or generated file)
+ pass
+
+ def validate(self, exchange_record):
+ pass
diff --git a/edi_exchange_template_oca/models/edi_exchange_template_output.py b/edi_exchange_template_oca/models/edi_exchange_template_output.py
new file mode 100644
index 000000000..1871c8912
--- /dev/null
+++ b/edi_exchange_template_oca/models/edi_exchange_template_output.py
@@ -0,0 +1,108 @@
+# Copyright 2020 ACSONE SA
+# @author Simone Orsi
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+import logging
+
+from odoo import fields, models
+
+from ..utils import xml_purge_nswrapper
+
+_logger = logging.getLogger(__name__)
+
+
+class EDIExchangeOutputTemplate(models.Model):
+ """Define an output template to generate outgoing files
+ """
+
+ _name = "edi.exchange.template.output"
+ _inherit = "edi.exchange.template.mixin"
+ _description = "EDI Exchange Output Template"
+
+ output_type = fields.Char(required=True)
+ # TODO: add a good domain (maybe add a new flag or category to ir.ui.view)
+ template_id = fields.Many2one(
+ string="Qweb Template",
+ comodel_name="ir.ui.view",
+ required=True,
+ ondelete="restrict",
+ )
+ template_arch = fields.Text(
+ string="QWeb arch", related="template_id.arch_db", readonly=False,
+ )
+ template_key = fields.Char(related="template_id.xml_id", string="Template key")
+
+ def _default_code_snippet_docs(self):
+ return (
+ super()._default_code_snippet_docs()
+ + """
+ * exchange_record (edi.exchange.record)
+ * record (real odoo record related to this exchange)
+ * backend (current backend)
+ * template (current template record)
+ * utc_now
+ * date_to_string
+ * render_edi_template
+ * get_info_provider
+ * info
+ """
+ )
+
+ def generate_output(self, exchange_record, **kw):
+ """Generate output for given record using related QWeb template.
+ """
+ tmpl = self.template_id
+ # TODO: how to validate mandatory render values?
+ # (eg: sender/receiver are mandatory for BH)
+ values = self._get_render_values(exchange_record, **kw)
+ output = tmpl.render(values)
+ return self._post_process_output(output)
+
+ def _get_render_values(self, exchange_record, **kw):
+ """Collect values to render current template."""
+ values = {
+ "exchange_record": exchange_record,
+ "record": exchange_record.record,
+ "backend": exchange_record.backend_id,
+ "template": self,
+ "utc_now": self._utc_now,
+ "date_to_string": self._date_to_string,
+ "render_edi_template": self._render_template,
+ "get_info_provider": self._get_info_provider,
+ "info": {},
+ }
+ values.update(self._evaluate_code_snippet(**values))
+ values.update(kw)
+ return values
+
+ def _render_template(self, exchange_record, code, **kw):
+ """Render another template matching `code`.
+
+ This is very handy to render templates from other templates.
+ """
+ tmpl = self.search([("code", "=", code)], limit=1)
+ tmpl.ensure_one()
+ return tmpl.generate_output(exchange_record, **kw)
+
+ def _post_process_output(self, output):
+ """Post process generated output.
+ """
+ if self.output_type == "xml":
+ # TODO: lookup for components to handle this dynamically
+ return xml_purge_nswrapper(output)
+ return output
+
+ def _get_info_provider(self, exchange_record, work_ctx=None, usage=None, **kw):
+ """Retrieve component providing info to render a template.
+
+ TODO: improve this description.
+ TODO: add tests
+ """
+ default_work_ctx = dict(
+ exchange_record=exchange_record, record=exchange_record.record,
+ )
+ default_work_ctx.update(work_ctx or {})
+ usage_candidates = [usage or self.code + ".info"]
+ provider = exchange_record.backend_id._get_component(
+ usage_candidates, work_ctx=default_work_ctx, **kw
+ )
+ return provider
diff --git a/edi_exchange_template_oca/readme/CONTRIBUTORS.rst b/edi_exchange_template_oca/readme/CONTRIBUTORS.rst
new file mode 100644
index 000000000..f583948be
--- /dev/null
+++ b/edi_exchange_template_oca/readme/CONTRIBUTORS.rst
@@ -0,0 +1 @@
+* Simone Orsi
diff --git a/edi_exchange_template_oca/readme/DESCRIPTION.rst b/edi_exchange_template_oca/readme/DESCRIPTION.rst
new file mode 100644
index 000000000..491f1212a
--- /dev/null
+++ b/edi_exchange_template_oca/readme/DESCRIPTION.rst
@@ -0,0 +1,6 @@
+Provide EDI exchange templates to control input/output records contents.
+
+Provides following models:
+
+1. EDI exchange output template, generates output using QWeb templates
+2. [TODO] EDI exchange input template
diff --git a/edi_exchange_template_oca/security/ir_model_access.xml b/edi_exchange_template_oca/security/ir_model_access.xml
new file mode 100644
index 000000000..c611b9dbf
--- /dev/null
+++ b/edi_exchange_template_oca/security/ir_model_access.xml
@@ -0,0 +1,12 @@
+
+
+
+ edi_exchange_template_output manager
+
+
+
+
+
+
+
+
diff --git a/edi_exchange_template_oca/static/description/icon.png b/edi_exchange_template_oca/static/description/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d
GIT binary patch
literal 9455
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
z
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
Xviia!U7SGha1wx#SCgwmn*{w2TRX*I
literal 0
HcmV?d00001
diff --git a/edi_exchange_template_oca/static/description/index.html b/edi_exchange_template_oca/static/description/index.html
new file mode 100644
index 000000000..81c8f0f4a
--- /dev/null
+++ b/edi_exchange_template_oca/static/description/index.html
@@ -0,0 +1,430 @@
+
+
+
+
+
+
+EDI Exchange Template
+
+
+
+
+
EDI Exchange Template
+
+
+

+
Provide EDI exchange templates to control input/output records contents.
+
Provides following models:
+
+- EDI exchange output template, generates output using QWeb templates
+- [TODO] EDI exchange input template
+
+
+
Important
+
This is an alpha version, the data model and design can change at any time without warning.
+Only for development or testing purpose, do not use in production.
+More details on development status
+
+
Table of contents
+
+
+
+
Bugs are tracked on GitHub Issues.
+In case of trouble, please check there if your issue has already been reported.
+If you spotted it first, help us smashing it by providing a detailed and welcomed
+feedback.
+
Do not contact contributors directly about support or help with technical issues.
+
+
+
+
+
+
+
+
This module is maintained by the OCA.
+

+
OCA, or the Odoo Community Association, is a nonprofit organization whose
+mission is to support the collaborative development of Odoo features and
+promote its widespread use.
+
This module is part of the OCA/edi project on GitHub.
+
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
+
+
+
+
+
diff --git a/edi_exchange_template_oca/tests/__init__.py b/edi_exchange_template_oca/tests/__init__.py
new file mode 100644
index 000000000..dbf4fc661
--- /dev/null
+++ b/edi_exchange_template_oca/tests/__init__.py
@@ -0,0 +1 @@
+from . import test_edi_backend_output
diff --git a/edi_exchange_template_oca/tests/test_edi_backend_output.py b/edi_exchange_template_oca/tests/test_edi_backend_output.py
new file mode 100644
index 000000000..0212886ac
--- /dev/null
+++ b/edi_exchange_template_oca/tests/test_edi_backend_output.py
@@ -0,0 +1,124 @@
+# Copyright 2020 ACSONE SA/NV ()
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+import base64
+
+from lxml import etree
+
+from odoo.addons.edi.tests.common import EDIBackendCommonTestCase
+
+
+class TestEDIBackendOutputBase(EDIBackendCommonTestCase):
+ @classmethod
+ def setUpClass(cls):
+ super().setUpClass()
+ cls._setup_records()
+
+ @classmethod
+ def _setup_records(cls):
+ cls.type_out1 = cls._create_exchange_type(
+ name="Template output 1",
+ direction="output",
+ code="test_type_out1",
+ exchange_file_ext="txt",
+ exchange_filename_pattern="{record.ref}-{type.code}-{dt}",
+ )
+ model = cls.env["edi.exchange.template.output"]
+ qweb_tmpl = cls.env["ir.ui.view"].create(
+ {
+ "type": "qweb",
+ "key": "edi_exchange.test_output1",
+ "arch": """
+
+ -
+
+ """,
+ }
+ )
+ cls.tmpl_out1 = model.create(
+ {
+ "code": "edi.output.demo_backend.test_type_out1",
+ "name": "Out 1",
+ "backend_type_id": cls.backend.backend_type_id.id,
+ "type_id": cls.type_out1.id,
+ "template_id": qweb_tmpl.id,
+ "output_type": "txt",
+ }
+ )
+ vals = {
+ "model": cls.partner._name,
+ "res_id": cls.partner.id,
+ "type_id": cls.type_out1.id,
+ }
+ cls.record1 = cls.backend.create_record("test_type_out1", vals)
+
+ cls.type_out2 = cls._create_exchange_type(
+ name="Template output 2",
+ direction="output",
+ code="test_type_out2",
+ exchange_file_ext="xml",
+ exchange_filename_pattern="{record.ref}-{type.code}-{dt}",
+ )
+ qweb_tmpl = cls.env["ir.ui.view"].create(
+ {
+ "type": "qweb",
+ "key": "edi_exchange.test_output2",
+ "arch": """
+
+
+
+
+
+
+
+
+ """,
+ }
+ )
+ cls.tmpl_out2 = model.create(
+ {
+ "code": "edi.output.demo_backend.test_type_out2",
+ "name": "Out 2",
+ "backend_type_id": cls.backend.backend_type_id.id,
+ "type_id": cls.type_out2.id,
+ "template_id": qweb_tmpl.id,
+ "output_type": "xml",
+ "code_snippet": """
+foo = "custom_var"
+baz = 2
+result = {"custom_bit": foo, "baz": baz}
+ """,
+ }
+ )
+ vals = {
+ "model": cls.partner._name,
+ "res_id": cls.partner.id,
+ "type_id": cls.type_out2.id,
+ }
+ cls.record2 = cls.backend.create_record("test_type_out2", vals)
+
+
+# TODO: add more unit tests
+class TestEDIBackendOutput(TestEDIBackendOutputBase):
+ def test_get_template(self):
+ self.assertEqual(
+ self.backend._get_output_template(self.record1), self.tmpl_out1
+ )
+ self.assertEqual(
+ self.backend._get_output_template(self.record2), self.tmpl_out2
+ )
+
+ def test_generate_file(self):
+ output = self.backend.generate_output(self.record1)
+ expected = "{0.ref} - {0.name}".format(self.partner)
+ self.assertEqual(output.strip(), expected)
+ file_content = base64.b64decode(self.record1.exchange_file).decode()
+ self.assertEqual(file_content.strip(), expected)
+ output = self.backend.generate_output(self.record2)
+ doc = etree.fromstring(output)
+ self.assertEqual(doc.tag, "Record")
+ self.assertEqual(doc.attrib, {"ref": self.partner.ref})
+ self.assertEqual(doc.getchildren()[0].tag, "Name")
+ self.assertEqual(doc.getchildren()[0].text, self.partner.name)
+ self.assertEqual(doc.getchildren()[1].tag, "Custom")
+ self.assertEqual(doc.getchildren()[1].text, "2")
+ self.assertEqual(doc.getchildren()[1].attrib, {"bit": "custom_var"})
diff --git a/edi_exchange_template_oca/utils.py b/edi_exchange_template_oca/utils.py
new file mode 100644
index 000000000..4fd56ed44
--- /dev/null
+++ b/edi_exchange_template_oca/utils.py
@@ -0,0 +1,40 @@
+from lxml import etree
+
+from odoo.tools import pycompat
+
+
+def xml_purge_nswrapper(xml_content):
+ """Purge `nswrapper` elements.
+
+ QWeb template does not allow parsing namespaced elements
+ without declaring namespaces on the root element.
+
+ Hence, by default you cannot define smaller re-usable templates
+ if the have namespaced elements.
+
+ The trick is to wrap your reusable template with `nswrapper` element
+ which holds the namespace for that particular sub template.
+ For instance:
+
+
+
+
+
+ Then this method is going to purge these unwanted elements from the result.
+ """
+ if not (xml_content and xml_content.strip()):
+ return xml_content
+ root = etree.XML(xml_content)
+ # deeper elements come after, keep the root element at the end (if any)
+ for nswrapper in reversed(root.xpath("//nswrapper")):
+ parent = nswrapper.getparent()
+ if not parent:
+ # fmt:off
+ return "".join([
+ pycompat.to_text(etree.tostring(el))
+ for el in nswrapper.getchildren()
+ ])
+ # fmt:on
+ parent.extend(nswrapper.getchildren())
+ parent.remove(nswrapper)
+ return etree.tostring(root)
diff --git a/edi_exchange_template_oca/views/edi_exchange_template_output_views.xml b/edi_exchange_template_oca/views/edi_exchange_template_output_views.xml
new file mode 100644
index 000000000..e5e42e791
--- /dev/null
+++ b/edi_exchange_template_oca/views/edi_exchange_template_output_views.xml
@@ -0,0 +1,134 @@
+
+
+
+ edi.exchange.template.output
+
+
+
+
+
+
+
+
+
+
+
+ edi.exchange.template.output
+
+
+
+
+
+ edi.exchange.template.output
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ EDI Exchange Template Output
+ ir.actions.act_window
+ edi.exchange.template.output
+ tree,form
+
+ []
+ {}
+
+
+
+
+ form
+
+
+
+
+
+ tree
+
+
+
+
+
From 4c1dfbbb6abf6bd53e6919d930e3d068d842ef7a Mon Sep 17 00:00:00 2001
From: oca-travis
Date: Thu, 26 Nov 2020 11:53:18 +0000
Subject: [PATCH 02/99] [UPD] Update edi_exchange_template.pot
---
.../i18n/edi_exchange_template.pot | 184 ++++++++++++++++++
1 file changed, 184 insertions(+)
create mode 100644 edi_exchange_template_oca/i18n/edi_exchange_template.pot
diff --git a/edi_exchange_template_oca/i18n/edi_exchange_template.pot b/edi_exchange_template_oca/i18n/edi_exchange_template.pot
new file mode 100644
index 000000000..6e0b1ccfc
--- /dev/null
+++ b/edi_exchange_template_oca/i18n/edi_exchange_template.pot
@@ -0,0 +1,184 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * edi_exchange_template
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 13.0\n"
+"Report-Msgid-Bugs-To: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: edi_exchange_template
+#: model:ir.model.fields,field_description:edi_exchange_template.field_edi_exchange_template_mixin__backend_id
+#: model:ir.model.fields,field_description:edi_exchange_template.field_edi_exchange_template_output__backend_id
+#: model_terms:ir.ui.view,arch_db:edi_exchange_template.edi_exchange_template_output_view_search
+msgid "Backend"
+msgstr ""
+
+#. module: edi_exchange_template
+#: model_terms:ir.ui.view,arch_db:edi_exchange_template.edi_exchange_template_output_view_search
+msgid "Backend type"
+msgstr ""
+
+#. module: edi_exchange_template
+#: model:ir.model.fields,field_description:edi_exchange_template.field_edi_exchange_template_mixin__code
+#: model:ir.model.fields,field_description:edi_exchange_template.field_edi_exchange_template_output__code
+msgid "Code"
+msgstr ""
+
+#. module: edi_exchange_template
+#: model:ir.model.fields,field_description:edi_exchange_template.field_edi_exchange_template_mixin__code_snippet
+#: model:ir.model.fields,field_description:edi_exchange_template.field_edi_exchange_template_output__code_snippet
+msgid "Code Snippet"
+msgstr ""
+
+#. module: edi_exchange_template
+#: model:ir.model.fields,field_description:edi_exchange_template.field_edi_exchange_template_mixin__code_snippet_docs
+#: model:ir.model.fields,field_description:edi_exchange_template.field_edi_exchange_template_output__code_snippet_docs
+msgid "Code Snippet Docs"
+msgstr ""
+
+#. module: edi_exchange_template
+#: model_terms:ir.ui.view,arch_db:edi_exchange_template.edi_exchange_template_output_view_form
+msgid "Code snippet"
+msgstr ""
+
+#. module: edi_exchange_template
+#: model_terms:ir.ui.view,arch_db:edi_exchange_template.edi_exchange_template_output_view_form
+msgid "Code snippet docs"
+msgstr ""
+
+#. module: edi_exchange_template
+#: model:ir.model.fields,field_description:edi_exchange_template.field_edi_exchange_template_output__create_uid
+msgid "Created by"
+msgstr ""
+
+#. module: edi_exchange_template
+#: model:ir.model.fields,field_description:edi_exchange_template.field_edi_exchange_template_output__create_date
+msgid "Created on"
+msgstr ""
+
+#. module: edi_exchange_template
+#: model:ir.model.fields,field_description:edi_exchange_template.field_edi_exchange_template_mixin__display_name
+#: model:ir.model.fields,field_description:edi_exchange_template.field_edi_exchange_template_output__display_name
+msgid "Display Name"
+msgstr ""
+
+#. module: edi_exchange_template
+#: model:ir.model,name:edi_exchange_template.model_edi_backend
+msgid "EDI Backend"
+msgstr ""
+
+#. module: edi_exchange_template
+#: model:ir.model.fields,field_description:edi_exchange_template.field_edi_exchange_template_mixin__backend_type_id
+#: model:ir.model.fields,field_description:edi_exchange_template.field_edi_exchange_template_output__backend_type_id
+msgid "EDI Backend type"
+msgstr ""
+
+#. module: edi_exchange_template
+#: model:ir.model,name:edi_exchange_template.model_edi_exchange_template_mixin
+msgid "EDI Exchange Output Mixin"
+msgstr ""
+
+#. module: edi_exchange_template
+#: model:ir.model,name:edi_exchange_template.model_edi_exchange_template_output
+msgid "EDI Exchange Output Template"
+msgstr ""
+
+#. module: edi_exchange_template
+#: model:ir.actions.act_window,name:edi_exchange_template.act_open_edi_exchange_template_output_view
+#: model:ir.ui.menu,name:edi_exchange_template.menu_edi_exchange_template_output
+#: model_terms:ir.ui.view,arch_db:edi_exchange_template.edi_exchange_template_output_view_form
+#: model_terms:ir.ui.view,arch_db:edi_exchange_template.edi_exchange_template_output_view_search
+#: model_terms:ir.ui.view,arch_db:edi_exchange_template.edi_exchange_template_output_view_tree
+msgid "EDI Exchange Template Output"
+msgstr ""
+
+#. module: edi_exchange_template
+#: model:ir.ui.menu,name:edi_exchange_template.menu_edi_exchange_template_root
+msgid "EDI Exchange Templates"
+msgstr ""
+
+#. module: edi_exchange_template
+#: model:ir.model.fields,field_description:edi_exchange_template.field_edi_exchange_template_mixin__type_id
+#: model:ir.model.fields,field_description:edi_exchange_template.field_edi_exchange_template_output__type_id
+msgid "EDI Exchange type"
+msgstr ""
+
+#. module: edi_exchange_template
+#: model_terms:ir.ui.view,arch_db:edi_exchange_template.edi_exchange_template_output_view_search
+msgid "Group By"
+msgstr ""
+
+#. module: edi_exchange_template
+#: model:ir.model.fields,field_description:edi_exchange_template.field_edi_exchange_template_mixin__id
+#: model:ir.model.fields,field_description:edi_exchange_template.field_edi_exchange_template_output__id
+msgid "ID"
+msgstr ""
+
+#. module: edi_exchange_template
+#: model:ir.model.fields,help:edi_exchange_template.field_edi_exchange_template_output__template_key
+msgid "ID of the view defined in xml file"
+msgstr ""
+
+#. module: edi_exchange_template
+#: model:ir.model.fields,field_description:edi_exchange_template.field_edi_exchange_template_mixin____last_update
+#: model:ir.model.fields,field_description:edi_exchange_template.field_edi_exchange_template_output____last_update
+msgid "Last Modified on"
+msgstr ""
+
+#. module: edi_exchange_template
+#: model:ir.model.fields,field_description:edi_exchange_template.field_edi_exchange_template_output__write_uid
+msgid "Last Updated by"
+msgstr ""
+
+#. module: edi_exchange_template
+#: model:ir.model.fields,field_description:edi_exchange_template.field_edi_exchange_template_output__write_date
+msgid "Last Updated on"
+msgstr ""
+
+#. module: edi_exchange_template
+#: model:ir.model.fields,field_description:edi_exchange_template.field_edi_exchange_template_mixin__name
+#: model:ir.model.fields,field_description:edi_exchange_template.field_edi_exchange_template_output__name
+msgid "Name"
+msgstr ""
+
+#. module: edi_exchange_template
+#: model:ir.model.fields,field_description:edi_exchange_template.field_edi_exchange_template_output__output_type
+msgid "Output Type"
+msgstr ""
+
+#. module: edi_exchange_template
+#: model:ir.model.fields,field_description:edi_exchange_template.field_edi_exchange_template_output__template_arch
+msgid "QWeb arch"
+msgstr ""
+
+#. module: edi_exchange_template
+#: model:ir.model.fields,field_description:edi_exchange_template.field_edi_exchange_template_output__template_id
+msgid "Qweb Template"
+msgstr ""
+
+#. module: edi_exchange_template
+#: model_terms:ir.ui.view,arch_db:edi_exchange_template.edi_exchange_template_output_view_form
+msgid "Template"
+msgstr ""
+
+#. module: edi_exchange_template
+#: model:ir.model.fields,field_description:edi_exchange_template.field_edi_exchange_template_output__template_key
+msgid "Template key"
+msgstr ""
+
+#. module: edi_exchange_template
+#: model:ir.model.fields,help:edi_exchange_template.field_edi_exchange_template_output__template_arch
+msgid "This field stores the view arch."
+msgstr ""
+
+#. module: edi_exchange_template
+#: model_terms:ir.ui.view,arch_db:edi_exchange_template.edi_exchange_template_output_view_search
+msgid "Type"
+msgstr ""
From e530e9fd426e9d07083ec33dd7e18f52aa7ab753 Mon Sep 17 00:00:00 2001
From: OCA-git-bot
Date: Thu, 26 Nov 2020 12:03:24 +0000
Subject: [PATCH 03/99] [UPD] README.rst
---
edi_exchange_template_oca/README.rst | 8 ++++++++
edi_exchange_template_oca/static/description/index.html | 2 ++
2 files changed, 10 insertions(+)
diff --git a/edi_exchange_template_oca/README.rst b/edi_exchange_template_oca/README.rst
index 2a497ce50..20b862b0b 100644
--- a/edi_exchange_template_oca/README.rst
+++ b/edi_exchange_template_oca/README.rst
@@ -78,6 +78,14 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
+.. |maintainer-simahawk| image:: https://github.com/simahawk.png?size=40px
+ :target: https://github.com/simahawk
+ :alt: simahawk
+
+Current `maintainer `__:
+
+|maintainer-simahawk|
+
This module is part of the `OCA/edi `_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/edi_exchange_template_oca/static/description/index.html b/edi_exchange_template_oca/static/description/index.html
index 81c8f0f4a..b155d5055 100644
--- a/edi_exchange_template_oca/static/description/index.html
+++ b/edi_exchange_template_oca/static/description/index.html
@@ -421,6 +421,8 @@
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
+Current maintainer:
+
This module is part of the OCA/edi project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
From 3f5bedb3039e4b073b410a6c933375919a71ccfc Mon Sep 17 00:00:00 2001
From: OCA-git-bot
Date: Thu, 26 Nov 2020 12:03:25 +0000
Subject: [PATCH 04/99] edi_exchange_template 13.0.1.1.0
---
edi_exchange_template_oca/__manifest__.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/edi_exchange_template_oca/__manifest__.py b/edi_exchange_template_oca/__manifest__.py
index 219dd0834..c66ba0b3a 100644
--- a/edi_exchange_template_oca/__manifest__.py
+++ b/edi_exchange_template_oca/__manifest__.py
@@ -5,7 +5,7 @@
{
"name": "EDI Exchange Template",
"summary": """Allows definition of exchanges via templates.""",
- "version": "13.0.1.0.0",
+ "version": "13.0.1.1.0",
"development_status": "Alpha",
"license": "AGPL-3",
"author": "ACSONE,Odoo Community Association (OCA)",
From 7641440eeed309ff7a5bb6eeba573652f7606cf8 Mon Sep 17 00:00:00 2001
From: Simone Orsi
Date: Thu, 26 Nov 2020 08:44:41 +0100
Subject: [PATCH 05/99] edi_exchange_template: minor changes
---
edi_exchange_template_oca/models/edi_backend.py | 2 ++
.../models/edi_exchange_template_output.py | 11 ++++++++++-
edi_exchange_template_oca/utils.py | 2 +-
3 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/edi_exchange_template_oca/models/edi_backend.py b/edi_exchange_template_oca/models/edi_backend.py
index 559df9756..9ccfc951a 100644
--- a/edi_exchange_template_oca/models/edi_backend.py
+++ b/edi_exchange_template_oca/models/edi_backend.py
@@ -24,6 +24,8 @@ def _get_output_template(self, exchange_record, code=None):
Template's code must match the same component usage as per normal components.
"""
+ # TODO: maybe we can add a m2o to output templates
+ # but then we would need another for input templates if they are introduced.
tmpl = None
candidates = self._generate_output_component_usage_candidates(exchange_record)
if code:
diff --git a/edi_exchange_template_oca/models/edi_exchange_template_output.py b/edi_exchange_template_oca/models/edi_exchange_template_output.py
index 1871c8912..69961c700 100644
--- a/edi_exchange_template_oca/models/edi_exchange_template_output.py
+++ b/edi_exchange_template_oca/models/edi_exchange_template_output.py
@@ -11,7 +11,7 @@
class EDIExchangeOutputTemplate(models.Model):
- """Define an output template to generate outgoing files
+ """Define an output template to generate outgoing records' content.
"""
_name = "edi.exchange.template.output"
@@ -20,12 +20,21 @@ class EDIExchangeOutputTemplate(models.Model):
output_type = fields.Char(required=True)
# TODO: add a good domain (maybe add a new flag or category to ir.ui.view)
+ # Options:
+ # 1. add a flag "edi_template" to ir.ui.view
+ # 2. set model="edi.exchange.template.output" on the view
+ # As templates are defined using `` tag
+ # I'm not sure this is a good option.
+ # 3. what else?
template_id = fields.Many2one(
string="Qweb Template",
comodel_name="ir.ui.view",
required=True,
ondelete="restrict",
)
+ # TODO: find a way to prevent editing "master templates"
+ # This would allow editing only a copy of the original template
+ # so that you can always check or rollback to it.
template_arch = fields.Text(
string="QWeb arch", related="template_id.arch_db", readonly=False,
)
diff --git a/edi_exchange_template_oca/utils.py b/edi_exchange_template_oca/utils.py
index 4fd56ed44..6f5e778e2 100644
--- a/edi_exchange_template_oca/utils.py
+++ b/edi_exchange_template_oca/utils.py
@@ -28,7 +28,7 @@ def xml_purge_nswrapper(xml_content):
# deeper elements come after, keep the root element at the end (if any)
for nswrapper in reversed(root.xpath("//nswrapper")):
parent = nswrapper.getparent()
- if not parent:
+ if parent is None:
# fmt:off
return "".join([
pycompat.to_text(etree.tostring(el))
From 4e0a7d6f15532526e24ba0f2ae1ccf7fa4eb7411 Mon Sep 17 00:00:00 2001
From: Simone Orsi
Date: Thu, 26 Nov 2020 17:04:26 +0100
Subject: [PATCH 06/99] edi.backend: add cron to handle record state updates
---
edi_exchange_template_oca/tests/test_edi_backend_output.py | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/edi_exchange_template_oca/tests/test_edi_backend_output.py b/edi_exchange_template_oca/tests/test_edi_backend_output.py
index 0212886ac..546606a23 100644
--- a/edi_exchange_template_oca/tests/test_edi_backend_output.py
+++ b/edi_exchange_template_oca/tests/test_edi_backend_output.py
@@ -8,13 +8,9 @@
class TestEDIBackendOutputBase(EDIBackendCommonTestCase):
- @classmethod
- def setUpClass(cls):
- super().setUpClass()
- cls._setup_records()
-
@classmethod
def _setup_records(cls):
+ super()._setup_records()
cls.type_out1 = cls._create_exchange_type(
name="Template output 1",
direction="output",
From 28358befb5b8b4d6639625784da2343fcbc9eb45 Mon Sep 17 00:00:00 2001
From: Simone Orsi
Date: Thu, 26 Nov 2020 17:04:56 +0100
Subject: [PATCH 07/99] edi.exchange.template: update according to edi changes
---
edi_exchange_template_oca/models/edi_backend.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/edi_exchange_template_oca/models/edi_backend.py b/edi_exchange_template_oca/models/edi_backend.py
index 9ccfc951a..5308a38cd 100644
--- a/edi_exchange_template_oca/models/edi_backend.py
+++ b/edi_exchange_template_oca/models/edi_backend.py
@@ -27,7 +27,7 @@ def _get_output_template(self, exchange_record, code=None):
# TODO: maybe we can add a m2o to output templates
# but then we would need another for input templates if they are introduced.
tmpl = None
- candidates = self._generate_output_component_usage_candidates(exchange_record)
+ candidates = self._get_component_usage_candidates(exchange_record, "output")
if code:
candidates.insert(code)
for usage in candidates:
From 7fe1e3512bf46bf29e57b49f214f2330e0cd2c9e Mon Sep 17 00:00:00 2001
From: OCA-git-bot
Date: Fri, 27 Nov 2020 12:03:21 +0000
Subject: [PATCH 08/99] edi_exchange_template 13.0.1.2.0
---
edi_exchange_template_oca/__manifest__.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/edi_exchange_template_oca/__manifest__.py b/edi_exchange_template_oca/__manifest__.py
index c66ba0b3a..e42bd459b 100644
--- a/edi_exchange_template_oca/__manifest__.py
+++ b/edi_exchange_template_oca/__manifest__.py
@@ -5,7 +5,7 @@
{
"name": "EDI Exchange Template",
"summary": """Allows definition of exchanges via templates.""",
- "version": "13.0.1.1.0",
+ "version": "13.0.1.2.0",
"development_status": "Alpha",
"license": "AGPL-3",
"author": "ACSONE,Odoo Community Association (OCA)",
From 0d113df2e278abe04b64670c7740d3d2fc200bf3 Mon Sep 17 00:00:00 2001
From: Enric Tobella
Date: Sun, 29 Nov 2020 23:22:34 +0100
Subject: [PATCH 09/99] [FIX] edi_exchange_template Tests
---
edi_exchange_template_oca/models/edi_backend.py | 2 +-
edi_exchange_template_oca/tests/test_edi_backend_output.py | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/edi_exchange_template_oca/models/edi_backend.py b/edi_exchange_template_oca/models/edi_backend.py
index 5308a38cd..998380a8b 100644
--- a/edi_exchange_template_oca/models/edi_backend.py
+++ b/edi_exchange_template_oca/models/edi_backend.py
@@ -27,7 +27,7 @@ def _get_output_template(self, exchange_record, code=None):
# TODO: maybe we can add a m2o to output templates
# but then we would need another for input templates if they are introduced.
tmpl = None
- candidates = self._get_component_usage_candidates(exchange_record, "output")
+ candidates = self._get_component_usage_candidates(exchange_record, "generate")
if code:
candidates.insert(code)
for usage in candidates:
diff --git a/edi_exchange_template_oca/tests/test_edi_backend_output.py b/edi_exchange_template_oca/tests/test_edi_backend_output.py
index 546606a23..47a57435e 100644
--- a/edi_exchange_template_oca/tests/test_edi_backend_output.py
+++ b/edi_exchange_template_oca/tests/test_edi_backend_output.py
@@ -32,7 +32,7 @@ def _setup_records(cls):
)
cls.tmpl_out1 = model.create(
{
- "code": "edi.output.demo_backend.test_type_out1",
+ "code": "edi.output.generate.demo_backend.test_type_out1",
"name": "Out 1",
"backend_type_id": cls.backend.backend_type_id.id,
"type_id": cls.type_out1.id,
@@ -72,7 +72,7 @@ def _setup_records(cls):
)
cls.tmpl_out2 = model.create(
{
- "code": "edi.output.demo_backend.test_type_out2",
+ "code": "edi.output.generate.demo_backend.test_type_out2",
"name": "Out 2",
"backend_type_id": cls.backend.backend_type_id.id,
"type_id": cls.type_out2.id,
From 962c2a22b8c6721dc59a6d8aac8b7e9b79b92189 Mon Sep 17 00:00:00 2001
From: OCA-git-bot
Date: Mon, 30 Nov 2020 09:58:13 +0000
Subject: [PATCH 10/99] edi_exchange_template 13.0.1.3.0
---
edi_exchange_template_oca/__manifest__.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/edi_exchange_template_oca/__manifest__.py b/edi_exchange_template_oca/__manifest__.py
index e42bd459b..a8772c7ec 100644
--- a/edi_exchange_template_oca/__manifest__.py
+++ b/edi_exchange_template_oca/__manifest__.py
@@ -5,7 +5,7 @@
{
"name": "EDI Exchange Template",
"summary": """Allows definition of exchanges via templates.""",
- "version": "13.0.1.2.0",
+ "version": "13.0.1.3.0",
"development_status": "Alpha",
"license": "AGPL-3",
"author": "ACSONE,Odoo Community Association (OCA)",
From 082985b2be99c8e581a78edc2cc96a28f0e75f7c Mon Sep 17 00:00:00 2001
From: Simone Orsi
Date: Wed, 2 Dec 2020 18:18:15 +0100
Subject: [PATCH 11/99] edi.template: fix info provider lookup
---
.../models/edi_exchange_template_output.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/edi_exchange_template_oca/models/edi_exchange_template_output.py b/edi_exchange_template_oca/models/edi_exchange_template_output.py
index 69961c700..28ecf5357 100644
--- a/edi_exchange_template_oca/models/edi_exchange_template_output.py
+++ b/edi_exchange_template_oca/models/edi_exchange_template_output.py
@@ -111,7 +111,7 @@ def _get_info_provider(self, exchange_record, work_ctx=None, usage=None, **kw):
)
default_work_ctx.update(work_ctx or {})
usage_candidates = [usage or self.code + ".info"]
- provider = exchange_record.backend_id._get_component(
+ provider = exchange_record.backend_id._find_component(
usage_candidates, work_ctx=default_work_ctx, **kw
)
return provider
From 2e3f27d3745dc80f041456801d647064d0a53190 Mon Sep 17 00:00:00 2001
From: Simone Orsi
Date: Mon, 7 Dec 2020 13:52:56 +0100
Subject: [PATCH 12/99] edi_exchange_template: fix tests class
---
edi_exchange_template_oca/tests/test_edi_backend_output.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/edi_exchange_template_oca/tests/test_edi_backend_output.py b/edi_exchange_template_oca/tests/test_edi_backend_output.py
index 47a57435e..f40ac4859 100644
--- a/edi_exchange_template_oca/tests/test_edi_backend_output.py
+++ b/edi_exchange_template_oca/tests/test_edi_backend_output.py
@@ -4,10 +4,10 @@
from lxml import etree
-from odoo.addons.edi.tests.common import EDIBackendCommonTestCase
+from odoo.addons.edi.tests.common import EDIBackendCommonComponentTestCase
-class TestEDIBackendOutputBase(EDIBackendCommonTestCase):
+class TestEDIBackendOutputBase(EDIBackendCommonComponentTestCase):
@classmethod
def _setup_records(cls):
super()._setup_records()
From a8d4495566abbff01fb70aa28a35b7eff905ace9 Mon Sep 17 00:00:00 2001
From: OCA-git-bot
Date: Tue, 8 Dec 2020 10:29:26 +0000
Subject: [PATCH 13/99] edi_exchange_template 13.0.1.4.0
---
edi_exchange_template_oca/__manifest__.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/edi_exchange_template_oca/__manifest__.py b/edi_exchange_template_oca/__manifest__.py
index a8772c7ec..b3d821816 100644
--- a/edi_exchange_template_oca/__manifest__.py
+++ b/edi_exchange_template_oca/__manifest__.py
@@ -5,7 +5,7 @@
{
"name": "EDI Exchange Template",
"summary": """Allows definition of exchanges via templates.""",
- "version": "13.0.1.3.0",
+ "version": "13.0.1.4.0",
"development_status": "Alpha",
"license": "AGPL-3",
"author": "ACSONE,Odoo Community Association (OCA)",
From ee89984a67340507c41a26d97c38ea48271cbe99 Mon Sep 17 00:00:00 2001
From: Simone Orsi
Date: Mon, 8 Feb 2021 09:48:25 +0100
Subject: [PATCH 14/99] edi_exchange_template: add TODO
---
edi_exchange_template_oca/components/common.py | 3 +++
1 file changed, 3 insertions(+)
diff --git a/edi_exchange_template_oca/components/common.py b/edi_exchange_template_oca/components/common.py
index 06d6a876f..0fe861d44 100644
--- a/edi_exchange_template_oca/components/common.py
+++ b/edi_exchange_template_oca/components/common.py
@@ -8,6 +8,9 @@
class EDIExchangeInfoMixin(AbstractComponent):
"""Abstract component mixin provide info for exchanges."""
+ # TODO: this should be moved to core and renamed to `data`.
+ # A `data` component could be used for both incoming and outgoing.
+
_name = "edi.info.provider.mixin"
_collection = "edi.backend"
# Enable validation of work context attributes
From 7814f221189b1f1d8cc2e6fdf2918e7acc25dc33 Mon Sep 17 00:00:00 2001
From: Simone Orsi
Date: Tue, 9 Mar 2021 17:41:21 +0100
Subject: [PATCH 15/99] edi_exchange_template: adapt lookup to new api
---
edi_exchange_template_oca/models/edi_backend.py | 17 +++++++++++++----
.../tests/test_edi_backend_output.py | 4 ++++
2 files changed, 17 insertions(+), 4 deletions(-)
diff --git a/edi_exchange_template_oca/models/edi_backend.py b/edi_exchange_template_oca/models/edi_backend.py
index 998380a8b..a4797a55d 100644
--- a/edi_exchange_template_oca/models/edi_backend.py
+++ b/edi_exchange_template_oca/models/edi_backend.py
@@ -24,14 +24,23 @@ def _get_output_template(self, exchange_record, code=None):
Template's code must match the same component usage as per normal components.
"""
+ search = self.output_template_model.search
# TODO: maybe we can add a m2o to output templates
# but then we would need another for input templates if they are introduced.
tmpl = None
- candidates = self._get_component_usage_candidates(exchange_record, "generate")
if code:
- candidates.insert(code)
- for usage in candidates:
- tmpl = self.output_template_model.search([("code", "=", usage)], limit=1)
+ domain = [("code", "=", code)]
+ return search(domain, limit=1)
+ for domain in self._get_output_template_domains(exchange_record):
+ tmpl = search(domain, limit=1)
if tmpl:
break
return tmpl
+
+ def _get_output_template_domains(self, exchange_record):
+ """Retrieve domains to lookup for templates by priority."""
+ backend_type_leaf = [("backend_type_id", "=", self.backend_type_id.id)]
+ exchange_type_leaf = [("type_id", "=", exchange_record.type_id.id)]
+ full_match_domain = backend_type_leaf + exchange_type_leaf
+ partial_match_domain = backend_type_leaf
+ return full_match_domain, partial_match_domain
diff --git a/edi_exchange_template_oca/tests/test_edi_backend_output.py b/edi_exchange_template_oca/tests/test_edi_backend_output.py
index f40ac4859..1365760a4 100644
--- a/edi_exchange_template_oca/tests/test_edi_backend_output.py
+++ b/edi_exchange_template_oca/tests/test_edi_backend_output.py
@@ -102,6 +102,10 @@ def test_get_template(self):
self.assertEqual(
self.backend._get_output_template(self.record2), self.tmpl_out2
)
+ self.assertEqual(
+ self.backend._get_output_template(self.record2, code=self.tmpl_out1.code),
+ self.tmpl_out1,
+ )
def test_generate_file(self):
output = self.backend.generate_output(self.record1)
From 9439165d18e5666936be58830ac94f5a64a87d8f Mon Sep 17 00:00:00 2001
From: OCA-git-bot
Date: Wed, 10 Mar 2021 06:49:56 +0000
Subject: [PATCH 16/99] edi_exchange_template 13.0.1.5.0
---
edi_exchange_template_oca/__manifest__.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/edi_exchange_template_oca/__manifest__.py b/edi_exchange_template_oca/__manifest__.py
index b3d821816..7ab808046 100644
--- a/edi_exchange_template_oca/__manifest__.py
+++ b/edi_exchange_template_oca/__manifest__.py
@@ -5,7 +5,7 @@
{
"name": "EDI Exchange Template",
"summary": """Allows definition of exchanges via templates.""",
- "version": "13.0.1.4.0",
+ "version": "13.0.1.5.0",
"development_status": "Alpha",
"license": "AGPL-3",
"author": "ACSONE,Odoo Community Association (OCA)",
From 586e3fba93171f7cb4a7042a141bd11a5979b72a Mon Sep 17 00:00:00 2001
From: Enric Tobella
Date: Wed, 10 Mar 2021 13:56:20 +0100
Subject: [PATCH 17/99] [CHG] edi: Use more permissive licence: AGPL-> LGPL
---
edi_exchange_template_oca/README.rst | 10 +++++-----
edi_exchange_template_oca/__manifest__.py | 4 ++--
edi_exchange_template_oca/components/common.py | 2 +-
edi_exchange_template_oca/components/output_mixin.py | 2 +-
edi_exchange_template_oca/models/edi_backend.py | 2 +-
.../models/edi_exchange_template_mixin.py | 2 +-
.../models/edi_exchange_template_output.py | 2 +-
.../static/description/index.html | 2 +-
.../tests/test_edi_backend_output.py | 2 +-
9 files changed, 14 insertions(+), 14 deletions(-)
diff --git a/edi_exchange_template_oca/README.rst b/edi_exchange_template_oca/README.rst
index 20b862b0b..f43910b54 100644
--- a/edi_exchange_template_oca/README.rst
+++ b/edi_exchange_template_oca/README.rst
@@ -10,9 +10,9 @@ EDI Exchange Template
.. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png
:target: https://odoo-community.org/page/development-status
:alt: Alpha
-.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
- :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
- :alt: License: AGPL-3
+.. |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-lightgray.png?logo=github
:target: https://github.com/OCA/edi/tree/13.0/edi_exchange_template
:alt: OCA/edi
@@ -23,7 +23,7 @@ EDI Exchange Template
:target: https://runbot.odoo-community.org/runbot/226/13.0
:alt: Try me on Runbot
-|badge1| |badge2| |badge3| |badge4| |badge5|
+|badge1| |badge2| |badge3| |badge4| |badge5|
Provide EDI exchange templates to control input/output records contents.
@@ -84,7 +84,7 @@ promote its widespread use.
Current `maintainer `__:
-|maintainer-simahawk|
+|maintainer-simahawk|
This module is part of the `OCA/edi `_ project on GitHub.
diff --git a/edi_exchange_template_oca/__manifest__.py b/edi_exchange_template_oca/__manifest__.py
index 7ab808046..b8a4279eb 100644
--- a/edi_exchange_template_oca/__manifest__.py
+++ b/edi_exchange_template_oca/__manifest__.py
@@ -1,13 +1,13 @@
# Copyright 2020 ACSONE
# @author: Simone Orsi
-# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
{
"name": "EDI Exchange Template",
"summary": """Allows definition of exchanges via templates.""",
"version": "13.0.1.5.0",
"development_status": "Alpha",
- "license": "AGPL-3",
+ "license": "LGPL-3",
"author": "ACSONE,Odoo Community Association (OCA)",
"maintainers": ["simahawk"],
"depends": ["edi", "component"],
diff --git a/edi_exchange_template_oca/components/common.py b/edi_exchange_template_oca/components/common.py
index 0fe861d44..39c0d5816 100644
--- a/edi_exchange_template_oca/components/common.py
+++ b/edi_exchange_template_oca/components/common.py
@@ -1,6 +1,6 @@
# Copyright 2020 ACSONE
# @author: Simone Orsi
-# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
from odoo.addons.component.core import AbstractComponent
diff --git a/edi_exchange_template_oca/components/output_mixin.py b/edi_exchange_template_oca/components/output_mixin.py
index 4567480ea..0e50c6f57 100644
--- a/edi_exchange_template_oca/components/output_mixin.py
+++ b/edi_exchange_template_oca/components/output_mixin.py
@@ -1,6 +1,6 @@
# Copyright 2020 ACSONE
# @author: Simone Orsi
-# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
import datetime
diff --git a/edi_exchange_template_oca/models/edi_backend.py b/edi_exchange_template_oca/models/edi_backend.py
index a4797a55d..2a538a90e 100644
--- a/edi_exchange_template_oca/models/edi_backend.py
+++ b/edi_exchange_template_oca/models/edi_backend.py
@@ -1,6 +1,6 @@
# Copyright 2020 ACSONE SA
# @author Simone Orsi
-# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
from odoo import models
diff --git a/edi_exchange_template_oca/models/edi_exchange_template_mixin.py b/edi_exchange_template_oca/models/edi_exchange_template_mixin.py
index ea4dec728..e6a6e53a2 100644
--- a/edi_exchange_template_oca/models/edi_exchange_template_mixin.py
+++ b/edi_exchange_template_oca/models/edi_exchange_template_mixin.py
@@ -1,6 +1,6 @@
# Copyright 2020 ACSONE SA
# @author Simone Orsi
-# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
import datetime
import logging
import textwrap
diff --git a/edi_exchange_template_oca/models/edi_exchange_template_output.py b/edi_exchange_template_oca/models/edi_exchange_template_output.py
index 28ecf5357..49b41bff5 100644
--- a/edi_exchange_template_oca/models/edi_exchange_template_output.py
+++ b/edi_exchange_template_oca/models/edi_exchange_template_output.py
@@ -1,6 +1,6 @@
# Copyright 2020 ACSONE SA
# @author Simone Orsi
-# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
import logging
from odoo import fields, models
diff --git a/edi_exchange_template_oca/static/description/index.html b/edi_exchange_template_oca/static/description/index.html
index b155d5055..50f629253 100644
--- a/edi_exchange_template_oca/static/description/index.html
+++ b/edi_exchange_template_oca/static/description/index.html
@@ -367,7 +367,7 @@ EDI Exchange Template
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-

+

Provide EDI exchange templates to control input/output records contents.
Provides following models:
diff --git a/edi_exchange_template_oca/tests/test_edi_backend_output.py b/edi_exchange_template_oca/tests/test_edi_backend_output.py
index 1365760a4..38dc0e82b 100644
--- a/edi_exchange_template_oca/tests/test_edi_backend_output.py
+++ b/edi_exchange_template_oca/tests/test_edi_backend_output.py
@@ -1,5 +1,5 @@
# Copyright 2020 ACSONE SA/NV ()
-# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
import base64
from lxml import etree
From 37bb3d4c79dd5d8dcc93382d194932b4457af4e4 Mon Sep 17 00:00:00 2001
From: Simone Orsi
Date: Tue, 8 Dec 2020 22:26:27 +0100
Subject: [PATCH 18/99] edi.backend: rename generate to match others
All the other main methods start with 'exchange_'.
Make generate respect this convention.
---
edi_exchange_template_oca/models/edi_backend.py | 6 +++---
.../models/edi_exchange_template_output.py | 4 ++--
edi_exchange_template_oca/tests/test_edi_backend_output.py | 4 ++--
3 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/edi_exchange_template_oca/models/edi_backend.py b/edi_exchange_template_oca/models/edi_backend.py
index 2a538a90e..393eb8bd3 100644
--- a/edi_exchange_template_oca/models/edi_backend.py
+++ b/edi_exchange_template_oca/models/edi_backend.py
@@ -8,12 +8,12 @@
class EDIBackend(models.Model):
_inherit = "edi.backend"
- def _generate_output(self, exchange_record, **kw):
+ def _exchange_generate(self, exchange_record, **kw):
# Template take precedence over component lookup
tmpl = self._get_output_template(exchange_record)
if tmpl:
- return tmpl.generate_output(exchange_record, **kw)
- return super()._generate_output(exchange_record, **kw)
+ return tmpl.exchange_generate(exchange_record, **kw)
+ return super()._exchange_generate(exchange_record, **kw)
@property
def output_template_model(self):
diff --git a/edi_exchange_template_oca/models/edi_exchange_template_output.py b/edi_exchange_template_oca/models/edi_exchange_template_output.py
index 49b41bff5..6206512e0 100644
--- a/edi_exchange_template_oca/models/edi_exchange_template_output.py
+++ b/edi_exchange_template_oca/models/edi_exchange_template_output.py
@@ -56,7 +56,7 @@ def _default_code_snippet_docs(self):
"""
)
- def generate_output(self, exchange_record, **kw):
+ def exchange_generate(self, exchange_record, **kw):
"""Generate output for given record using related QWeb template.
"""
tmpl = self.template_id
@@ -90,7 +90,7 @@ def _render_template(self, exchange_record, code, **kw):
"""
tmpl = self.search([("code", "=", code)], limit=1)
tmpl.ensure_one()
- return tmpl.generate_output(exchange_record, **kw)
+ return tmpl.exchange_generate(exchange_record, **kw)
def _post_process_output(self, output):
"""Post process generated output.
diff --git a/edi_exchange_template_oca/tests/test_edi_backend_output.py b/edi_exchange_template_oca/tests/test_edi_backend_output.py
index 38dc0e82b..fb0cb5c98 100644
--- a/edi_exchange_template_oca/tests/test_edi_backend_output.py
+++ b/edi_exchange_template_oca/tests/test_edi_backend_output.py
@@ -108,12 +108,12 @@ def test_get_template(self):
)
def test_generate_file(self):
- output = self.backend.generate_output(self.record1)
+ output = self.backend.exchange_generate(self.record1)
expected = "{0.ref} - {0.name}".format(self.partner)
self.assertEqual(output.strip(), expected)
file_content = base64.b64decode(self.record1.exchange_file).decode()
self.assertEqual(file_content.strip(), expected)
- output = self.backend.generate_output(self.record2)
+ output = self.backend.exchange_generate(self.record2)
doc = etree.fromstring(output)
self.assertEqual(doc.tag, "Record")
self.assertEqual(doc.attrib, {"ref": self.partner.ref})
From cbc03836455a2408bcbef19a38140f8b850fac4b Mon Sep 17 00:00:00 2001
From: OCA-git-bot
Date: Mon, 15 Mar 2021 21:46:44 +0000
Subject: [PATCH 19/99] [UPD] README.rst
---
edi_exchange_template_oca/README.rst | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/edi_exchange_template_oca/README.rst b/edi_exchange_template_oca/README.rst
index f43910b54..a856a7670 100644
--- a/edi_exchange_template_oca/README.rst
+++ b/edi_exchange_template_oca/README.rst
@@ -23,7 +23,7 @@ EDI Exchange Template
:target: https://runbot.odoo-community.org/runbot/226/13.0
:alt: Try me on Runbot
-|badge1| |badge2| |badge3| |badge4| |badge5|
+|badge1| |badge2| |badge3| |badge4| |badge5|
Provide EDI exchange templates to control input/output records contents.
@@ -84,7 +84,7 @@ promote its widespread use.
Current `maintainer `__:
-|maintainer-simahawk|
+|maintainer-simahawk|
This module is part of the `OCA/edi `_ project on GitHub.
From 92b1ca3bba086291fa67fbd4f936d6a472b1d8a7 Mon Sep 17 00:00:00 2001
From: OCA-git-bot
Date: Mon, 15 Mar 2021 21:46:56 +0000
Subject: [PATCH 20/99] edi_exchange_template 13.0.1.5.1
---
edi_exchange_template_oca/__manifest__.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/edi_exchange_template_oca/__manifest__.py b/edi_exchange_template_oca/__manifest__.py
index b8a4279eb..750a24bf5 100644
--- a/edi_exchange_template_oca/__manifest__.py
+++ b/edi_exchange_template_oca/__manifest__.py
@@ -5,7 +5,7 @@
{
"name": "EDI Exchange Template",
"summary": """Allows definition of exchanges via templates.""",
- "version": "13.0.1.5.0",
+ "version": "13.0.1.5.1",
"development_status": "Alpha",
"license": "LGPL-3",
"author": "ACSONE,Odoo Community Association (OCA)",
From eee2ca209626c46e2995da973aa2903424ae18f0 Mon Sep 17 00:00:00 2001
From: OCA-git-bot
Date: Tue, 16 Mar 2021 11:36:32 +0000
Subject: [PATCH 21/99] edi_exchange_template 13.0.1.6.0
---
edi_exchange_template_oca/__manifest__.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/edi_exchange_template_oca/__manifest__.py b/edi_exchange_template_oca/__manifest__.py
index 750a24bf5..95d6a3d55 100644
--- a/edi_exchange_template_oca/__manifest__.py
+++ b/edi_exchange_template_oca/__manifest__.py
@@ -5,7 +5,7 @@
{
"name": "EDI Exchange Template",
"summary": """Allows definition of exchanges via templates.""",
- "version": "13.0.1.5.1",
+ "version": "13.0.1.6.0",
"development_status": "Alpha",
"license": "LGPL-3",
"author": "ACSONE,Odoo Community Association (OCA)",
From 553fef28036e03e2321f45c406ade9e427539349 Mon Sep 17 00:00:00 2001
From: Enric Tobella
Date: Tue, 25 May 2021 16:58:03 +0200
Subject: [PATCH 22/99] [IMP] edi_exchange_template: Allow to use report
instead of view
---
.../models/edi_exchange_template_output.py | 28 +++++++++++---
.../tests/test_edi_backend_output.py | 37 +++++++++++++++++++
.../edi_exchange_template_output_views.xml | 16 +++++++-
3 files changed, 74 insertions(+), 7 deletions(-)
diff --git a/edi_exchange_template_oca/models/edi_exchange_template_output.py b/edi_exchange_template_oca/models/edi_exchange_template_output.py
index 6206512e0..14cb6e241 100644
--- a/edi_exchange_template_oca/models/edi_exchange_template_output.py
+++ b/edi_exchange_template_oca/models/edi_exchange_template_output.py
@@ -18,6 +18,11 @@ class EDIExchangeOutputTemplate(models.Model):
_inherit = "edi.exchange.template.mixin"
_description = "EDI Exchange Output Template"
+ generator = fields.Selection(
+ [("qweb", "Qweb Template"), ("report", "Report")],
+ required=True,
+ default="qweb",
+ )
output_type = fields.Char(required=True)
# TODO: add a good domain (maybe add a new flag or category to ir.ui.view)
# Options:
@@ -29,9 +34,10 @@ class EDIExchangeOutputTemplate(models.Model):
template_id = fields.Many2one(
string="Qweb Template",
comodel_name="ir.ui.view",
- required=True,
+ required=False,
ondelete="restrict",
)
+ report_id = fields.Many2one(comodel_name="ir.actions.report", ondelete="restrict",)
# TODO: find a way to prevent editing "master templates"
# This would allow editing only a copy of the original template
# so that you can always check or rollback to it.
@@ -59,12 +65,24 @@ def _default_code_snippet_docs(self):
def exchange_generate(self, exchange_record, **kw):
"""Generate output for given record using related QWeb template.
"""
+ method = "_generate_" + self.generator
+ try:
+ generator = getattr(self, method)
+ except AttributeError:
+ raise NotImplementedError(f"`{method}` not found")
+ result = generator(exchange_record, **kw)
+ return self._post_process_output(result)
+
+ def _generate_qweb(self, exchange_record, **kw):
tmpl = self.template_id
- # TODO: how to validate mandatory render values?
- # (eg: sender/receiver are mandatory for BH)
values = self._get_render_values(exchange_record, **kw)
- output = tmpl.render(values)
- return self._post_process_output(output)
+ return tmpl.render(values)
+
+ def _generate_report(self, exchange_record, **kw):
+ report = self.report_id
+ values = self._get_render_values(exchange_record, **kw)
+ res_ids = values.get("res_ids", [])
+ return report.render(res_ids, data=values)[0]
def _get_render_values(self, exchange_record, **kw):
"""Collect values to render current template."""
diff --git a/edi_exchange_template_oca/tests/test_edi_backend_output.py b/edi_exchange_template_oca/tests/test_edi_backend_output.py
index fb0cb5c98..98bef4fd3 100644
--- a/edi_exchange_template_oca/tests/test_edi_backend_output.py
+++ b/edi_exchange_template_oca/tests/test_edi_backend_output.py
@@ -91,6 +91,35 @@ def _setup_records(cls):
"type_id": cls.type_out2.id,
}
cls.record2 = cls.backend.create_record("test_type_out2", vals)
+ cls.type_out3 = cls._create_exchange_type(
+ name="Template output 3",
+ direction="output",
+ code="test_type_out3",
+ exchange_file_ext="xml",
+ exchange_filename_pattern="{record.id}-{type.code}-{dt}",
+ )
+ cls.report = cls.env.ref("web.action_report_externalpreview")
+ cls.tmpl_out3 = model.create(
+ {
+ "code": "edi.output.generate.demo_backend.test_type_out3",
+ "name": "Out 3",
+ "backend_type_id": cls.backend.backend_type_id.id,
+ "type_id": cls.type_out3.id,
+ "generator": "report",
+ "report_id": cls.report.id,
+ "output_type": "pdf",
+ "code_snippet": """
+result = {"res_ids": record.ids}
+ """,
+ }
+ )
+ company = cls.env.ref("base.main_company")
+ vals = {
+ "model": company._name,
+ "res_id": company.id,
+ "type_id": cls.type_out2.id,
+ }
+ cls.record3 = cls.backend.create_record("test_type_out3", vals)
# TODO: add more unit tests
@@ -122,3 +151,11 @@ def test_generate_file(self):
self.assertEqual(doc.getchildren()[1].tag, "Custom")
self.assertEqual(doc.getchildren()[1].text, "2")
self.assertEqual(doc.getchildren()[1].attrib, {"bit": "custom_var"})
+
+ def test_generate_file_report(self):
+ output = self.backend.exchange_generate(self.record3)
+ self.assertTrue(output)
+ self.assertEqual(
+ self.report.render([self.record3.res_id])[0].strip().decode("UTF-8"),
+ output.strip(),
+ )
diff --git a/edi_exchange_template_oca/views/edi_exchange_template_output_views.xml b/edi_exchange_template_oca/views/edi_exchange_template_output_views.xml
index e5e42e791..91e3cf79e 100644
--- a/edi_exchange_template_oca/views/edi_exchange_template_output_views.xml
+++ b/edi_exchange_template_oca/views/edi_exchange_template_output_views.xml
@@ -30,10 +30,22 @@
-
+
+
+
-
+
Date: Wed, 26 May 2021 15:30:11 +0200
Subject: [PATCH 23/99] [IMP] edi_exchange_template_oca: black, isort, prettier
---
.../models/edi_exchange_template_mixin.py | 3 +--
.../models/edi_exchange_template_output.py | 21 +++++++++++--------
2 files changed, 13 insertions(+), 11 deletions(-)
diff --git a/edi_exchange_template_oca/models/edi_exchange_template_mixin.py b/edi_exchange_template_oca/models/edi_exchange_template_mixin.py
index e6a6e53a2..383f90b5d 100644
--- a/edi_exchange_template_oca/models/edi_exchange_template_mixin.py
+++ b/edi_exchange_template_oca/models/edi_exchange_template_mixin.py
@@ -17,8 +17,7 @@
class EDIExchangeTemplateMixin(models.AbstractModel):
- """Define a common ground for EDI exchange templates.
- """
+ """Define a common ground for EDI exchange templates."""
_name = "edi.exchange.template.mixin"
_description = "EDI Exchange Output Mixin"
diff --git a/edi_exchange_template_oca/models/edi_exchange_template_output.py b/edi_exchange_template_oca/models/edi_exchange_template_output.py
index 14cb6e241..a1afd313b 100644
--- a/edi_exchange_template_oca/models/edi_exchange_template_output.py
+++ b/edi_exchange_template_oca/models/edi_exchange_template_output.py
@@ -11,8 +11,7 @@
class EDIExchangeOutputTemplate(models.Model):
- """Define an output template to generate outgoing records' content.
- """
+ """Define an output template to generate outgoing records' content."""
_name = "edi.exchange.template.output"
_inherit = "edi.exchange.template.mixin"
@@ -37,12 +36,17 @@ class EDIExchangeOutputTemplate(models.Model):
required=False,
ondelete="restrict",
)
- report_id = fields.Many2one(comodel_name="ir.actions.report", ondelete="restrict",)
+ report_id = fields.Many2one(
+ comodel_name="ir.actions.report",
+ ondelete="restrict",
+ )
# TODO: find a way to prevent editing "master templates"
# This would allow editing only a copy of the original template
# so that you can always check or rollback to it.
template_arch = fields.Text(
- string="QWeb arch", related="template_id.arch_db", readonly=False,
+ string="QWeb arch",
+ related="template_id.arch_db",
+ readonly=False,
)
template_key = fields.Char(related="template_id.xml_id", string="Template key")
@@ -63,8 +67,7 @@ def _default_code_snippet_docs(self):
)
def exchange_generate(self, exchange_record, **kw):
- """Generate output for given record using related QWeb template.
- """
+ """Generate output for given record using related QWeb template."""
method = "_generate_" + self.generator
try:
generator = getattr(self, method)
@@ -111,8 +114,7 @@ def _render_template(self, exchange_record, code, **kw):
return tmpl.exchange_generate(exchange_record, **kw)
def _post_process_output(self, output):
- """Post process generated output.
- """
+ """Post process generated output."""
if self.output_type == "xml":
# TODO: lookup for components to handle this dynamically
return xml_purge_nswrapper(output)
@@ -125,7 +127,8 @@ def _get_info_provider(self, exchange_record, work_ctx=None, usage=None, **kw):
TODO: add tests
"""
default_work_ctx = dict(
- exchange_record=exchange_record, record=exchange_record.record,
+ exchange_record=exchange_record,
+ record=exchange_record.record,
)
default_work_ctx.update(work_ctx or {})
usage_candidates = [usage or self.code + ".info"]
From 4ddec75abc1af709b0cb1fbeaec7cd2b331c9f22 Mon Sep 17 00:00:00 2001
From: Enric Tobella
Date: Wed, 26 May 2021 15:42:54 +0200
Subject: [PATCH 24/99] [MIG] edi_exchange_template_oca: Migration to 14.0
---
edi_exchange_template_oca/__manifest__.py | 5 +++--
.../models/edi_exchange_template_mixin.py | 13 +++++--------
.../models/edi_exchange_template_output.py | 4 ++--
.../tests/test_edi_backend_output.py | 4 ++--
4 files changed, 12 insertions(+), 14 deletions(-)
diff --git a/edi_exchange_template_oca/__manifest__.py b/edi_exchange_template_oca/__manifest__.py
index 95d6a3d55..02907dd74 100644
--- a/edi_exchange_template_oca/__manifest__.py
+++ b/edi_exchange_template_oca/__manifest__.py
@@ -5,12 +5,13 @@
{
"name": "EDI Exchange Template",
"summary": """Allows definition of exchanges via templates.""",
- "version": "13.0.1.6.0",
+ "version": "14.0.1.0.0",
"development_status": "Alpha",
"license": "LGPL-3",
"author": "ACSONE,Odoo Community Association (OCA)",
"maintainers": ["simahawk"],
- "depends": ["edi", "component"],
+ "website": "https://github.com/OCA/edi",
+ "depends": ["edi_oca", "component"],
"data": [
"security/ir_model_access.xml",
"views/edi_exchange_template_output_views.xml",
diff --git a/edi_exchange_template_oca/models/edi_exchange_template_mixin.py b/edi_exchange_template_oca/models/edi_exchange_template_mixin.py
index 383f90b5d..8a8e1cc5a 100644
--- a/edi_exchange_template_oca/models/edi_exchange_template_mixin.py
+++ b/edi_exchange_template_oca/models/edi_exchange_template_mixin.py
@@ -4,14 +4,11 @@
import datetime
import logging
import textwrap
-import time
-import dateutil
import pytz
from odoo import fields, models
-from odoo.tools import DotDict
-from odoo.tools.safe_eval import safe_eval
+from odoo.tools import DotDict, safe_eval
_logger = logging.getLogger(__name__)
@@ -90,9 +87,9 @@ def _get_code_snippet_eval_context(self):
:returns: dict -- evaluation context given to safe_eval
"""
return {
- "datetime": datetime,
- "dateutil": dateutil,
- "time": time,
+ "datetime": safe_eval.datetime,
+ "dateutil": safe_eval.dateutil,
+ "time": safe_eval.time,
"uid": self.env.uid,
"user": self.env.user,
"DotDict": DotDict,
@@ -102,7 +99,7 @@ def _evaluate_code_snippet(self, **render_values):
if not self._code_snippet_valued():
return {}
eval_ctx = dict(render_values, **self._get_code_snippet_eval_context())
- safe_eval(self.code_snippet, eval_ctx, mode="exec", nocopy=True)
+ safe_eval.safe_eval(self.code_snippet, eval_ctx, mode="exec", nocopy=True)
result = eval_ctx.get("result", {})
if not isinstance(result, dict):
_logger.error("code_snippet should return a dict into `result`")
diff --git a/edi_exchange_template_oca/models/edi_exchange_template_output.py b/edi_exchange_template_oca/models/edi_exchange_template_output.py
index a1afd313b..f3707c6ff 100644
--- a/edi_exchange_template_oca/models/edi_exchange_template_output.py
+++ b/edi_exchange_template_oca/models/edi_exchange_template_output.py
@@ -79,13 +79,13 @@ def exchange_generate(self, exchange_record, **kw):
def _generate_qweb(self, exchange_record, **kw):
tmpl = self.template_id
values = self._get_render_values(exchange_record, **kw)
- return tmpl.render(values)
+ return tmpl._render(values)
def _generate_report(self, exchange_record, **kw):
report = self.report_id
values = self._get_render_values(exchange_record, **kw)
res_ids = values.get("res_ids", [])
- return report.render(res_ids, data=values)[0]
+ return report._render(res_ids, data=values)[0]
def _get_render_values(self, exchange_record, **kw):
"""Collect values to render current template."""
diff --git a/edi_exchange_template_oca/tests/test_edi_backend_output.py b/edi_exchange_template_oca/tests/test_edi_backend_output.py
index 98bef4fd3..fc45d2465 100644
--- a/edi_exchange_template_oca/tests/test_edi_backend_output.py
+++ b/edi_exchange_template_oca/tests/test_edi_backend_output.py
@@ -4,7 +4,7 @@
from lxml import etree
-from odoo.addons.edi.tests.common import EDIBackendCommonComponentTestCase
+from odoo.addons.edi_oca.tests.common import EDIBackendCommonComponentTestCase
class TestEDIBackendOutputBase(EDIBackendCommonComponentTestCase):
@@ -156,6 +156,6 @@ def test_generate_file_report(self):
output = self.backend.exchange_generate(self.record3)
self.assertTrue(output)
self.assertEqual(
- self.report.render([self.record3.res_id])[0].strip().decode("UTF-8"),
+ self.report._render([self.record3.res_id])[0].strip().decode("UTF-8"),
output.strip(),
)
From f9f2e67065977c3390decc03ac6e85a1f20f9d5d Mon Sep 17 00:00:00 2001
From: oca-travis
Date: Thu, 27 May 2021 13:35:13 +0000
Subject: [PATCH 25/99] [UPD] Update edi_exchange_template_oca.pot
---
.../i18n/edi_exchange_template_oca.pot | 199 ++++++++++++++++++
1 file changed, 199 insertions(+)
create mode 100644 edi_exchange_template_oca/i18n/edi_exchange_template_oca.pot
diff --git a/edi_exchange_template_oca/i18n/edi_exchange_template_oca.pot b/edi_exchange_template_oca/i18n/edi_exchange_template_oca.pot
new file mode 100644
index 000000000..494722a79
--- /dev/null
+++ b/edi_exchange_template_oca/i18n/edi_exchange_template_oca.pot
@@ -0,0 +1,199 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * edi_exchange_template_oca
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 14.0\n"
+"Report-Msgid-Bugs-To: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: edi_exchange_template_oca
+#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_mixin__backend_id
+#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_output__backend_id
+#: model_terms:ir.ui.view,arch_db:edi_exchange_template_oca.edi_exchange_template_output_view_search
+msgid "Backend"
+msgstr ""
+
+#. module: edi_exchange_template_oca
+#: model_terms:ir.ui.view,arch_db:edi_exchange_template_oca.edi_exchange_template_output_view_search
+msgid "Backend type"
+msgstr ""
+
+#. module: edi_exchange_template_oca
+#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_mixin__code
+#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_output__code
+msgid "Code"
+msgstr ""
+
+#. module: edi_exchange_template_oca
+#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_mixin__code_snippet
+#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_output__code_snippet
+msgid "Code Snippet"
+msgstr ""
+
+#. module: edi_exchange_template_oca
+#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_mixin__code_snippet_docs
+#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_output__code_snippet_docs
+msgid "Code Snippet Docs"
+msgstr ""
+
+#. module: edi_exchange_template_oca
+#: model_terms:ir.ui.view,arch_db:edi_exchange_template_oca.edi_exchange_template_output_view_form
+msgid "Code snippet"
+msgstr ""
+
+#. module: edi_exchange_template_oca
+#: model_terms:ir.ui.view,arch_db:edi_exchange_template_oca.edi_exchange_template_output_view_form
+msgid "Code snippet docs"
+msgstr ""
+
+#. module: edi_exchange_template_oca
+#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_output__create_uid
+msgid "Created by"
+msgstr ""
+
+#. module: edi_exchange_template_oca
+#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_output__create_date
+msgid "Created on"
+msgstr ""
+
+#. module: edi_exchange_template_oca
+#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_backend__display_name
+#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_mixin__display_name
+#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_output__display_name
+msgid "Display Name"
+msgstr ""
+
+#. module: edi_exchange_template_oca
+#: model:ir.model,name:edi_exchange_template_oca.model_edi_backend
+msgid "EDI Backend"
+msgstr ""
+
+#. module: edi_exchange_template_oca
+#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_mixin__backend_type_id
+#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_output__backend_type_id
+msgid "EDI Backend type"
+msgstr ""
+
+#. module: edi_exchange_template_oca
+#: model:ir.model,name:edi_exchange_template_oca.model_edi_exchange_template_mixin
+msgid "EDI Exchange Output Mixin"
+msgstr ""
+
+#. module: edi_exchange_template_oca
+#: model:ir.model,name:edi_exchange_template_oca.model_edi_exchange_template_output
+msgid "EDI Exchange Output Template"
+msgstr ""
+
+#. module: edi_exchange_template_oca
+#: model:ir.actions.act_window,name:edi_exchange_template_oca.act_open_edi_exchange_template_output_view
+#: model:ir.ui.menu,name:edi_exchange_template_oca.menu_edi_exchange_template_output
+#: model_terms:ir.ui.view,arch_db:edi_exchange_template_oca.edi_exchange_template_output_view_form
+#: model_terms:ir.ui.view,arch_db:edi_exchange_template_oca.edi_exchange_template_output_view_search
+#: model_terms:ir.ui.view,arch_db:edi_exchange_template_oca.edi_exchange_template_output_view_tree
+msgid "EDI Exchange Template Output"
+msgstr ""
+
+#. module: edi_exchange_template_oca
+#: model:ir.ui.menu,name:edi_exchange_template_oca.menu_edi_exchange_template_root
+msgid "EDI Exchange Templates"
+msgstr ""
+
+#. module: edi_exchange_template_oca
+#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_mixin__type_id
+#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_output__type_id
+msgid "EDI Exchange type"
+msgstr ""
+
+#. module: edi_exchange_template_oca
+#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_output__generator
+msgid "Generator"
+msgstr ""
+
+#. module: edi_exchange_template_oca
+#: model_terms:ir.ui.view,arch_db:edi_exchange_template_oca.edi_exchange_template_output_view_search
+msgid "Group By"
+msgstr ""
+
+#. module: edi_exchange_template_oca
+#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_backend__id
+#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_mixin__id
+#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_output__id
+msgid "ID"
+msgstr ""
+
+#. module: edi_exchange_template_oca
+#: model:ir.model.fields,help:edi_exchange_template_oca.field_edi_exchange_template_output__template_key
+msgid "ID of the view defined in xml file"
+msgstr ""
+
+#. module: edi_exchange_template_oca
+#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_backend____last_update
+#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_mixin____last_update
+#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_output____last_update
+msgid "Last Modified on"
+msgstr ""
+
+#. module: edi_exchange_template_oca
+#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_output__write_uid
+msgid "Last Updated by"
+msgstr ""
+
+#. module: edi_exchange_template_oca
+#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_output__write_date
+msgid "Last Updated on"
+msgstr ""
+
+#. module: edi_exchange_template_oca
+#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_mixin__name
+#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_output__name
+msgid "Name"
+msgstr ""
+
+#. module: edi_exchange_template_oca
+#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_output__output_type
+msgid "Output Type"
+msgstr ""
+
+#. module: edi_exchange_template_oca
+#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_output__template_arch
+msgid "QWeb arch"
+msgstr ""
+
+#. module: edi_exchange_template_oca
+#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_output__template_id
+#: model:ir.model.fields.selection,name:edi_exchange_template_oca.selection__edi_exchange_template_output__generator__qweb
+msgid "Qweb Template"
+msgstr ""
+
+#. module: edi_exchange_template_oca
+#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_output__report_id
+#: model:ir.model.fields.selection,name:edi_exchange_template_oca.selection__edi_exchange_template_output__generator__report
+msgid "Report"
+msgstr ""
+
+#. module: edi_exchange_template_oca
+#: model_terms:ir.ui.view,arch_db:edi_exchange_template_oca.edi_exchange_template_output_view_form
+msgid "Template"
+msgstr ""
+
+#. module: edi_exchange_template_oca
+#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_output__template_key
+msgid "Template key"
+msgstr ""
+
+#. module: edi_exchange_template_oca
+#: model:ir.model.fields,help:edi_exchange_template_oca.field_edi_exchange_template_output__template_arch
+msgid "This field stores the view arch."
+msgstr ""
+
+#. module: edi_exchange_template_oca
+#: model_terms:ir.ui.view,arch_db:edi_exchange_template_oca.edi_exchange_template_output_view_search
+msgid "Type"
+msgstr ""
From 3e87943357195d2ae63f9f2d0b59a0e3f6693211 Mon Sep 17 00:00:00 2001
From: OCA-git-bot
Date: Thu, 27 May 2021 13:40:07 +0000
Subject: [PATCH 26/99] [UPD] README.rst
---
edi_exchange_template_oca/README.rst | 10 +++++-----
.../static/description/index.html | 6 +++---
2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/edi_exchange_template_oca/README.rst b/edi_exchange_template_oca/README.rst
index a856a7670..ceb1afcc5 100644
--- a/edi_exchange_template_oca/README.rst
+++ b/edi_exchange_template_oca/README.rst
@@ -14,13 +14,13 @@ EDI Exchange Template
: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-lightgray.png?logo=github
- :target: https://github.com/OCA/edi/tree/13.0/edi_exchange_template
+ :target: https://github.com/OCA/edi/tree/14.0/edi_exchange_template_oca
:alt: OCA/edi
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
- :target: https://translation.odoo-community.org/projects/edi-13-0/edi-13-0-edi_exchange_template
+ :target: https://translation.odoo-community.org/projects/edi-14-0/edi-14-0-edi_exchange_template_oca
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
- :target: https://runbot.odoo-community.org/runbot/226/13.0
+ :target: https://runbot.odoo-community.org/runbot/226/14.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
@@ -48,7 +48,7 @@ Bug Tracker
Bugs are tracked on `GitHub Issues `_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
-`feedback `_.
+`feedback `_.
Do not contact contributors directly about support or help with technical issues.
@@ -86,6 +86,6 @@ Current `maintainer `__:
|maintainer-simahawk|
-This module is part of the `OCA/edi `_ project on GitHub.
+This module is part of the `OCA/edi `_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/edi_exchange_template_oca/static/description/index.html b/edi_exchange_template_oca/static/description/index.html
index 50f629253..2514094f1 100644
--- a/edi_exchange_template_oca/static/description/index.html
+++ b/edi_exchange_template_oca/static/description/index.html
@@ -367,7 +367,7 @@ EDI Exchange Template
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-

+

Provide EDI exchange templates to control input/output records contents.
Provides following models:
@@ -397,7 +397,7 @@
Bugs are tracked on GitHub Issues.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
-feedback.
+feedback.
Do not contact contributors directly about support or help with technical issues.
From 932429f89cef1927d81c1051981a46b10506d2f0 Mon Sep 17 00:00:00 2001
From: "Pedro M. Baeza"
Date: Fri, 7 Jan 2022 08:26:03 +0100
Subject: [PATCH 27/99] [IMP] edi_exchange_template_oca: Promote to beta
In use for several modules.
---
edi_exchange_template_oca/__manifest__.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/edi_exchange_template_oca/__manifest__.py b/edi_exchange_template_oca/__manifest__.py
index 02907dd74..a56a2d025 100644
--- a/edi_exchange_template_oca/__manifest__.py
+++ b/edi_exchange_template_oca/__manifest__.py
@@ -6,7 +6,7 @@
"name": "EDI Exchange Template",
"summary": """Allows definition of exchanges via templates.""",
"version": "14.0.1.0.0",
- "development_status": "Alpha",
+ "development_status": "Beta",
"license": "LGPL-3",
"author": "ACSONE,Odoo Community Association (OCA)",
"maintainers": ["simahawk"],
From 54fcad96f2cb26c32227a3b46e3bc658c704b612 Mon Sep 17 00:00:00 2001
From: OCA-git-bot
Date: Fri, 7 Jan 2022 07:26:19 +0000
Subject: [PATCH 28/99] [UPD] README.rst
---
edi_exchange_template_oca/README.rst | 9 ++-------
edi_exchange_template_oca/static/description/index.html | 8 +-------
2 files changed, 3 insertions(+), 14 deletions(-)
diff --git a/edi_exchange_template_oca/README.rst b/edi_exchange_template_oca/README.rst
index ceb1afcc5..856f94524 100644
--- a/edi_exchange_template_oca/README.rst
+++ b/edi_exchange_template_oca/README.rst
@@ -7,9 +7,9 @@ EDI Exchange Template
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-.. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png
+.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
- :alt: Alpha
+ :alt: Beta
.. |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
@@ -32,11 +32,6 @@ Provides following models:
1. EDI exchange output template, generates output using QWeb templates
2. [TODO] EDI exchange input template
-.. IMPORTANT::
- This is an alpha version, the data model and design can change at any time without warning.
- Only for development or testing purpose, do not use in production.
- `More details on development status `_
-
**Table of contents**
.. contents::
diff --git a/edi_exchange_template_oca/static/description/index.html b/edi_exchange_template_oca/static/description/index.html
index 2514094f1..5aa6e354b 100644
--- a/edi_exchange_template_oca/static/description/index.html
+++ b/edi_exchange_template_oca/static/description/index.html
@@ -367,19 +367,13 @@ EDI Exchange Template
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-

+

Provide EDI exchange templates to control input/output records contents.
Provides following models:
- EDI exchange output template, generates output using QWeb templates
- [TODO] EDI exchange input template
-
-
Important
-
This is an alpha version, the data model and design can change at any time without warning.
-Only for development or testing purpose, do not use in production.
-More details on development status
-
Table of contents
From a575cb240e8eb8b962aac669344dee310790a8ff Mon Sep 17 00:00:00 2001
From: "Pedro M. Baeza"
Date: Fri, 7 Jan 2022 11:18:53 +0100
Subject: [PATCH 29/99] edi_exchange_template_oca 14.0.1.0.1
---
edi_exchange_template_oca/__manifest__.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/edi_exchange_template_oca/__manifest__.py b/edi_exchange_template_oca/__manifest__.py
index a56a2d025..400dfea8c 100644
--- a/edi_exchange_template_oca/__manifest__.py
+++ b/edi_exchange_template_oca/__manifest__.py
@@ -5,7 +5,7 @@
{
"name": "EDI Exchange Template",
"summary": """Allows definition of exchanges via templates.""",
- "version": "14.0.1.0.0",
+ "version": "14.0.1.0.1",
"development_status": "Beta",
"license": "LGPL-3",
"author": "ACSONE,Odoo Community Association (OCA)",
From cc8b3a1488f3657389c9a627918b0e35b5ddd521 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Juan=20Ignacio=20=C3=9Abeda?=
Date: Tue, 15 Feb 2022 22:55:42 +0100
Subject: [PATCH 30/99] [MIG] edi_change_template_oca : Migration to 15.0
---
edi_exchange_template_oca/__manifest__.py | 2 +-
.../models/edi_exchange_template_output.py | 2 +-
edi_exchange_template_oca/tests/test_edi_backend_output.py | 3 ++-
.../views/edi_exchange_template_output_views.xml | 2 +-
4 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/edi_exchange_template_oca/__manifest__.py b/edi_exchange_template_oca/__manifest__.py
index 400dfea8c..0dd298a8d 100644
--- a/edi_exchange_template_oca/__manifest__.py
+++ b/edi_exchange_template_oca/__manifest__.py
@@ -5,7 +5,7 @@
{
"name": "EDI Exchange Template",
"summary": """Allows definition of exchanges via templates.""",
- "version": "14.0.1.0.1",
+ "version": "15.0.1.0.0",
"development_status": "Beta",
"license": "LGPL-3",
"author": "ACSONE,Odoo Community Association (OCA)",
diff --git a/edi_exchange_template_oca/models/edi_exchange_template_output.py b/edi_exchange_template_oca/models/edi_exchange_template_output.py
index f3707c6ff..d33a9601a 100644
--- a/edi_exchange_template_oca/models/edi_exchange_template_output.py
+++ b/edi_exchange_template_oca/models/edi_exchange_template_output.py
@@ -72,7 +72,7 @@ def exchange_generate(self, exchange_record, **kw):
try:
generator = getattr(self, method)
except AttributeError:
- raise NotImplementedError(f"`{method}` not found")
+ raise NotImplementedError(f"`{method}` not found") from AttributeError
result = generator(exchange_record, **kw)
return self._post_process_output(result)
diff --git a/edi_exchange_template_oca/tests/test_edi_backend_output.py b/edi_exchange_template_oca/tests/test_edi_backend_output.py
index fc45d2465..84f64596e 100644
--- a/edi_exchange_template_oca/tests/test_edi_backend_output.py
+++ b/edi_exchange_template_oca/tests/test_edi_backend_output.py
@@ -10,7 +10,7 @@
class TestEDIBackendOutputBase(EDIBackendCommonComponentTestCase):
@classmethod
def _setup_records(cls):
- super()._setup_records()
+ res = super()._setup_records()
cls.type_out1 = cls._create_exchange_type(
name="Template output 1",
direction="output",
@@ -120,6 +120,7 @@ def _setup_records(cls):
"type_id": cls.type_out2.id,
}
cls.record3 = cls.backend.create_record("test_type_out3", vals)
+ return res
# TODO: add more unit tests
diff --git a/edi_exchange_template_oca/views/edi_exchange_template_output_views.xml b/edi_exchange_template_oca/views/edi_exchange_template_output_views.xml
index 91e3cf79e..d9ffdfbb4 100644
--- a/edi_exchange_template_oca/views/edi_exchange_template_output_views.xml
+++ b/edi_exchange_template_oca/views/edi_exchange_template_output_views.xml
@@ -3,7 +3,7 @@
edi.exchange.template.output
-
+
From d0640512e0130d8c6ae28f13e25643d700051f7c Mon Sep 17 00:00:00 2001
From: oca-ci
Date: Wed, 23 Feb 2022 10:45:05 +0000
Subject: [PATCH 31/99] [UPD] Update edi_exchange_template_oca.pot
---
.../i18n/edi_exchange_template_oca.pot | 9 +--------
1 file changed, 1 insertion(+), 8 deletions(-)
diff --git a/edi_exchange_template_oca/i18n/edi_exchange_template_oca.pot b/edi_exchange_template_oca/i18n/edi_exchange_template_oca.pot
index 494722a79..98a6eda49 100644
--- a/edi_exchange_template_oca/i18n/edi_exchange_template_oca.pot
+++ b/edi_exchange_template_oca/i18n/edi_exchange_template_oca.pot
@@ -4,7 +4,7 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server 14.0\n"
+"Project-Id-Version: Odoo Server 15.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
@@ -64,8 +64,6 @@ msgid "Created on"
msgstr ""
#. module: edi_exchange_template_oca
-#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_backend__display_name
-#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_mixin__display_name
#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_output__display_name
msgid "Display Name"
msgstr ""
@@ -96,7 +94,6 @@ msgstr ""
#: model:ir.ui.menu,name:edi_exchange_template_oca.menu_edi_exchange_template_output
#: model_terms:ir.ui.view,arch_db:edi_exchange_template_oca.edi_exchange_template_output_view_form
#: model_terms:ir.ui.view,arch_db:edi_exchange_template_oca.edi_exchange_template_output_view_search
-#: model_terms:ir.ui.view,arch_db:edi_exchange_template_oca.edi_exchange_template_output_view_tree
msgid "EDI Exchange Template Output"
msgstr ""
@@ -122,8 +119,6 @@ msgid "Group By"
msgstr ""
#. module: edi_exchange_template_oca
-#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_backend__id
-#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_mixin__id
#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_output__id
msgid "ID"
msgstr ""
@@ -134,8 +129,6 @@ msgid "ID of the view defined in xml file"
msgstr ""
#. module: edi_exchange_template_oca
-#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_backend____last_update
-#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_mixin____last_update
#: model:ir.model.fields,field_description:edi_exchange_template_oca.field_edi_exchange_template_output____last_update
msgid "Last Modified on"
msgstr ""
From aec47c15d0ef4f15943d2ab297d74125a56f2646 Mon Sep 17 00:00:00 2001
From: OCA-git-bot
Date: Wed, 23 Feb 2022 10:47:54 +0000
Subject: [PATCH 32/99] [UPD] README.rst
---
edi_exchange_template_oca/README.rst | 10 +++++-----
.../static/description/index.html | 6 +++---
2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/edi_exchange_template_oca/README.rst b/edi_exchange_template_oca/README.rst
index 856f94524..d9878f980 100644
--- a/edi_exchange_template_oca/README.rst
+++ b/edi_exchange_template_oca/README.rst
@@ -14,13 +14,13 @@ EDI Exchange Template
: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-lightgray.png?logo=github
- :target: https://github.com/OCA/edi/tree/14.0/edi_exchange_template_oca
+ :target: https://github.com/OCA/edi/tree/15.0/edi_exchange_template_oca
:alt: OCA/edi
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
- :target: https://translation.odoo-community.org/projects/edi-14-0/edi-14-0-edi_exchange_template_oca
+ :target: https://translation.odoo-community.org/projects/edi-15-0/edi-15-0-edi_exchange_template_oca
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
- :target: https://runbot.odoo-community.org/runbot/226/14.0
+ :target: https://runbot.odoo-community.org/runbot/226/15.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
@@ -43,7 +43,7 @@ Bug Tracker
Bugs are tracked on `GitHub Issues `_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
-`feedback `_.
+`feedback `_.
Do not contact contributors directly about support or help with technical issues.
@@ -81,6 +81,6 @@ Current `maintainer `__:
|maintainer-simahawk|
-This module is part of the `OCA/edi `_ project on GitHub.
+This module is part of the `OCA/edi `_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/edi_exchange_template_oca/static/description/index.html b/edi_exchange_template_oca/static/description/index.html
index 5aa6e354b..a837c1829 100644
--- a/edi_exchange_template_oca/static/description/index.html
+++ b/edi_exchange_template_oca/static/description/index.html
@@ -367,7 +367,7 @@ EDI Exchange Template
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-

+

Provide EDI exchange templates to control input/output records contents.
Provides following models:
@@ -391,7 +391,7 @@
Bugs are tracked on GitHub Issues.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
-feedback.
+feedback.
Do not contact contributors directly about support or help with technical issues.
From 6ccb6387b87eea25b88f6cccb85458ff87070375 Mon Sep 17 00:00:00 2001
From: Enric Tobella
Date: Mon, 16 May 2022 16:33:56 +0200
Subject: [PATCH 33/99] [IMP] edi_exchange_template: Allow users to see, but
not edit
---
edi_exchange_template_oca/security/ir_model_access.xml | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/edi_exchange_template_oca/security/ir_model_access.xml b/edi_exchange_template_oca/security/ir_model_access.xml
index c611b9dbf..672ab5d80 100644
--- a/edi_exchange_template_oca/security/ir_model_access.xml
+++ b/edi_exchange_template_oca/security/ir_model_access.xml
@@ -9,4 +9,14 @@
+
+
+ edi_exchange_template_output user
+
+
+
+
+
+
+
From 04193b5b942cd6e9f7ea009b212ad7800c898b02 Mon Sep 17 00:00:00 2001
From: OCA-git-bot
Date: Mon, 16 May 2022 14:49:13 +0000
Subject: [PATCH 34/99] edi_exchange_template_oca 15.0.1.0.1
---
edi_exchange_template_oca/__manifest__.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/edi_exchange_template_oca/__manifest__.py b/edi_exchange_template_oca/__manifest__.py
index 0dd298a8d..50132b666 100644
--- a/edi_exchange_template_oca/__manifest__.py
+++ b/edi_exchange_template_oca/__manifest__.py
@@ -5,7 +5,7 @@
{
"name": "EDI Exchange Template",
"summary": """Allows definition of exchanges via templates.""",
- "version": "15.0.1.0.0",
+ "version": "15.0.1.0.1",
"development_status": "Beta",
"license": "LGPL-3",
"author": "ACSONE,Odoo Community Association (OCA)",
From f5945c1c6b0383ed876ca052b9c55a00a7911f95 Mon Sep 17 00:00:00 2001
From: OCA-git-bot
Date: Sun, 3 Sep 2023 12:44:19 +0000
Subject: [PATCH 35/99] [UPD] README.rst
---
edi_exchange_template_oca/README.rst | 15 ++++----
.../static/description/index.html | 36 ++++++++++---------
2 files changed, 28 insertions(+), 23 deletions(-)
diff --git a/edi_exchange_template_oca/README.rst b/edi_exchange_template_oca/README.rst
index d9878f980..a9995904c 100644
--- a/edi_exchange_template_oca/README.rst
+++ b/edi_exchange_template_oca/README.rst
@@ -2,10 +2,13 @@
EDI Exchange Template
=====================
-.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+..
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! source digest: sha256:77f9c8f1d2157e0270a1eadf85a1d39476fdefc8e14bc5cfe0fb47c3dadf118e
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
@@ -19,11 +22,11 @@ EDI Exchange Template
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/edi-15-0/edi-15-0-edi_exchange_template_oca
:alt: Translate me on Weblate
-.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
- :target: https://runbot.odoo-community.org/runbot/226/15.0
- :alt: Try me on Runbot
+.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
+ :target: https://runboat.odoo-community.org/builds?repo=OCA/edi&target_branch=15.0
+ :alt: Try me on Runboat
-|badge1| |badge2| |badge3| |badge4| |badge5|
+|badge1| |badge2| |badge3| |badge4| |badge5|
Provide EDI exchange templates to control input/output records contents.
@@ -42,7 +45,7 @@ Bug Tracker
Bugs are tracked on `GitHub Issues `_.
In case of trouble, please check there if your issue has already been reported.
-If you spotted it first, help us smashing it by providing a detailed and welcomed
+If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback `_.
Do not contact contributors directly about support or help with technical issues.
diff --git a/edi_exchange_template_oca/static/description/index.html b/edi_exchange_template_oca/static/description/index.html
index a837c1829..2113c7f7e 100644
--- a/edi_exchange_template_oca/static/description/index.html
+++ b/edi_exchange_template_oca/static/description/index.html
@@ -1,20 +1,20 @@
-
+
-
+
EDI Exchange Template
-
-
-
-
EDI Exchange Template
-
-
-

-
Provide EDI exchange templates to control input/output records contents.
-
Provides following models:
-
-- EDI exchange output template, generates output using QWeb templates
-- [TODO] EDI exchange input template
-
-
Table of contents
-
-
-
-
Bugs are tracked on GitHub Issues.
-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
-feedback.
-
Do not contact contributors directly about support or help with technical issues.
-
-
-
-
-
-
-
-
This module is maintained by the OCA.
-

-
OCA, or the Odoo Community Association, is a nonprofit organization whose
-mission is to support the collaborative development of Odoo features and
-promote its widespread use.
-
Current maintainer:
-

-
This module is part of the OCA/edi-framework project on GitHub.
-
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
-
-
-
-
+
+
+
+ EDI Exchange Template
+
+
+
+
+
EDI Exchange Template
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Provide EDI exchange templates to control input/output records contents.
+
Provides following models:
+
+ - EDI exchange output template, generates output using QWeb templates
+ - [TODO] EDI exchange input template
+
+
+ Table of contents
+
+
+
+
+
Bugs are tracked on
+ GitHub Issues.
+ 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
+
+ feedback.
+
+
Do not contact contributors directly about support or help with technical issues.
+
+
+
+
+
+
+
+
This module is maintained by the OCA.
+
+
+
+
OCA, or the Odoo Community Association, is a nonprofit organization whose
+ mission is to support the collaborative development of Odoo features and
+ promote its widespread use.
+
+
Current
+ maintainer:
+
+
+
+
+
+
+
This module is part of the
+
+ OCA/edi-framework
+
+ project on GitHub.
+
+
You are welcome to contribute. To learn how please visit
+ https://odoo-community.org/page/Contribute.
+
+
+
+
+
diff --git a/edi_exchange_template_oca/tests/test_edi_backend_output.py b/edi_exchange_template_oca/tests/test_edi_backend_output.py
index 9e6c75b0f..013a51784 100644
--- a/edi_exchange_template_oca/tests/test_edi_backend_output.py
+++ b/edi_exchange_template_oca/tests/test_edi_backend_output.py
@@ -138,7 +138,7 @@ def test_get_template(self):
def test_generate_file(self):
output = self.backend.exchange_generate(self.record1)
- expected = "{0.ref} - {0.name}".format(self.partner)
+ expected = f"{self.partner.ref} - {self.partner.name}"
self.assertEqual(output, "Exchange data generated")
file_content = self.record1._get_file_content()
self.assertEqual(file_content.strip(), expected)
From a163d325cb9065a35fc675c6fd44e6e0bbf3cd0b Mon Sep 17 00:00:00 2001
From: John Herholz
Date: Fri, 28 Jun 2024 19:41:17 +0200
Subject: [PATCH 61/99] [MIG] edi_exchange_template_oca: Migration to 17.0
---
.../static/description/index.html | 1024 +++++++----------
.../tests/test_edi_backend_output.py | 37 +-
.../edi_exchange_template_output_views.xml | 19 +-
3 files changed, 469 insertions(+), 611 deletions(-)
diff --git a/edi_exchange_template_oca/static/description/index.html b/edi_exchange_template_oca/static/description/index.html
index b950a29df..c0b6328d2 100644
--- a/edi_exchange_template_oca/static/description/index.html
+++ b/edi_exchange_template_oca/static/description/index.html
@@ -1,596 +1,432 @@
+
-
-
-
- EDI Exchange Template
-
-
-
-
-
EDI Exchange Template
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Provide EDI exchange templates to control input/output records contents.
-
Provides following models:
-
- - EDI exchange output template, generates output using QWeb templates
- - [TODO] EDI exchange input template
-
-
- Table of contents
-
-
-
-
-
Bugs are tracked on
- GitHub Issues.
- 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
-
- feedback.
-
-
Do not contact contributors directly about support or help with technical issues.
-
-
-
-
-
-
-
-
This module is maintained by the OCA.
-
-
-
-
OCA, or the Odoo Community Association, is a nonprofit organization whose
- mission is to support the collaborative development of Odoo features and
- promote its widespread use.
-
-
Current
- maintainer:
-
-
-
-
-
-
-
This module is part of the
-
- OCA/edi-framework
-
- project on GitHub.
-
-
You are welcome to contribute. To learn how please visit
- https://odoo-community.org/page/Contribute.
-
-
-
-
-
+
+
+
+EDI Exchange Template
+
+
+
+
+
EDI Exchange Template
+
+
+

+
Provide EDI exchange templates to control input/output records contents.
+
Provides following models:
+
+- EDI exchange output template, generates output using QWeb templates
+- [TODO] EDI exchange input template
+
+
Table of contents
+
+
+
+
Bugs are tracked on GitHub Issues.
+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
+feedback.
+
Do not contact contributors directly about support or help with technical issues.
+
+
+
+
+
+
+
+
This module is maintained by the OCA.
+
+
+
+
OCA, or the Odoo Community Association, is a nonprofit organization whose
+mission is to support the collaborative development of Odoo features and
+promote its widespread use.
+
Current maintainer:
+

+
This module is part of the OCA/edi-framework project on GitHub.
+
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
+
+
+
+
diff --git a/edi_exchange_template_oca/tests/test_edi_backend_output.py b/edi_exchange_template_oca/tests/test_edi_backend_output.py
index 013a51784..a1acee2b4 100644
--- a/edi_exchange_template_oca/tests/test_edi_backend_output.py
+++ b/edi_exchange_template_oca/tests/test_edi_backend_output.py
@@ -1,6 +1,8 @@
# Copyright 2020 ACSONE SA/NV ()
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
+import datetime
+from freezegun import freeze_time
from lxml import etree
from odoo.addons.edi_oca.tests.common import EDIBackendCommonComponentTestCase
@@ -35,6 +37,7 @@ def _setup_records(cls):
"name": "Out 1",
"backend_type_id": cls.backend.backend_type_id.id,
"type_id": cls.type_out1.id,
+ "generator": "qweb",
"template_id": qweb_tmpl.id,
"output_type": "txt",
}
@@ -75,6 +78,7 @@ def _setup_records(cls):
"name": "Out 2",
"backend_type_id": cls.backend.backend_type_id.id,
"type_id": cls.type_out2.id,
+ "generator": "qweb",
"template_id": qweb_tmpl.id,
"output_type": "xml",
"code_snippet": """
@@ -137,12 +141,11 @@ def test_get_template(self):
)
def test_generate_file(self):
- output = self.backend.exchange_generate(self.record1)
+ self.backend.exchange_generate(self.record1)
expected = f"{self.partner.ref} - {self.partner.name}"
- self.assertEqual(output, "Exchange data generated")
file_content = self.record1._get_file_content()
self.assertEqual(file_content.strip(), expected)
- output = self.backend.exchange_generate(self.record2)
+ self.backend.exchange_generate(self.record2)
file_content = self.record2._get_file_content()
doc = etree.fromstring(file_content)
self.assertEqual(doc.tag, "Record")
@@ -164,8 +167,7 @@ def test_prettify(self):
self.assertEqual(output, b"\n 1\n\n")
def test_generate_file_report(self):
- output = self.backend.exchange_generate(self.record3)
- self.assertEqual(output, "Exchange data generated")
+ self.backend.exchange_generate(self.record3)
file_content = self.record3._get_file_content()
self.assertEqual(
self.report._render(self.report, [self.record3.res_id])[0]
@@ -173,3 +175,28 @@ def test_generate_file_report(self):
.decode("UTF-8"),
file_content.strip(),
)
+
+ def test_date_to_string(self):
+ dt = datetime.date(2024, 9, 10)
+ no_dt = ""
+ converted_dt_utc = self.tmpl_out1._date_to_string(dt)
+ converted_dt_non_utc = self.tmpl_out1._date_to_string(dt, False)
+ converted_no_dt = self.tmpl_out1._date_to_string(no_dt)
+ self.assertEqual(converted_dt_utc, "2024-09-10")
+ self.assertEqual(converted_dt_non_utc, "2024-09-10")
+ self.assertEqual(converted_no_dt, "")
+
+ def test_datetime_to_string(self):
+ dt = datetime.datetime(2024, 9, 10, 11, 5, 49)
+ no_dt = ""
+ converted_dt_utc = self.tmpl_out1._datetime_to_string(dt)
+ converted_dt_non_utc = self.tmpl_out1._datetime_to_string(dt, False)
+ converted_no_dt = self.tmpl_out1._datetime_to_string(no_dt)
+ self.assertEqual(converted_dt_utc, "2024-09-10 00:00:00")
+ self.assertEqual(converted_dt_non_utc, "2024-09-10 11:05:49")
+ self.assertEqual(converted_no_dt, "")
+
+ @freeze_time("2024-07-27 10:00:00")
+ def test_utc_now(self):
+ utc_now_output = self.tmpl_out1._utc_now()
+ self.assertEqual(utc_now_output, "2024-07-27T10:00:00")
diff --git a/edi_exchange_template_oca/views/edi_exchange_template_output_views.xml b/edi_exchange_template_oca/views/edi_exchange_template_output_views.xml
index 1a3ce93bd..3a9f771e2 100644
--- a/edi_exchange_template_oca/views/edi_exchange_template_output_views.xml
+++ b/edi_exchange_template_oca/views/edi_exchange_template_output_views.xml
@@ -15,7 +15,7 @@
edi.exchange.template.output
-