From 6f8a99bba07e2c9a371db44dc63a1312c1f1be2b Mon Sep 17 00:00:00 2001 From: Simone Orsi Date: Wed, 15 Sep 2021 16:43:36 +0200 Subject: [PATCH 01/37] Add edi_endpoint_oca --- edi_endpoint_oca/README.rst | 83 ++++ edi_endpoint_oca/__init__.py | 2 + edi_endpoint_oca/__manifest__.py | 23 + edi_endpoint_oca/controllers/__init__.py | 1 + edi_endpoint_oca/controllers/main.py | 13 + edi_endpoint_oca/demo/edi_backend_demo.xml | 30 ++ edi_endpoint_oca/i18n/edi_endpoint_oca.pot | 215 +++++++++ edi_endpoint_oca/models/__init__.py | 3 + edi_endpoint_oca/models/edi_backend.py | 36 ++ edi_endpoint_oca/models/edi_backend_type.py | 17 + edi_endpoint_oca/models/edi_endpoint.py | 78 ++++ edi_endpoint_oca/readme/CONFIGURE.rst | 1 + edi_endpoint_oca/readme/CONTRIBUTORS.rst | 1 + edi_endpoint_oca/readme/DESCRIPTION.rst | 1 + edi_endpoint_oca/security/ir.model.access.csv | 2 + edi_endpoint_oca/static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 430 ++++++++++++++++++ edi_endpoint_oca/tests/__init__.py | 2 + edi_endpoint_oca/tests/test_edi_endpoint.py | 29 ++ .../tests/test_edi_endpoint_controller.py | 23 + edi_endpoint_oca/views/edi_backend_views.xml | 21 + edi_endpoint_oca/views/edi_endpoint_views.xml | 69 +++ 22 files changed, 1080 insertions(+) create mode 100644 edi_endpoint_oca/README.rst create mode 100644 edi_endpoint_oca/__init__.py create mode 100644 edi_endpoint_oca/__manifest__.py create mode 100644 edi_endpoint_oca/controllers/__init__.py create mode 100644 edi_endpoint_oca/controllers/main.py create mode 100644 edi_endpoint_oca/demo/edi_backend_demo.xml create mode 100644 edi_endpoint_oca/i18n/edi_endpoint_oca.pot create mode 100644 edi_endpoint_oca/models/__init__.py create mode 100644 edi_endpoint_oca/models/edi_backend.py create mode 100644 edi_endpoint_oca/models/edi_backend_type.py create mode 100644 edi_endpoint_oca/models/edi_endpoint.py create mode 100644 edi_endpoint_oca/readme/CONFIGURE.rst create mode 100644 edi_endpoint_oca/readme/CONTRIBUTORS.rst create mode 100644 edi_endpoint_oca/readme/DESCRIPTION.rst create mode 100644 edi_endpoint_oca/security/ir.model.access.csv create mode 100644 edi_endpoint_oca/static/description/icon.png create mode 100644 edi_endpoint_oca/static/description/index.html create mode 100644 edi_endpoint_oca/tests/__init__.py create mode 100644 edi_endpoint_oca/tests/test_edi_endpoint.py create mode 100644 edi_endpoint_oca/tests/test_edi_endpoint_controller.py create mode 100644 edi_endpoint_oca/views/edi_backend_views.xml create mode 100644 edi_endpoint_oca/views/edi_endpoint_views.xml diff --git a/edi_endpoint_oca/README.rst b/edi_endpoint_oca/README.rst new file mode 100644 index 000000000..d236953f2 --- /dev/null +++ b/edi_endpoint_oca/README.rst @@ -0,0 +1,83 @@ +============ +EDI endpoint +============ + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! 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-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/14.0/edi_endpoint_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_endpoint_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 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Base module allowing configuration of custom endpoints for EDI framework. + +.. 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: + +Configuration +============= + +Go to "EDI -> Config -> Endpoints". + +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 +~~~~~~~ + +* Camptocamp + +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_endpoint_oca/__init__.py b/edi_endpoint_oca/__init__.py new file mode 100644 index 000000000..91c5580fe --- /dev/null +++ b/edi_endpoint_oca/__init__.py @@ -0,0 +1,2 @@ +from . import controllers +from . import models diff --git a/edi_endpoint_oca/__manifest__.py b/edi_endpoint_oca/__manifest__.py new file mode 100644 index 000000000..77cd2aeae --- /dev/null +++ b/edi_endpoint_oca/__manifest__.py @@ -0,0 +1,23 @@ +# Copyright 2021 Camptcamp SA +# @author: Simone Orsi +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +{ + "name": "EDI endpoint", + "summary": """ + Base module allowing configuration of custom endpoints for EDI framework. + """, + "version": "14.0.1.0.0", + "development_status": "Alpha", + "license": "LGPL-3", + "website": "https://github.com/OCA/edi", + "author": "Camptocamp,Odoo Community Association (OCA)", + "depends": ["base_edi", "edi_oca", "endpoint"], + "data": [ + "demo/edi_backend_demo.xml", + "security/ir.model.access.csv", + "views/edi_backend_views.xml", + "views/edi_endpoint_views.xml", + ], + "demo": ["demo/edi_backend_demo.xml"], +} diff --git a/edi_endpoint_oca/controllers/__init__.py b/edi_endpoint_oca/controllers/__init__.py new file mode 100644 index 000000000..12a7e529b --- /dev/null +++ b/edi_endpoint_oca/controllers/__init__.py @@ -0,0 +1 @@ +from . import main diff --git a/edi_endpoint_oca/controllers/main.py b/edi_endpoint_oca/controllers/main.py new file mode 100644 index 000000000..ff966b03e --- /dev/null +++ b/edi_endpoint_oca/controllers/main.py @@ -0,0 +1,13 @@ +# Copyright 2021 Camptcamp SA +# @author: Simone Orsi +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + + +from odoo import http + +from odoo.addons.endpoint.controllers.main import EndpointControllerMixin + + +class EDIEndpointController(http.Controller, EndpointControllerMixin): + def _find_endpoint(self, env, endpoint_route): + return env["edi.endpoint"]._find_endpoint(endpoint_route) diff --git a/edi_endpoint_oca/demo/edi_backend_demo.xml b/edi_endpoint_oca/demo/edi_backend_demo.xml new file mode 100644 index 000000000..871d0d307 --- /dev/null +++ b/edi_endpoint_oca/demo/edi_backend_demo.xml @@ -0,0 +1,30 @@ + + + + EDI backend with endpoints DEMO + + + + + EDI exchange demo + demo_endpoint + + input + + + + + + + EDI Demo Endpoint 1 + + /demo/try + GET + code + +record = endpoint.create_exchange_record() +result = {"response": Response("Created record: %s" % record.identifier)} + + + + diff --git a/edi_endpoint_oca/i18n/edi_endpoint_oca.pot b/edi_endpoint_oca/i18n/edi_endpoint_oca.pot new file mode 100644 index 000000000..c804e958d --- /dev/null +++ b/edi_endpoint_oca/i18n/edi_endpoint_oca.pot @@ -0,0 +1,215 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * edi_endpoint_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_endpoint_oca +#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_endpoint__active +msgid "Active" +msgstr "" + +#. module: edi_endpoint_oca +#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_endpoint__auth_api_key_group_ids +msgid "Allowed API key groups" +msgstr "" + +#. module: edi_endpoint_oca +#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_endpoint__auth_type +msgid "Auth Type" +msgstr "" + +#. module: edi_endpoint_oca +#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_endpoint__backend_id +msgid "Backend" +msgstr "" + +#. module: edi_endpoint_oca +#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_endpoint__backend_type_id +msgid "Backend Type" +msgstr "" + +#. module: edi_endpoint_oca +#: code:addons/edi_endpoint_oca/models/edi_endpoint.py:0 +#, python-format +msgid "Backend and exchange type are mandatory" +msgstr "" + +#. module: edi_endpoint_oca +#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_endpoint__code_snippet +msgid "Code Snippet" +msgstr "" + +#. module: edi_endpoint_oca +#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_endpoint__code_snippet_docs +msgid "Code Snippet Docs" +msgstr "" + +#. module: edi_endpoint_oca +#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_endpoint__create_uid +msgid "Created by" +msgstr "" + +#. module: edi_endpoint_oca +#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_endpoint__create_date +msgid "Created on" +msgstr "" + +#. module: edi_endpoint_oca +#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_endpoint__csrf +msgid "Csrf" +msgstr "" + +#. module: edi_endpoint_oca +#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_backend__display_name +#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_backend_type__display_name +#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_endpoint__display_name +msgid "Display Name" +msgstr "" + +#. module: edi_endpoint_oca +#: model_terms:ir.ui.view,arch_db:edi_endpoint_oca.edi_endpoint_form_view +msgid "EDI" +msgstr "" + +#. module: edi_endpoint_oca +#: model:ir.model,name:edi_endpoint_oca.model_edi_backend +msgid "EDI Backend" +msgstr "" + +#. module: edi_endpoint_oca +#: model:ir.model,name:edi_endpoint_oca.model_edi_backend_type +msgid "EDI Backend Type" +msgstr "" + +#. module: edi_endpoint_oca +#: model:ir.model,name:edi_endpoint_oca.model_edi_endpoint +msgid "EDI Endpoint" +msgstr "" + +#. module: edi_endpoint_oca +#: model:ir.actions.act_window,name:edi_endpoint_oca.edi_endpoint_act_window +#: model:ir.ui.menu,name:edi_endpoint_oca.edi_endpoint_menu +msgid "EDI Endpoints" +msgstr "" + +#. module: edi_endpoint_oca +#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_endpoint__endpoint_hash +msgid "Endpoint Hash" +msgstr "" + +#. module: edi_endpoint_oca +#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_backend__endpoint_ids +#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_backend_type__endpoint_ids +#: model_terms:ir.ui.view,arch_db:edi_endpoint_oca.edi_backend_view_form +msgid "Endpoints" +msgstr "" + +#. module: edi_endpoint_oca +#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_backend__endpoints_count +msgid "Endpoints Count" +msgstr "" + +#. module: edi_endpoint_oca +#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_endpoint__exchange_type_id +msgid "Exchange Type" +msgstr "" + +#. module: edi_endpoint_oca +#: code:addons/edi_endpoint_oca/models/edi_endpoint.py:0 +#, python-format +msgid "Exchange type not compatible with selected backend type." +msgstr "" + +#. module: edi_endpoint_oca +#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_endpoint__exec_as_user_id +msgid "Exec As User" +msgstr "" + +#. module: edi_endpoint_oca +#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_endpoint__exec_mode +msgid "Exec Mode" +msgstr "" + +#. module: edi_endpoint_oca +#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_backend__id +#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_backend_type__id +#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_endpoint__id +msgid "ID" +msgstr "" + +#. module: edi_endpoint_oca +#: model:ir.model.fields,help:edi_endpoint_oca.field_edi_endpoint__endpoint_hash +msgid "Identify the route with its main params" +msgstr "" + +#. module: edi_endpoint_oca +#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_backend____last_update +#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_backend_type____last_update +#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_endpoint____last_update +msgid "Last Modified on" +msgstr "" + +#. module: edi_endpoint_oca +#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_endpoint__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: edi_endpoint_oca +#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_endpoint__write_date +msgid "Last Updated on" +msgstr "" + +#. module: edi_endpoint_oca +#: model_terms:ir.ui.view,arch_db:edi_endpoint_oca.edi_backend_view_form +msgid "Manage endpoints" +msgstr "" + +#. module: edi_endpoint_oca +#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_endpoint__name +msgid "Name" +msgstr "" + +#. module: edi_endpoint_oca +#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_endpoint__request_content_type +msgid "Request Content Type" +msgstr "" + +#. module: edi_endpoint_oca +#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_endpoint__request_method +msgid "Request Method" +msgstr "" + +#. module: edi_endpoint_oca +#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_endpoint__route +msgid "Route" +msgstr "" + +#. module: edi_endpoint_oca +#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_endpoint__route_group +msgid "Route Group" +msgstr "" + +#. module: edi_endpoint_oca +#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_endpoint__route_type +msgid "Route Type" +msgstr "" + +#. module: edi_endpoint_oca +#: model:ir.model.fields,help:edi_endpoint_oca.field_edi_endpoint__route_group +msgid "Use this to classify routes together" +msgstr "" + +#. module: edi_endpoint_oca +#: model_terms:ir.ui.view,arch_db:edi_endpoint_oca.edi_backend_view_form +msgid "endpoints configured" +msgstr "" diff --git a/edi_endpoint_oca/models/__init__.py b/edi_endpoint_oca/models/__init__.py new file mode 100644 index 000000000..ae81989d9 --- /dev/null +++ b/edi_endpoint_oca/models/__init__.py @@ -0,0 +1,3 @@ +from . import edi_backend +from . import edi_backend_type +from . import edi_endpoint diff --git a/edi_endpoint_oca/models/edi_backend.py b/edi_endpoint_oca/models/edi_backend.py new file mode 100644 index 000000000..89e0bf704 --- /dev/null +++ b/edi_endpoint_oca/models/edi_backend.py @@ -0,0 +1,36 @@ +# Copyright 2021 Camptcamp SA +# @author: Simone Orsi +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo import api, fields, models + + +class EDIBackend(models.Model): + + _inherit = "edi.backend" + + endpoint_ids = fields.One2many( + string="Endpoints", + comodel_name="edi.endpoint", + inverse_name="backend_id", + ) + endpoints_count = fields.Integer(compute="_compute_endpoints_count") + + @api.depends("endpoint_ids") + def _compute_endpoints_count(self): + for record in self: + record.endpoints_count = len(record.endpoint_ids) + + def action_manage_endpoints(self): + action = self.env.ref("edi_endpoint_oca.edi_endpoint_act_window").read()[0] + action["domain"] = [ + ("backend_type_id", "=", self.backend_type_id), + "|", + ("backend_id", "=", False), + ("backend_id", "=", self.id), + ] + action["context"] = { + "default_backend_id": self.id, + "default_backend_type_id": self.backend_type_id.id, + } + return action diff --git a/edi_endpoint_oca/models/edi_backend_type.py b/edi_endpoint_oca/models/edi_backend_type.py new file mode 100644 index 000000000..178c9d4c2 --- /dev/null +++ b/edi_endpoint_oca/models/edi_backend_type.py @@ -0,0 +1,17 @@ +# Copyright 2021 Camptcamp SA +# @author: Simone Orsi +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo import fields, models + + +# TODO add view +class EDIBackendType(models.Model): + + _inherit = "edi.backend.type" + + endpoint_ids = fields.One2many( + string="Endpoints", + comodel_name="edi.endpoint", + inverse_name="backend_type_id", + ) diff --git a/edi_endpoint_oca/models/edi_endpoint.py b/edi_endpoint_oca/models/edi_endpoint.py new file mode 100644 index 000000000..03c74ea9d --- /dev/null +++ b/edi_endpoint_oca/models/edi_endpoint.py @@ -0,0 +1,78 @@ +# Copyright 2021 Camptcamp SA +# @author: Simone Orsi +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from functools import partial + +import werkzeug + +from odoo import _, api, exceptions, fields, models + +from ..controllers.main import EDIEndpointController + + +class EDIEndpoint(models.Model): + """EDI endpoint. + + Manage endpoints used within EDI framework. + """ + + _name = "edi.endpoint" + _inherit = "endpoint.mixin" + _description = "EDI Endpoint" + + _endpoint_route_prefix = "/edi" + + backend_type_id = fields.Many2one( + comodel_name="edi.backend.type", + required=True, + ) + # Leave these as not required to allow pre-configuration of endpoints by backend type + backend_id = fields.Many2one( + comodel_name="edi.backend", domain="[('backend_type_id','=', backend_type_id)]" + ) + exchange_type_id = fields.Many2one( + comodel_name="edi.exchange.type", + domain="[('backend_type_id','=', backend_type_id)]", + ) + + # TODO: add unit tests + + def create_exchange_record(self, file_content=None, **vals): + """Create an EDI exchange record from current endpoint. + + Just a shortcut. + """ + self._check_endpoint_ready() + rec = self.backend_id.create_record(self.exchange_type_id.code, vals) + if file_content: + rec._set_file_content(file_content) + return rec + + def _check_endpoint_ready(self, request=False): + if not self.backend_id or not self.exchange_type_id: + msg = _("Backend and exchange type are mandatory") + if request: + self._logger.error(msg) + raise werkzeug.exceptions.BadRequest("Endpoint mis-configured") + else: + raise exceptions.UserError(msg) + + @api.constrains("exchange_type_id", "backend_type_id") + def _check_backend_type(self): + for rec in self: + if ( + rec.backend_type_id + and rec.exchange_type_id + and not rec.backend_type_id == rec.exchange_type_id.backend_type_id + ): + raise exceptions.UserError( + _("Exchange type not compatible with selected backend type.") + ) + + def _handle_request(self, request): + self._check_endpoint_ready(request=True) + return super()._handle_request(request) + + def _default_endpoint_handler(self): + return partial(EDIEndpointController().auto_endpoint, self.route) diff --git a/edi_endpoint_oca/readme/CONFIGURE.rst b/edi_endpoint_oca/readme/CONFIGURE.rst new file mode 100644 index 000000000..dc2d05dbb --- /dev/null +++ b/edi_endpoint_oca/readme/CONFIGURE.rst @@ -0,0 +1 @@ +Go to "EDI -> Config -> Endpoints". diff --git a/edi_endpoint_oca/readme/CONTRIBUTORS.rst b/edi_endpoint_oca/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..f1c71bce1 --- /dev/null +++ b/edi_endpoint_oca/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Simone Orsi diff --git a/edi_endpoint_oca/readme/DESCRIPTION.rst b/edi_endpoint_oca/readme/DESCRIPTION.rst new file mode 100644 index 000000000..e7951c873 --- /dev/null +++ b/edi_endpoint_oca/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +Base module allowing configuration of custom endpoints for EDI framework. diff --git a/edi_endpoint_oca/security/ir.model.access.csv b/edi_endpoint_oca/security/ir.model.access.csv new file mode 100644 index 000000000..9ba995456 --- /dev/null +++ b/edi_endpoint_oca/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_edi_endpoint_edit,edi_endpoint edit,model_edi_endpoint,base_edi.group_edi_manager,1,1,1,1 diff --git a/edi_endpoint_oca/static/description/icon.png b/edi_endpoint_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_endpoint_oca/static/description/index.html b/edi_endpoint_oca/static/description/index.html new file mode 100644 index 000000000..3fb667e0c --- /dev/null +++ b/edi_endpoint_oca/static/description/index.html @@ -0,0 +1,430 @@ + + + + + + +EDI endpoint + + + +
+

EDI endpoint

+ + +

Alpha License: LGPL-3 OCA/edi Translate me on Weblate Try me on Runbot

+

Base module allowing configuration of custom endpoints for EDI framework.

+
+

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

+ +
+

Configuration

+

Go to “EDI -> Config -> Endpoints”.

+
+
+

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

+
    +
  • Camptocamp
  • +
+
+ +
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

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_endpoint_oca/tests/__init__.py b/edi_endpoint_oca/tests/__init__.py new file mode 100644 index 000000000..e93f5885e --- /dev/null +++ b/edi_endpoint_oca/tests/__init__.py @@ -0,0 +1,2 @@ +from . import test_edi_endpoint +from . import test_edi_endpoint_controller diff --git a/edi_endpoint_oca/tests/test_edi_endpoint.py b/edi_endpoint_oca/tests/test_edi_endpoint.py new file mode 100644 index 000000000..188e67957 --- /dev/null +++ b/edi_endpoint_oca/tests/test_edi_endpoint.py @@ -0,0 +1,29 @@ +# Copyright 2021 Camptcamp SA +# @author: Simone Orsi +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + + +from odoo.addons.endpoint.tests.common import CommonEndpoint + + +class TestEndpoint(CommonEndpoint): + @classmethod + def _setup_records(cls): + super()._setup_records() + cls.endpoint = cls.env.ref("edi_endpoint_oca.edi_endpoint_demo_1") + + def test_endpoint_find(self): + self.assertEqual( + self.env["edi.endpoint"]._find_endpoint("/edi/demo/try"), self.endpoint + ) + + def test_exchange_record(self): + self.endpoint.create_exchange_record() + + def test_route(self): + rec = self.endpoint.copy( + { + "route": "/noprefix", + } + ) + self.assertEqual(rec.route, "/edi/noprefix") diff --git a/edi_endpoint_oca/tests/test_edi_endpoint_controller.py b/edi_endpoint_oca/tests/test_edi_endpoint_controller.py new file mode 100644 index 000000000..88314e681 --- /dev/null +++ b/edi_endpoint_oca/tests/test_edi_endpoint_controller.py @@ -0,0 +1,23 @@ +# Copyright 2021 Camptcamp SA +# @author: Simone Orsi +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +import os +import unittest + +from odoo.tests.common import HttpCase + + +@unittest.skipIf(os.getenv("SKIP_HTTP_CASE"), "EDIEndpointHttpCase skipped") +class EDIEndpointHttpCase(HttpCase): + def setUp(self): + super().setUp() + + def test_call1(self): + response = self.url_open("/edi/demo/try") + self.assertEqual(response.status_code, 401) + # Let's login now + self.authenticate("admin", "admin") + response = self.url_open("/edi/demo/try") + self.assertEqual(response.status_code, 200) + self.assertIn("Created record:", response.content.decode()) diff --git a/edi_endpoint_oca/views/edi_backend_views.xml b/edi_endpoint_oca/views/edi_backend_views.xml new file mode 100644 index 000000000..666cc4b08 --- /dev/null +++ b/edi_endpoint_oca/views/edi_backend_views.xml @@ -0,0 +1,21 @@ + + + + edi.backend + + + + +
+ endpoints configured +
+ + +
diff --git a/edi_endpoint_oca/views/edi_exchange_record_views.xml b/edi_endpoint_oca/views/edi_exchange_record_views.xml new file mode 100644 index 000000000..18535545b --- /dev/null +++ b/edi_endpoint_oca/views/edi_exchange_record_views.xml @@ -0,0 +1,33 @@ + + + + edi.exchange.record + + + + + + + + + + edi.exchange.record + + + + + + + + + + edi.exchange.record + + + + + + + + + From 338aefe1aa9dfdfc5fadce34a2d6e6edb3767e1e Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Thu, 1 Jun 2023 10:22:31 +0000 Subject: [PATCH 20/37] edi_endpoint_oca 14.0.1.5.0 --- edi_endpoint_oca/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/edi_endpoint_oca/__manifest__.py b/edi_endpoint_oca/__manifest__.py index c9599a239..da27d4106 100644 --- a/edi_endpoint_oca/__manifest__.py +++ b/edi_endpoint_oca/__manifest__.py @@ -7,7 +7,7 @@ "summary": """ Base module allowing configuration of custom endpoints for EDI framework. """, - "version": "14.0.1.4.0", + "version": "14.0.1.5.0", "development_status": "Beta", "license": "LGPL-3", "website": "https://github.com/OCA/edi", From 4fbe6fe2d3d37758a09b1722c64a587a93e67788 Mon Sep 17 00:00:00 2001 From: Jordi Ballester Alomar Date: Fri, 9 Jun 2023 14:48:27 +0200 Subject: [PATCH 21/37] edi_endpoint_oca: Migration to 16.0 Moved from OCA/edi repository --- edi_endpoint_oca/__manifest__.py | 4 ++-- .../migrations/14.0.1.4.0/post-migrate.py | 18 ------------------ .../tests/test_edi_endpoint_controller.py | 4 ++-- 3 files changed, 4 insertions(+), 22 deletions(-) delete mode 100644 edi_endpoint_oca/migrations/14.0.1.4.0/post-migrate.py diff --git a/edi_endpoint_oca/__manifest__.py b/edi_endpoint_oca/__manifest__.py index da27d4106..8e59fcdce 100644 --- a/edi_endpoint_oca/__manifest__.py +++ b/edi_endpoint_oca/__manifest__.py @@ -7,10 +7,10 @@ "summary": """ Base module allowing configuration of custom endpoints for EDI framework. """, - "version": "14.0.1.5.0", + "version": "16.0.1.0.0", "development_status": "Beta", "license": "LGPL-3", - "website": "https://github.com/OCA/edi", + "website": "https://github.com/OCA/edi-framework", "author": "Camptocamp,Odoo Community Association (OCA)", "depends": ["base_edi", "edi_oca", "endpoint"], "data": [ diff --git a/edi_endpoint_oca/migrations/14.0.1.4.0/post-migrate.py b/edi_endpoint_oca/migrations/14.0.1.4.0/post-migrate.py deleted file mode 100644 index 113dd9fc9..000000000 --- a/edi_endpoint_oca/migrations/14.0.1.4.0/post-migrate.py +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright 2022 Camptocamp SA (http://www.camptocamp.com) -# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). - -import logging - -from odoo import SUPERUSER_ID, api - -_logger = logging.getLogger(__name__) - - -def migrate(cr, version): - if not version: - return - - env = api.Environment(cr, SUPERUSER_ID, {}) - domain = [("registry_sync", "=", False)] - env["edi.endpoint"].search(domain).write({"registry_sync": True}) - _logger.info("Activate sync for existing EDI endpoints") diff --git a/edi_endpoint_oca/tests/test_edi_endpoint_controller.py b/edi_endpoint_oca/tests/test_edi_endpoint_controller.py index 5bdfa943f..c71a39d9e 100644 --- a/edi_endpoint_oca/tests/test_edi_endpoint_controller.py +++ b/edi_endpoint_oca/tests/test_edi_endpoint_controller.py @@ -5,11 +5,11 @@ import os import unittest -from odoo.tests.common import HttpSavepointCase +from odoo.tests.common import HttpCase @unittest.skipIf(os.getenv("SKIP_HTTP_CASE"), "EDIEndpointHttpCase skipped") -class EDIEndpointHttpCase(HttpSavepointCase): +class EDIEndpointHttpCase(HttpCase): @classmethod def setUpClass(cls): super().setUpClass() From a2b9ebd4dd3459f2f852a68ef9af4b02530efe53 Mon Sep 17 00:00:00 2001 From: Simone Orsi Date: Mon, 18 Dec 2023 10:13:27 +0100 Subject: [PATCH 22/37] edi_endpoint: make pre-commit happy --- edi_endpoint_oca/README.rst | 29 +++++++------ edi_endpoint_oca/i18n/edi_endpoint_oca.pot | 17 ++------ .../static/description/index.html | 43 ++++++++++--------- edi_endpoint_oca/tests/test_edi_endpoint.py | 2 +- 4 files changed, 43 insertions(+), 48 deletions(-) diff --git a/edi_endpoint_oca/README.rst b/edi_endpoint_oca/README.rst index b19c74827..860e163cc 100644 --- a/edi_endpoint_oca/README.rst +++ b/edi_endpoint_oca/README.rst @@ -2,10 +2,13 @@ EDI endpoint ============ -.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:358ca4c31dd9912d6c53e9b3060f60785713c519fb4b97267c1a3dc3e426f6de + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status @@ -13,17 +16,17 @@ EDI endpoint .. |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/14.0/edi_endpoint_oca - :alt: OCA/edi +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fedi--framework-lightgray.png?logo=github + :target: https://github.com/OCA/edi-framework/tree/16.0/edi_endpoint_oca + :alt: OCA/edi-framework .. |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_endpoint_oca + :target: https://translation.odoo-community.org/projects/edi-framework-16-0/edi-framework-16-0-edi_endpoint_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 - :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-framework&target_branch=16.0 + :alt: Try me on Runboat -|badge1| |badge2| |badge3| |badge4| |badge5| +|badge1| |badge2| |badge3| |badge4| |badge5| Base module allowing configuration of custom endpoints for EDI framework. @@ -40,10 +43,10 @@ Go to "EDI -> Config -> Endpoints". Bug Tracker =========== -Bugs are tracked on `GitHub Issues `_. +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 `_. +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. @@ -73,6 +76,6 @@ 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. +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_endpoint_oca/i18n/edi_endpoint_oca.pot b/edi_endpoint_oca/i18n/edi_endpoint_oca.pot index 814c56ebf..6dc3ca91d 100644 --- a/edi_endpoint_oca/i18n/edi_endpoint_oca.pot +++ b/edi_endpoint_oca/i18n/edi_endpoint_oca.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 14.0\n" +"Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -45,6 +45,7 @@ msgid "Backend Type" msgstr "" #. module: edi_endpoint_oca +#. odoo-python #: code:addons/edi_endpoint_oca/models/edi_endpoint.py:0 #, python-format msgid "Backend and exchange type are mandatory" @@ -81,11 +82,7 @@ msgid "Csrf" msgstr "" #. module: edi_endpoint_oca -#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_backend__display_name -#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_backend_type__display_name #: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_endpoint__display_name -#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_exchange_consumer_mixin__display_name -#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_exchange_record__display_name msgid "Display Name" msgstr "" @@ -160,6 +157,7 @@ msgid "Exchange type" msgstr "" #. module: edi_endpoint_oca +#. odoo-python #: code:addons/edi_endpoint_oca/models/edi_endpoint.py:0 #, python-format msgid "Exchange type not compatible with selected backend type." @@ -181,11 +179,7 @@ msgid "Group By" msgstr "" #. module: edi_endpoint_oca -#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_backend__id -#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_backend_type__id #: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_endpoint__id -#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_exchange_consumer_mixin__id -#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_exchange_record__id msgid "ID" msgstr "" @@ -195,11 +189,7 @@ msgid "Identify the route with its main params" msgstr "" #. module: edi_endpoint_oca -#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_backend____last_update -#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_backend_type____last_update #: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_endpoint____last_update -#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_exchange_consumer_mixin____last_update -#: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_exchange_record____last_update msgid "Last Modified on" msgstr "" @@ -274,6 +264,7 @@ msgid "Sync registry" msgstr "" #. module: edi_endpoint_oca +#. odoo-python #: code:addons/edi_endpoint_oca/models/edi_backend.py:0 #, python-format msgid "" diff --git a/edi_endpoint_oca/static/description/index.html b/edi_endpoint_oca/static/description/index.html index e7ef8e6bc..0a8cfb0b0 100644 --- a/edi_endpoint_oca/static/description/index.html +++ b/edi_endpoint_oca/static/description/index.html @@ -1,20 +1,19 @@ - - + EDI endpoint -
-

EDI endpoint

+
+ + +Odoo Community Association + +
+

EDI endpoint

-

Beta License: LGPL-3 OCA/edi-framework Translate me on Weblate Try me on Runboat

+

Beta License: LGPL-3 OCA/edi-framework Translate me on Weblate Try me on Runboat

Base module allowing configuration of custom endpoints for EDI framework.

Table of contents

@@ -386,11 +391,11 @@

EDI endpoint

-

Configuration

+

Configuration

Go to “EDI -> Config -> Endpoints”.

-

Bug Tracker

+

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 to smash it by providing a detailed and welcomed @@ -398,21 +403,21 @@

Bug Tracker

Do not contact contributors directly about support or help with technical issues.

+
From 5565bbb97ed69959f3db66f9f322e6d7fd75eaa2 Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Fri, 29 Aug 2025 19:23:29 +0200 Subject: [PATCH 34/37] [IMP] edi_endpoint_oca: Adapt to new edi_core_oca logic --- edi_endpoint_oca/README.rst | 2 +- edi_endpoint_oca/__manifest__.py | 4 ++-- edi_endpoint_oca/demo/edi_backend_demo.xml | 6 +++--- edi_endpoint_oca/models/edi_endpoint.py | 2 +- edi_endpoint_oca/static/description/index.html | 2 +- edi_endpoint_oca/views/edi_backend_views.xml | 2 +- edi_endpoint_oca/views/edi_endpoint_views.xml | 2 +- edi_endpoint_oca/views/edi_exchange_record_views.xml | 6 +++--- 8 files changed, 13 insertions(+), 13 deletions(-) diff --git a/edi_endpoint_oca/README.rst b/edi_endpoint_oca/README.rst index 2bdf65fa4..f0e950461 100644 --- a/edi_endpoint_oca/README.rst +++ b/edi_endpoint_oca/README.rst @@ -11,7 +11,7 @@ EDI endpoint !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:46a3d47e5220281e3f20ed22a7e4176d33cad00ffb0893b106123f6e1197b8b2 + !! source digest: sha256:61e5982426475fcce40969c5f34bc4b701092624ecdde5b95cca64daecb36de5 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/edi_endpoint_oca/__manifest__.py b/edi_endpoint_oca/__manifest__.py index bdafbe81b..cf2f4795d 100644 --- a/edi_endpoint_oca/__manifest__.py +++ b/edi_endpoint_oca/__manifest__.py @@ -7,12 +7,12 @@ "summary": """ Base module allowing configuration of custom endpoints for EDI framework. """, - "version": "18.0.1.0.1", + "version": "18.0.1.0.2", "development_status": "Beta", "license": "LGPL-3", "website": "https://github.com/OCA/edi-framework", "author": "Camptocamp,Odoo Community Association (OCA)", - "depends": ["base_edi", "edi_oca", "endpoint"], + "depends": ["base_edi", "edi_core_oca", "endpoint"], "data": [ "data/server_action.xml", "security/ir.model.access.csv", diff --git a/edi_endpoint_oca/demo/edi_backend_demo.xml b/edi_endpoint_oca/demo/edi_backend_demo.xml index e842ec5d1..cea2db0e8 100644 --- a/edi_endpoint_oca/demo/edi_backend_demo.xml +++ b/edi_endpoint_oca/demo/edi_backend_demo.xml @@ -2,19 +2,19 @@ EDI backend with endpoints DEMO - + EDI exchange demo demo_endpoint - + input - + EDI Demo Endpoint 1 diff --git a/edi_endpoint_oca/models/edi_endpoint.py b/edi_endpoint_oca/models/edi_endpoint.py index 5d41c7dcb..83984b73e 100644 --- a/edi_endpoint_oca/models/edi_endpoint.py +++ b/edi_endpoint_oca/models/edi_endpoint.py @@ -73,7 +73,7 @@ def _handle_request(self, request): def action_view_edi_records(self): self.ensure_one() - xmlid = "edi_oca.act_open_edi_exchange_record_view" + xmlid = "edi_core_oca.act_open_edi_exchange_record_view" action = self.env["ir.actions.act_window"]._for_xml_id(xmlid) action["domain"] = [("edi_endpoint_id", "=", self.id)] # Purge default search filters from ctx to avoid hiding records diff --git a/edi_endpoint_oca/static/description/index.html b/edi_endpoint_oca/static/description/index.html index 8ca0c2ccf..b1477ff34 100644 --- a/edi_endpoint_oca/static/description/index.html +++ b/edi_endpoint_oca/static/description/index.html @@ -372,7 +372,7 @@

EDI endpoint

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:46a3d47e5220281e3f20ed22a7e4176d33cad00ffb0893b106123f6e1197b8b2 +!! source digest: sha256:61e5982426475fcce40969c5f34bc4b701092624ecdde5b95cca64daecb36de5 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Beta License: LGPL-3 OCA/edi-framework Translate me on Weblate Try me on Runboat

Base module allowing configuration of custom endpoints for EDI diff --git a/edi_endpoint_oca/views/edi_backend_views.xml b/edi_endpoint_oca/views/edi_backend_views.xml index 666cc4b08..8838b1930 100644 --- a/edi_endpoint_oca/views/edi_backend_views.xml +++ b/edi_endpoint_oca/views/edi_backend_views.xml @@ -2,7 +2,7 @@ edi.backend - + diff --git a/edi_endpoint_oca/views/edi_endpoint_views.xml b/edi_endpoint_oca/views/edi_endpoint_views.xml index 92a6dbbb3..979e8a1f4 100644 --- a/edi_endpoint_oca/views/edi_endpoint_views.xml +++ b/edi_endpoint_oca/views/edi_endpoint_views.xml @@ -92,7 +92,7 @@ EDI Endpoints - + diff --git a/edi_endpoint_oca/views/edi_exchange_record_views.xml b/edi_endpoint_oca/views/edi_exchange_record_views.xml index 90b5eefe4..5888ebdcb 100644 --- a/edi_endpoint_oca/views/edi_exchange_record_views.xml +++ b/edi_endpoint_oca/views/edi_exchange_record_views.xml @@ -2,7 +2,7 @@ edi.exchange.record - + @@ -12,7 +12,7 @@ edi.exchange.record - + @@ -22,7 +22,7 @@ edi.exchange.record - + From 65dc8f1680de703640b495cd6523c97266a62a28 Mon Sep 17 00:00:00 2001 From: mymage Date: Tue, 7 Oct 2025 07:01:21 +0000 Subject: [PATCH 35/37] Translated using Weblate (Italian) Currently translated at 100.0% (51 of 51 strings) Translation: edi-framework-18.0/edi-framework-18.0-edi_endpoint_oca Translate-URL: https://translation.odoo-community.org/projects/edi-framework-18-0/edi-framework-18-0-edi_endpoint_oca/it/ --- edi_endpoint_oca/i18n/it.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/edi_endpoint_oca/i18n/it.po b/edi_endpoint_oca/i18n/it.po index cdda80b6b..03ab8f1b4 100644 --- a/edi_endpoint_oca/i18n/it.po +++ b/edi_endpoint_oca/i18n/it.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2024-11-15 14:06+0000\n" +"PO-Revision-Date: 2025-10-07 09:43+0000\n" "Last-Translator: mymage \n" "Language-Team: none\n" "Language: it\n" @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.6.2\n" +"X-Generator: Weblate 5.10.4\n" #. module: edi_endpoint_oca #: model_terms:ir.ui.view,arch_db:edi_endpoint_oca.edi_endpoint_form_view @@ -24,7 +24,7 @@ msgstr "Scambi" #. module: edi_endpoint_oca #: model:ir.model,name:edi_endpoint_oca.model_edi_exchange_consumer_mixin msgid "Abstract record where exchange records can be assigned" -msgstr "Record astratto dove i recod di scambio possono essere assegnati" +msgstr "Record astratto dove i record di scambio possono essere assegnati" #. module: edi_endpoint_oca #: model:ir.model.fields,field_description:edi_endpoint_oca.field_edi_endpoint__active From 7722de693722a6782f315e55f92dc4d3af4a33ee Mon Sep 17 00:00:00 2001 From: Simone Orsi Date: Tue, 14 Oct 2025 09:39:03 +0200 Subject: [PATCH 36/37] edi_endpoint: fix create_exchange_record helper Setting the file content after creating the record might lead to errors when the exchange type is has quick_exec enabled. That's because the backend will try to process the file immediately on create but there's no file content yet. Just populate the file content right away. --- edi_endpoint_oca/README.rst | 2 +- edi_endpoint_oca/__manifest__.py | 2 +- edi_endpoint_oca/models/edi_endpoint.py | 14 +++++++++----- edi_endpoint_oca/static/description/index.html | 2 +- edi_endpoint_oca/tests/test_edi_endpoint.py | 7 +++++++ 5 files changed, 19 insertions(+), 8 deletions(-) diff --git a/edi_endpoint_oca/README.rst b/edi_endpoint_oca/README.rst index f0e950461..88e65de9d 100644 --- a/edi_endpoint_oca/README.rst +++ b/edi_endpoint_oca/README.rst @@ -11,7 +11,7 @@ EDI endpoint !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:61e5982426475fcce40969c5f34bc4b701092624ecdde5b95cca64daecb36de5 + !! source digest: sha256:be80edcaf6371c867bb601aeac3e28356218aef57bdf10256ac79c9fd3ab28f3 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/edi_endpoint_oca/__manifest__.py b/edi_endpoint_oca/__manifest__.py index cf2f4795d..778915393 100644 --- a/edi_endpoint_oca/__manifest__.py +++ b/edi_endpoint_oca/__manifest__.py @@ -7,7 +7,7 @@ "summary": """ Base module allowing configuration of custom endpoints for EDI framework. """, - "version": "18.0.1.0.2", + "version": "18.0.1.0.3", "development_status": "Beta", "license": "LGPL-3", "website": "https://github.com/OCA/edi-framework", diff --git a/edi_endpoint_oca/models/edi_endpoint.py b/edi_endpoint_oca/models/edi_endpoint.py index 83984b73e..06e7bff26 100644 --- a/edi_endpoint_oca/models/edi_endpoint.py +++ b/edi_endpoint_oca/models/edi_endpoint.py @@ -1,6 +1,8 @@ # Copyright 2021 Camptocamp SA # @author: Simone Orsi # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +import base64 + import werkzeug from odoo import _, api, exceptions, fields, models @@ -32,18 +34,20 @@ class EDIEndpoint(models.Model): domain="[('backend_type_id','=', backend_type_id)]", ) - # TODO: add unit tests - - def create_exchange_record(self, file_content=None, **vals): + def create_exchange_record(self, file_content=None, encoding="utf-8", **vals): """Create an EDI exchange record from current endpoint. Just a shortcut. """ self._check_endpoint_ready() vals["edi_endpoint_id"] = self.id - rec = self.backend_id.create_record(self.exchange_type_id.code, vals) + if file_content: - rec._set_file_content(file_content) + if not isinstance(file_content, bytes): + file_content = bytes(file_content, encoding) + vals["exchange_file"] = base64.b64encode(file_content) + + rec = self.backend_id.create_record(self.exchange_type_id.code, vals) return rec def _check_endpoint_ready(self, request=False): diff --git a/edi_endpoint_oca/static/description/index.html b/edi_endpoint_oca/static/description/index.html index b1477ff34..52824a930 100644 --- a/edi_endpoint_oca/static/description/index.html +++ b/edi_endpoint_oca/static/description/index.html @@ -372,7 +372,7 @@

EDI endpoint

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:61e5982426475fcce40969c5f34bc4b701092624ecdde5b95cca64daecb36de5 +!! source digest: sha256:be80edcaf6371c867bb601aeac3e28356218aef57bdf10256ac79c9fd3ab28f3 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Beta License: LGPL-3 OCA/edi-framework Translate me on Weblate Try me on Runboat

Base module allowing configuration of custom endpoints for EDI diff --git a/edi_endpoint_oca/tests/test_edi_endpoint.py b/edi_endpoint_oca/tests/test_edi_endpoint.py index 4407a9425..ca4ed1d01 100644 --- a/edi_endpoint_oca/tests/test_edi_endpoint.py +++ b/edi_endpoint_oca/tests/test_edi_endpoint.py @@ -2,6 +2,8 @@ # @author: Simone Orsi # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +import base64 + from odoo import exceptions from odoo.addons.endpoint.tests.common import CommonEndpoint @@ -53,3 +55,8 @@ def test_archive_check(self): def test_sync(self): # FIXME: just testing if the method here is available on GH self.endpoint._handle_registry_sync() + + def test_create_exchange_record_with_file_content(self): + content = "This is a test" + rec = self.endpoint.create_exchange_record(file_content=content) + self.assertEqual(base64.b64decode(rec.exchange_file).decode("utf-8"), content) From 625586de070d56dfbb08e8b4008223b472ca7141 Mon Sep 17 00:00:00 2001 From: JordiMForgeFlow Date: Mon, 30 Mar 2026 16:05:28 +0200 Subject: [PATCH 37/37] [MIG] edi_endpoint_oca: Migration to V19 --- edi_endpoint_oca/README.rst | 10 +- edi_endpoint_oca/__manifest__.py | 2 +- .../migrations/18.0.1.0.0/post-migrate.py | 22 ---- edi_endpoint_oca/models/edi_backend.py | 40 ++++--- edi_endpoint_oca/models/edi_endpoint.py | 8 +- .../static/description/index.html | 6 +- edi_endpoint_oca/tests/common.py | 112 ++++++++++++++++++ edi_endpoint_oca/tests/test_edi_endpoint.py | 9 +- .../tests/test_edi_endpoint_controller.py | 24 +++- edi_endpoint_oca/views/edi_endpoint_views.xml | 2 +- 10 files changed, 171 insertions(+), 64 deletions(-) delete mode 100644 edi_endpoint_oca/migrations/18.0.1.0.0/post-migrate.py create mode 100644 edi_endpoint_oca/tests/common.py diff --git a/edi_endpoint_oca/README.rst b/edi_endpoint_oca/README.rst index 88e65de9d..19fe1211f 100644 --- a/edi_endpoint_oca/README.rst +++ b/edi_endpoint_oca/README.rst @@ -21,13 +21,13 @@ EDI endpoint :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html :alt: License: LGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fedi--framework-lightgray.png?logo=github - :target: https://github.com/OCA/edi-framework/tree/18.0/edi_endpoint_oca + :target: https://github.com/OCA/edi-framework/tree/19.0/edi_endpoint_oca :alt: OCA/edi-framework .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/edi-framework-18-0/edi-framework-18-0-edi_endpoint_oca + :target: https://translation.odoo-community.org/projects/edi-framework-19-0/edi-framework-19-0-edi_endpoint_oca :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/builds?repo=OCA/edi-framework&target_branch=18.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/edi-framework&target_branch=19.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -51,7 +51,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 to smash 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 @@ 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-framework `_ project on GitHub. +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_endpoint_oca/__manifest__.py b/edi_endpoint_oca/__manifest__.py index 778915393..ac1014199 100644 --- a/edi_endpoint_oca/__manifest__.py +++ b/edi_endpoint_oca/__manifest__.py @@ -7,7 +7,7 @@ "summary": """ Base module allowing configuration of custom endpoints for EDI framework. """, - "version": "18.0.1.0.3", + "version": "19.0.1.0.0", "development_status": "Beta", "license": "LGPL-3", "website": "https://github.com/OCA/edi-framework", diff --git a/edi_endpoint_oca/migrations/18.0.1.0.0/post-migrate.py b/edi_endpoint_oca/migrations/18.0.1.0.0/post-migrate.py deleted file mode 100644 index 71d465492..000000000 --- a/edi_endpoint_oca/migrations/18.0.1.0.0/post-migrate.py +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright 2025 Camptocamp SA -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) - -import logging - -from odoo import SUPERUSER_ID, api - -_logger = logging.getLogger(__name__) - - -def migrate(cr, version): - """Force update endpoint_route table. - - New params like `readonly` should be added to the stored routes. - """ - if not version: - return - env = api.Environment(cr, SUPERUSER_ID, {}) - model = env["edi.endpoint"] - records = model.sudo().search([]) - records._handle_registry_sync() - _logger.info("Forced endpoint route sync on %s records", model._name) diff --git a/edi_endpoint_oca/models/edi_backend.py b/edi_endpoint_oca/models/edi_backend.py index e54118d4c..896f76077 100644 --- a/edi_endpoint_oca/models/edi_backend.py +++ b/edi_endpoint_oca/models/edi_backend.py @@ -1,8 +1,8 @@ # Copyright 2021 Camptocamp SA # @author: Simone Orsi # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). - -from odoo import _, api, exceptions, fields, models +from odoo import api, exceptions, fields, models +from odoo.fields import Domain class EDIBackend(models.Model): @@ -17,24 +17,29 @@ class EDIBackend(models.Model): @api.depends("endpoint_ids.active") def _compute_endpoints_count(self): - data = self.env["edi.endpoint"].read_group( - [("backend_id", "in", self.ids), ("active", "=", True)], - ["backend_id"], - ["backend_id"], + data = self.env["edi.endpoint"]._read_group( + domain=Domain("backend_id", "in", self.ids) & Domain("active", "=", True), + groupby=["backend_id"], + aggregates=["__count"], ) - by_backend_id = {x["backend_id"][0]: x["backend_id_count"] for x in data} + by_backend_id = {backend.id: count for backend, count in data} for record in self: - record.endpoints_count = by_backend_id.get(record.id) + record.endpoints_count = by_backend_id.get(record.id, 0) def action_manage_endpoints(self): xmlid = "edi_endpoint_oca.edi_endpoint_act_window" action = self.env["ir.actions.act_window"]._for_xml_id(xmlid) - action["domain"] = [ - ("backend_type_id", "=", self.backend_type_id.id), - "|", - ("backend_id", "=", False), - ("backend_id", "=", self.id), - ] + action["domain"] = Domain.AND( + [ + Domain("backend_type_id", "=", self.backend_type_id.id), + Domain.OR( + [ + Domain("backend_id", "=", False), + Domain("backend_id", "=", self.id), + ] + ), + ] + ) action["context"] = { "default_backend_id": self.id, "default_backend_type_id": self.backend_type_id.id, @@ -52,7 +57,8 @@ def _check_archive(self): raise exceptions.UserError(self._check_archive_error_msg(to_check)) def _check_archive_error_msg(self, backends): - return _( + return self.env._( "The following backend(s) have endpoints attached. " - "Please archive them before:\n\n%s" - ) % "\n- ".join([x.name for x in backends]) + "Please archive them before:\n\n%s", + "\n- ".join([x.name for x in backends]), + ) diff --git a/edi_endpoint_oca/models/edi_endpoint.py b/edi_endpoint_oca/models/edi_endpoint.py index 06e7bff26..cff7b9e46 100644 --- a/edi_endpoint_oca/models/edi_endpoint.py +++ b/edi_endpoint_oca/models/edi_endpoint.py @@ -5,7 +5,7 @@ import werkzeug -from odoo import _, api, exceptions, fields, models +from odoo import api, exceptions, fields, models from odoo.tools import safe_eval @@ -52,7 +52,7 @@ def create_exchange_record(self, file_content=None, encoding="utf-8", **vals): def _check_endpoint_ready(self, request=False): if not self.backend_id or not self.exchange_type_id: - msg = _("Backend and exchange type are mandatory") + msg = self.env._("Backend and exchange type are mandatory") if request: self._logger.error(msg) raise werkzeug.exceptions.BadRequest("Endpoint mis-configured") @@ -68,7 +68,9 @@ def _check_backend_type(self): and not rec.backend_type_id == rec.exchange_type_id.backend_type_id ): raise exceptions.UserError( - _("Exchange type not compatible with selected backend type.") + self.env._( + "Exchange type not compatible with selected backend type." + ) ) def _handle_request(self, request): diff --git a/edi_endpoint_oca/static/description/index.html b/edi_endpoint_oca/static/description/index.html index 52824a930..73a88b5e7 100644 --- a/edi_endpoint_oca/static/description/index.html +++ b/edi_endpoint_oca/static/description/index.html @@ -374,7 +374,7 @@

EDI endpoint

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:be80edcaf6371c867bb601aeac3e28356218aef57bdf10256ac79c9fd3ab28f3 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: LGPL-3 OCA/edi-framework Translate me on Weblate Try me on Runboat

+

Beta License: LGPL-3 OCA/edi-framework Translate me on Weblate Try me on Runboat

Base module allowing configuration of custom endpoints for EDI framework.

Table of contents

@@ -399,7 +399,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 to smash it by providing a detailed and welcomed -feedback.

+feedback.

Do not contact contributors directly about support or help with technical issues.

@@ -425,7 +425,7 @@

Maintainers

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-framework project on GitHub.

+

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_endpoint_oca/tests/common.py b/edi_endpoint_oca/tests/common.py new file mode 100644 index 000000000..606f2890f --- /dev/null +++ b/edi_endpoint_oca/tests/common.py @@ -0,0 +1,112 @@ +# Copyright 2026 Camptocamp SA +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo.tests.common import TransactionCase + + +class EDIEndpointTestMixin: + @classmethod + def _setup_context(cls, **kw): + return dict(cls.env.context, tracking_disable=True, **kw) + + @classmethod + def _setup_env(cls, ctx=None): + ctx = ctx or {} + cls.env = cls.env(context=cls._setup_context(**ctx)) + + @classmethod + def _setup_records(cls): + cls.BackendType = cls.env["edi.backend.type"] + cls.Backend = cls.env["edi.backend"] + cls.ExchangeType = cls.env["edi.exchange.type"] + cls.Endpoint = cls.env["edi.endpoint"] + cls.backend_type = ( + cls.BackendType.search([("code", "=", "demo_backend")], limit=1) + or cls._get_backend_type() + ) + cls.backend = ( + cls.Backend.search( + [ + ("backend_type_id", "=", cls.backend_type.id), + ], + limit=1, + ) + or cls._get_backend() + ) + cls.exchange_type = ( + cls.ExchangeType.search( + [ + ("code", "=", "demo_endpoint"), + ("backend_type_id", "=", cls.backend_type.id), + ], + limit=1, + ) + or cls._get_exchange_type() + ) + cls.endpoint = ( + cls.Endpoint.search( + [ + ("route", "=", "/edi/demo/try"), + ("backend_type_id", "=", cls.backend_type.id), + ("exchange_type_id", "=", cls.exchange_type.id), + ], + limit=1, + ) + or cls._get_endpoint() + ) + + @classmethod + def _get_backend_type(cls): + return cls.env["edi.backend.type"].create( + { + "name": "Demo EDI backend type", + "code": "demo_backend", + } + ) + + @classmethod + def _get_backend(cls): + return cls.env["edi.backend"].create( + { + "name": "EDI backend with endpoints DEMO", + "backend_type_id": cls.backend_type.id, + } + ) + + @classmethod + def _get_exchange_type(cls): + return cls.env["edi.exchange.type"].create( + { + "name": "EDI exchange demo", + "code": "demo_endpoint", + "backend_type_id": cls.backend_type.id, + "direction": "input", + } + ) + + @classmethod + def _get_endpoint(cls): + return cls.env["edi.endpoint"].create( + { + "name": "EDI Demo Endpoint 1", + "backend_id": cls.backend.id, + "backend_type_id": cls.backend_type.id, + "exchange_type_id": cls.exchange_type.id, + "route": "/demo/try", + "request_method": "GET", + "exec_mode": "code", + "code_snippet": ( + "record = endpoint.create_exchange_record()\n" + 'result = {"response": Response("' + 'Created record: %s" % record.identifier)}' + ), + } + ) + + +class EDIEndpointCommonTestCase(TransactionCase, EDIEndpointTestMixin): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls._setup_env() + cls._setup_records() diff --git a/edi_endpoint_oca/tests/test_edi_endpoint.py b/edi_endpoint_oca/tests/test_edi_endpoint.py index ca4ed1d01..b1bcb1ed3 100644 --- a/edi_endpoint_oca/tests/test_edi_endpoint.py +++ b/edi_endpoint_oca/tests/test_edi_endpoint.py @@ -6,15 +6,10 @@ from odoo import exceptions -from odoo.addons.endpoint.tests.common import CommonEndpoint +from .common import EDIEndpointCommonTestCase -class TestEndpoint(CommonEndpoint): - @classmethod - def _setup_records(cls): # pylint: disable=missing-return - super()._setup_records() - cls.endpoint = cls.env.ref("edi_endpoint_oca.edi_endpoint_demo_1") - +class TestEndpoint(EDIEndpointCommonTestCase): def test_endpoint_find(self): self.assertEqual( self.env["edi.endpoint"]._find_endpoint("/edi/demo/try"), self.endpoint diff --git a/edi_endpoint_oca/tests/test_edi_endpoint_controller.py b/edi_endpoint_oca/tests/test_edi_endpoint_controller.py index c71a39d9e..290d70a84 100644 --- a/edi_endpoint_oca/tests/test_edi_endpoint_controller.py +++ b/edi_endpoint_oca/tests/test_edi_endpoint_controller.py @@ -7,21 +7,35 @@ from odoo.tests.common import HttpCase +from .common import EDIEndpointTestMixin + @unittest.skipIf(os.getenv("SKIP_HTTP_CASE"), "EDIEndpointHttpCase skipped") -class EDIEndpointHttpCase(HttpCase): +class EDIEndpointHttpCase(HttpCase, EDIEndpointTestMixin): @classmethod def setUpClass(cls): super().setUpClass() - # force sync for demo records - cls.env["edi.endpoint"].search([])._handle_registry_sync() + cls._setup_env() + cls._setup_records() + # Sync only the endpoint under test to avoid re-registering unrelated + # demo routes that may already exist in the route registry. + cls.endpoint._handle_registry_sync() + + def tearDown(self): + # Clear routing cache so each test starts clean + self.env.registry.clear_cache("routing") + super().tearDown() + + def _make_request(self, route, headers=None): + headers = dict(headers or {}) + return self.url_open(route, headers=headers, timeout=60) def test_call1(self): endpoint = "/edi/demo/try" - response = self.url_open(endpoint) + response = self._make_request(endpoint) self.assertEqual(response.status_code, 401) # Let's login now self.authenticate("admin", "admin") - response = self.url_open(endpoint) + response = self._make_request(endpoint) self.assertEqual(response.status_code, 200) self.assertIn("Created record:", response.content.decode()) diff --git a/edi_endpoint_oca/views/edi_endpoint_views.xml b/edi_endpoint_oca/views/edi_endpoint_views.xml index 979e8a1f4..d8b15670f 100644 --- a/edi_endpoint_oca/views/edi_endpoint_views.xml +++ b/edi_endpoint_oca/views/edi_endpoint_views.xml @@ -48,7 +48,7 @@ - +