From 7caa26af17ddd24a43b88447c894fdfc52633a9e Mon Sep 17 00:00:00 2001 From: duongtq Date: Mon, 1 Jul 2024 14:24:16 +0700 Subject: [PATCH 01/15] [ADD] edi_exchange_deduplicate_oca --- edi_exchange_deduplicate_oca/README.rst | 107 ++++ edi_exchange_deduplicate_oca/__init__.py | 1 + edi_exchange_deduplicate_oca/__manifest__.py | 19 + edi_exchange_deduplicate_oca/data/cron.xml | 19 + .../models/__init__.py | 3 + .../models/edi_backend.py | 49 ++ .../models/edi_exchange_record.py | 54 +++ .../models/edi_exchange_type.py | 21 + .../readme/CONFIGURE.rst | 3 + .../readme/CONTRIBUTORS.rst | 2 + .../readme/DESCRIPTION.rst | 3 + edi_exchange_deduplicate_oca/readme/USAGE.rst | 6 + .../static/description/index.html | 455 ++++++++++++++++++ .../tests/__init__.py | 2 + .../tests/test_edi_backend_cron.py | 39 ++ .../tests/test_edi_duplicate.py | 137 ++++++ .../views/edi_exchange_type_views.xml | 17 + 17 files changed, 937 insertions(+) create mode 100644 edi_exchange_deduplicate_oca/README.rst create mode 100644 edi_exchange_deduplicate_oca/__init__.py create mode 100644 edi_exchange_deduplicate_oca/__manifest__.py create mode 100644 edi_exchange_deduplicate_oca/data/cron.xml create mode 100644 edi_exchange_deduplicate_oca/models/__init__.py create mode 100644 edi_exchange_deduplicate_oca/models/edi_backend.py create mode 100644 edi_exchange_deduplicate_oca/models/edi_exchange_record.py create mode 100644 edi_exchange_deduplicate_oca/models/edi_exchange_type.py create mode 100644 edi_exchange_deduplicate_oca/readme/CONFIGURE.rst create mode 100644 edi_exchange_deduplicate_oca/readme/CONTRIBUTORS.rst create mode 100644 edi_exchange_deduplicate_oca/readme/DESCRIPTION.rst create mode 100644 edi_exchange_deduplicate_oca/readme/USAGE.rst create mode 100644 edi_exchange_deduplicate_oca/static/description/index.html create mode 100644 edi_exchange_deduplicate_oca/tests/__init__.py create mode 100644 edi_exchange_deduplicate_oca/tests/test_edi_backend_cron.py create mode 100644 edi_exchange_deduplicate_oca/tests/test_edi_duplicate.py create mode 100644 edi_exchange_deduplicate_oca/views/edi_exchange_type_views.xml diff --git a/edi_exchange_deduplicate_oca/README.rst b/edi_exchange_deduplicate_oca/README.rst new file mode 100644 index 000000000..390f500cc --- /dev/null +++ b/edi_exchange_deduplicate_oca/README.rst @@ -0,0 +1,107 @@ +============================ +Edi Exchange Deduplicate OCA +============================ + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:c87271df5c59b606335e18395349874d1aeb6aa3e1cddff1bd724ba7a84e5712 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png + :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fedi--framework-lightgray.png?logo=github + :target: https://github.com/OCA/edi-framework/tree/16.0/edi_exchange_deduplicate_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-16-0/edi-framework-16-0-edi_exchange_deduplicate_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=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module adds options for deduplication records before sending step on type: + - deduplicate_on_send: check if a fresher one does not exist for the same record. If so, mark the oldest one as obsolete. + - delete_obsolete_records: Delete records marked as obsolete. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +Go to "EDI -> Config -> Exchange Type". + +Enable "Deduplicate on Send" option -> Enable "Delete obsolete records" option. + +Usage +===== + + +With all the types that have been enabled "Deduplicate on Send" option, this module will check their records if a fresher one does not exist for the same record. If so, mark the oldest one as obsolete (except "block_obsolescence" records) + - "block_obsolescence" is an technical option on records to avoid marking them as obsolete. + +With all the types that have been enabled "Delete obsolete records" option, the cron will remove their obsolete records. + - If the records are obsolete, delete them even if their type's flag has been disabled. + +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 `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Camptocamp + +Contributors +~~~~~~~~~~~~ + +* Simone Orsi +* Duong (Tran Quoc) + +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. + +.. |maintainer-simahawk| image:: https://github.com/simahawk.png?size=40px + :target: https://github.com/simahawk + :alt: simahawk +.. |maintainer-etobella| image:: https://github.com/etobella.png?size=40px + :target: https://github.com/etobella + :alt: etobella + +Current `maintainers `__: + +|maintainer-simahawk| |maintainer-etobella| + +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_deduplicate_oca/__init__.py b/edi_exchange_deduplicate_oca/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/edi_exchange_deduplicate_oca/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/edi_exchange_deduplicate_oca/__manifest__.py b/edi_exchange_deduplicate_oca/__manifest__.py new file mode 100644 index 000000000..f343c86c2 --- /dev/null +++ b/edi_exchange_deduplicate_oca/__manifest__.py @@ -0,0 +1,19 @@ +# Copyright 2024 Camptocamp +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +{ + "name": "Edi Exchange Deduplicate OCA", + "summary": """ + Introduce a deduplication mechanism at the sending step""", + "version": "16.0.1.0.0", + "license": "LGPL-3", + "author": "Camptocamp,Odoo Community Association (OCA)", + "maintainers": ["simahawk", "etobella"], + "website": "https://github.com/OCA/edi-framework", + "depends": ["edi_oca"], + "data": [ + "data/cron.xml", + "views/edi_exchange_type_views.xml", + ], + "demo": [], +} diff --git a/edi_exchange_deduplicate_oca/data/cron.xml b/edi_exchange_deduplicate_oca/data/cron.xml new file mode 100644 index 000000000..8e30571c9 --- /dev/null +++ b/edi_exchange_deduplicate_oca/data/cron.xml @@ -0,0 +1,19 @@ + + + + EDI exchange delete obsolete records + + + 1 + days + -1 + + + code + model.search([])._cron_delete_obsolete_records() + + diff --git a/edi_exchange_deduplicate_oca/models/__init__.py b/edi_exchange_deduplicate_oca/models/__init__.py new file mode 100644 index 000000000..ddad285da --- /dev/null +++ b/edi_exchange_deduplicate_oca/models/__init__.py @@ -0,0 +1,3 @@ +from . import edi_backend +from . import edi_exchange_type +from . import edi_exchange_record diff --git a/edi_exchange_deduplicate_oca/models/edi_backend.py b/edi_exchange_deduplicate_oca/models/edi_backend.py new file mode 100644 index 000000000..843fa264c --- /dev/null +++ b/edi_exchange_deduplicate_oca/models/edi_backend.py @@ -0,0 +1,49 @@ +# Copyright 2024 Camptocamp +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +import logging + +from odoo import models + +_logger = logging.getLogger(__name__) + + +class EDIBackend(models.Model): + + _inherit = "edi.backend" + + def _failed_output_check_send_msg(self): + return "Nothing to do. Likely already sent or obsolete." + + def _cron_delete_obsolete_records(self, **kw): + for backend in self: + backend._delete_obsolete_records(**kw) + + def _delete_obsolete_records(self, record_ids=None, **kw): + """Cleanup obsolete records. + + Go through types with `delete_obsolete_records` flag on + and delete their obsolete records if any. + """ + obsolete_records = self.exchange_record_model.search( + self._obsolete_records_domain(record_ids=record_ids) + ) + _logger.info( + "EDI Exchange delete records: found %d obsolete records to delete.", + len(obsolete_records), + ) + if obsolete_records: + obsolete_records.unlink() + + def _obsolete_records_domain(self, record_ids=None): + """ + Domain for obsolete records need to delete. + If the record is obsolete, delete it even if the type's flag has been disabled. + """ + domain = [ + ("backend_id", "=", self.id), + ("edi_exchange_state", "=", "obsolete"), + ] + if record_ids: + domain.append(("id", "in", record_ids)) + return domain diff --git a/edi_exchange_deduplicate_oca/models/edi_exchange_record.py b/edi_exchange_deduplicate_oca/models/edi_exchange_record.py new file mode 100644 index 000000000..f1f2efb80 --- /dev/null +++ b/edi_exchange_deduplicate_oca/models/edi_exchange_record.py @@ -0,0 +1,54 @@ +# Copyright 2024 Camptocamp +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo import api, fields, models + + +class EDIExchangeRecord(models.Model): + + _inherit = "edi.exchange.record" + + edi_exchange_state = fields.Selection( + selection_add=[ + ("obsolete", "Obsolete"), + ], + ondelete={"obsolete": "cascade"}, + ) + block_obsolescence = fields.Boolean( + default=False, + help="Flag record that can never be marked as obsolete", + ) + + @api.constrains("edi_exchange_state") + def _constrain_edi_exchange_state(self): + # Remove `obsolete` record for this check + self = self.filtered(lambda r: r.edi_exchange_state != "obsolete") + return super()._constrain_edi_exchange_state() + + @api.model_create_multi + def create(self, vals_list): + records = super().create(vals_list) + for rec in records: + check_obsoleted_record = ( + rec.type_id.direction == "output" and rec.type_id.deduplicate_on_send + ) + if check_obsoleted_record: + obsoleted_records = rec._edi_get_duplicates() + if obsoleted_records: + obsoleted_records.edi_exchange_state = "obsolete" + return records + + def _edi_get_duplicates(self, count=None): + self.ensure_one() + older_duplicates = self.search( + [ + ("id", "<", self.id), + ("res_id", "=", self.res_id), + ("model", "=", self.model), + ("type_id", "=", self.type_id.id), + ("edi_exchange_state", "in", ("new", "output_pending")), + ("block_obsolescence", "=", False), + ], + count=count, + ) + return older_duplicates diff --git a/edi_exchange_deduplicate_oca/models/edi_exchange_type.py b/edi_exchange_deduplicate_oca/models/edi_exchange_type.py new file mode 100644 index 000000000..c70cfaf7f --- /dev/null +++ b/edi_exchange_deduplicate_oca/models/edi_exchange_type.py @@ -0,0 +1,21 @@ +# Copyright 2024 Camptocamp +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class EDIExchangeType(models.Model): + + _inherit = "edi.exchange.type" + + deduplicate_on_send = fields.Boolean( + string="Deduplicate on Send", + default=False, + help="Before sending an exchange record, check if a fresher one does not " + "exist for same record; if so, mark oldest one as obsolete.", + ) + delete_obsolete_records = fields.Boolean( + string="Delete obsolete records", + default=True, + help="Delete records marked as obsolete.", + ) diff --git a/edi_exchange_deduplicate_oca/readme/CONFIGURE.rst b/edi_exchange_deduplicate_oca/readme/CONFIGURE.rst new file mode 100644 index 000000000..3838d41fe --- /dev/null +++ b/edi_exchange_deduplicate_oca/readme/CONFIGURE.rst @@ -0,0 +1,3 @@ +Go to "EDI -> Config -> Exchange Type". + +Enable "Deduplicate on Send" option -> Enable "Delete obsolete records" option. diff --git a/edi_exchange_deduplicate_oca/readme/CONTRIBUTORS.rst b/edi_exchange_deduplicate_oca/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..20b0da936 --- /dev/null +++ b/edi_exchange_deduplicate_oca/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Simone Orsi +* Duong (Tran Quoc) diff --git a/edi_exchange_deduplicate_oca/readme/DESCRIPTION.rst b/edi_exchange_deduplicate_oca/readme/DESCRIPTION.rst new file mode 100644 index 000000000..f0e131712 --- /dev/null +++ b/edi_exchange_deduplicate_oca/readme/DESCRIPTION.rst @@ -0,0 +1,3 @@ +This module adds options for deduplication records before sending step on type: + - deduplicate_on_send: check if a fresher one does not exist for the same record. If so, mark the oldest one as obsolete. + - delete_obsolete_records: Delete records marked as obsolete. diff --git a/edi_exchange_deduplicate_oca/readme/USAGE.rst b/edi_exchange_deduplicate_oca/readme/USAGE.rst new file mode 100644 index 000000000..61171bfe3 --- /dev/null +++ b/edi_exchange_deduplicate_oca/readme/USAGE.rst @@ -0,0 +1,6 @@ + +With all the types that have been enabled "Deduplicate on Send" option, this module will check their records if a fresher one does not exist for the same record. If so, mark the oldest one as obsolete (except "block_obsolescence" records) + - "block_obsolescence" is an technical option on records to avoid marking them as obsolete. + +With all the types that have been enabled "Delete obsolete records" option, the cron will remove their obsolete records. + - If the records are obsolete, delete them even if their type's flag has been disabled. diff --git a/edi_exchange_deduplicate_oca/static/description/index.html b/edi_exchange_deduplicate_oca/static/description/index.html new file mode 100644 index 000000000..ea1e44368 --- /dev/null +++ b/edi_exchange_deduplicate_oca/static/description/index.html @@ -0,0 +1,455 @@ + + + + + +Edi Exchange Deduplicate OCA + + + +
+

Edi Exchange Deduplicate OCA

+ + +

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

+
+
This module adds options for deduplication records before sending step on type:
+
    +
  • deduplicate_on_send: check if a fresher one does not exist for the same record. If so, mark the oldest one as obsolete.
  • +
  • delete_obsolete_records: Delete records marked as obsolete.
  • +
+
+
+

Table of contents

+ +
+

Configuration

+

Go to “EDI -> Config -> Exchange Type”.

+

Enable “Deduplicate on Send” option -> Enable “Delete obsolete records” option.

+
+
+

Usage

+
+
With all the types that have been enabled “Deduplicate on Send” option, this module will check their records if a fresher one does not exist for the same record. If so, mark the oldest one as obsolete (except “block_obsolescence” records)
+
    +
  • “block_obsolescence” is an technical option on records to avoid marking them as obsolete.
  • +
+
+
With all the types that have been enabled “Delete obsolete records” option, the cron will remove their obsolete records.
+
    +
  • If the records are obsolete, delete them even if their type’s flag has been disabled.
  • +
+
+
+
+
+

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.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Camptocamp
  • +
+
+
+

Contributors

+ +
+
+

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.

+

Current maintainers:

+

simahawk etobella

+

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_deduplicate_oca/tests/__init__.py b/edi_exchange_deduplicate_oca/tests/__init__.py new file mode 100644 index 000000000..c4bb24c72 --- /dev/null +++ b/edi_exchange_deduplicate_oca/tests/__init__.py @@ -0,0 +1,2 @@ +from . import test_edi_backend_cron +from . import test_edi_duplicate diff --git a/edi_exchange_deduplicate_oca/tests/test_edi_backend_cron.py b/edi_exchange_deduplicate_oca/tests/test_edi_backend_cron.py new file mode 100644 index 000000000..8d71e1640 --- /dev/null +++ b/edi_exchange_deduplicate_oca/tests/test_edi_backend_cron.py @@ -0,0 +1,39 @@ +# Copyright 2024 Camptocamp +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo.tools import mute_logger + +from odoo.addons.edi_oca.tests.test_edi_backend_cron import EDIBackendTestCronCase + +LOGGERS = ("odoo.addons.edi_oca.models.edi_backend", "odoo.addons.queue_job.delay") + + +class EDIBackendTestCronDeduplicationCase(EDIBackendTestCronCase): + @mute_logger(*LOGGERS) + def test_exchange_delete_obsolete_records(self): + self.exchange_type_out.write( + { + "exchange_file_auto_generate": True, + "deduplicate_on_send": True, + "delete_obsolete_records": True, + } + ) + record1_1 = self.backend.create_record( + "test_csv_output", {"model": self.partner._name, "res_id": self.partner.id} + ) + record1_2 = self.backend.create_record( + "test_csv_output", {"model": self.partner._name, "res_id": self.partner.id} + ) + record1_3 = self.backend.create_record( + "test_csv_output", {"model": self.partner._name, "res_id": self.partner.id} + ) + # all the older records should have been obsolete by record1_3 + records = self.record1 + record1_1 + record1_2 + self.backend._check_output_exchange_sync() + for record in records: + self.assertEqual(record.edi_exchange_state, "obsolete") + self.assertEqual(record1_3.edi_exchange_state, "output_sent") + self.backend._delete_obsolete_records() + for record in records: + self.assertFalse(record.exists()) + self.assertTrue(record1_3.exists()) diff --git a/edi_exchange_deduplicate_oca/tests/test_edi_duplicate.py b/edi_exchange_deduplicate_oca/tests/test_edi_duplicate.py new file mode 100644 index 000000000..36ff9c92f --- /dev/null +++ b/edi_exchange_deduplicate_oca/tests/test_edi_duplicate.py @@ -0,0 +1,137 @@ +# Copyright 2024 Camptocamp +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo.addons.edi_oca.tests.common import EDIBackendCommonComponentRegistryTestCase +from odoo.addons.edi_oca.tests.fake_components import ( + FakeInputProcess, + FakeOutputChecker, + FakeOutputGenerator, + FakeOutputSender, +) + +LOGGERS = ("odoo.addons.edi_oca.models.edi_backend", "odoo.addons.queue_job.delay") + + +class EDIDeduplicateTestCase(EDIBackendCommonComponentRegistryTestCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls._build_components( + cls, + FakeOutputGenerator, + FakeOutputSender, + FakeOutputChecker, + FakeInputProcess, + ) + cls.partner = cls.env.ref("base.res_partner_10") + cls.exchange_type_out.exchange_file_auto_generate = True + + def setUp(self): + super().setUp() + FakeOutputGenerator.reset_faked() + FakeOutputSender.reset_faked() + FakeOutputChecker.reset_faked() + FakeInputProcess.reset_faked() + + def test_deduplicate_on_send(self): + self.exchange_type_out.write( + { + "deduplicate_on_send": True, + } + ) + record1 = self.backend.create_record( + "test_csv_output", + { + "model": self.partner._name, + "res_id": self.partner.id, + }, + ) + record2 = self.backend.create_record( + "test_csv_output", + { + "model": self.partner._name, + "res_id": self.partner.id, + }, + ) + record3 = self.backend.create_record( + "test_csv_output", + { + "model": self.partner._name, + "res_id": self.partner.id, + }, + ) + records = record1 + record2 + self.backend._check_output_exchange_sync() + # Because we just sent the last record, so the others should be "obsolete" + for record in records: + self.assertEqual(record.edi_exchange_state, "obsolete") + self.assertEqual(record3.edi_exchange_state, "output_sent") + + def test_no_deduplicate_on_send(self): + self.exchange_type_out.write( + { + "deduplicate_on_send": False, + } + ) + record1 = self.backend.create_record( + "test_csv_output", + { + "model": self.partner._name, + "res_id": self.partner.id, + }, + ) + record2 = self.backend.create_record( + "test_csv_output", + { + "model": self.partner._name, + "res_id": self.partner.id, + }, + ) + record3 = self.backend.create_record( + "test_csv_output", + { + "model": self.partner._name, + "res_id": self.partner.id, + }, + ) + records = record1 + record2 + record3 + self.backend._check_output_exchange_sync() + # All the records should be "output_sent" + for record in records: + self.assertEqual(record.edi_exchange_state, "output_sent") + + def test_block_obsolescence(self): + self.exchange_type_out.write( + { + "deduplicate_on_send": True, + } + ) + record1 = self.backend.create_record( + "test_csv_output", + { + "model": self.partner._name, + "res_id": self.partner.id, + }, + ) + record2 = self.backend.create_record( + "test_csv_output", + { + "model": self.partner._name, + "res_id": self.partner.id, + # Checking + "block_obsolescence": True, + }, + ) + record3 = self.backend.create_record( + "test_csv_output", + { + "model": self.partner._name, + "res_id": self.partner.id, + }, + ) + self.backend._check_output_exchange_sync() + # Normally, record2 has been "obsolete" + # But with block_obsolescence = True, it will be "output_sent" too + self.assertEqual(record1.edi_exchange_state, "obsolete") + self.assertEqual(record2.edi_exchange_state, "output_sent") + self.assertEqual(record3.edi_exchange_state, "output_sent") diff --git a/edi_exchange_deduplicate_oca/views/edi_exchange_type_views.xml b/edi_exchange_deduplicate_oca/views/edi_exchange_type_views.xml new file mode 100644 index 000000000..821c20f1b --- /dev/null +++ b/edi_exchange_deduplicate_oca/views/edi_exchange_type_views.xml @@ -0,0 +1,17 @@ + + + + edi.exchange.type.form.inherit + edi.exchange.type + + + + + + + + + From a2c4b3009e4372e420a320f9c088360fb1932f2a Mon Sep 17 00:00:00 2001 From: oca-ci Date: Thu, 25 Jul 2024 06:26:00 +0000 Subject: [PATCH 02/15] [UPD] Update edi_exchange_deduplicate_oca.pot --- .../i18n/edi_exchange_deduplicate_oca.pot | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 edi_exchange_deduplicate_oca/i18n/edi_exchange_deduplicate_oca.pot diff --git a/edi_exchange_deduplicate_oca/i18n/edi_exchange_deduplicate_oca.pot b/edi_exchange_deduplicate_oca/i18n/edi_exchange_deduplicate_oca.pot new file mode 100644 index 000000000..28481a0bc --- /dev/null +++ b/edi_exchange_deduplicate_oca/i18n/edi_exchange_deduplicate_oca.pot @@ -0,0 +1,77 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * edi_exchange_deduplicate_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.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_deduplicate_oca +#: model:ir.model.fields,help:edi_exchange_deduplicate_oca.field_edi_exchange_type__deduplicate_on_send +msgid "" +"Before sending an exchange record, check if a fresher one does not exist for" +" same record; if so, mark oldest one as obsolete." +msgstr "" + +#. module: edi_exchange_deduplicate_oca +#: model:ir.model.fields,field_description:edi_exchange_deduplicate_oca.field_edi_exchange_record__block_obsolescence +msgid "Block Obsolescence" +msgstr "" + +#. module: edi_exchange_deduplicate_oca +#: model:ir.model.fields,field_description:edi_exchange_deduplicate_oca.field_edi_exchange_type__deduplicate_on_send +msgid "Deduplicate on Send" +msgstr "" + +#. module: edi_exchange_deduplicate_oca +#: model:ir.model.fields,field_description:edi_exchange_deduplicate_oca.field_edi_exchange_type__delete_obsolete_records +msgid "Delete obsolete records" +msgstr "" + +#. module: edi_exchange_deduplicate_oca +#: model:ir.model.fields,help:edi_exchange_deduplicate_oca.field_edi_exchange_type__delete_obsolete_records +msgid "Delete records marked as obsolete." +msgstr "" + +#. module: edi_exchange_deduplicate_oca +#: model:ir.model,name:edi_exchange_deduplicate_oca.model_edi_backend +msgid "EDI Backend" +msgstr "" + +#. module: edi_exchange_deduplicate_oca +#: model:ir.model,name:edi_exchange_deduplicate_oca.model_edi_exchange_type +msgid "EDI Exchange Type" +msgstr "" + +#. module: edi_exchange_deduplicate_oca +#: model:ir.model,name:edi_exchange_deduplicate_oca.model_edi_exchange_record +msgid "EDI exchange Record" +msgstr "" + +#. module: edi_exchange_deduplicate_oca +#: model:ir.actions.server,name:edi_exchange_deduplicate_oca.cron_edi_backend_delete_obsolete_records_ir_actions_server +#: model:ir.cron,cron_name:edi_exchange_deduplicate_oca.cron_edi_backend_delete_obsolete_records +msgid "EDI exchange delete obsolete records" +msgstr "" + +#. module: edi_exchange_deduplicate_oca +#: model:ir.model.fields,field_description:edi_exchange_deduplicate_oca.field_edi_exchange_record__edi_exchange_state +msgid "Exchange state" +msgstr "" + +#. module: edi_exchange_deduplicate_oca +#: model:ir.model.fields,help:edi_exchange_deduplicate_oca.field_edi_exchange_record__block_obsolescence +msgid "Flag record that can never be marked as obsolete" +msgstr "" + +#. module: edi_exchange_deduplicate_oca +#: model:ir.model.fields.selection,name:edi_exchange_deduplicate_oca.selection__edi_exchange_record__edi_exchange_state__obsolete +msgid "Obsolete" +msgstr "" From 5dd139bcc18985e10bdfcd51649121f47b78eae0 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Thu, 25 Jul 2024 06:29:08 +0000 Subject: [PATCH 03/15] [BOT] post-merge updates --- edi_exchange_deduplicate_oca/README.rst | 2 +- edi_exchange_deduplicate_oca/__manifest__.py | 2 +- .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 edi_exchange_deduplicate_oca/static/description/icon.png diff --git a/edi_exchange_deduplicate_oca/README.rst b/edi_exchange_deduplicate_oca/README.rst index 390f500cc..e6d59fdf5 100644 --- a/edi_exchange_deduplicate_oca/README.rst +++ b/edi_exchange_deduplicate_oca/README.rst @@ -7,7 +7,7 @@ Edi Exchange Deduplicate OCA !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:c87271df5c59b606335e18395349874d1aeb6aa3e1cddff1bd724ba7a84e5712 + !! source digest: sha256:06edee3c1d1d40daaddff2ec21bb2d2ee194e014fe811281703f5271d98e31ae !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/edi_exchange_deduplicate_oca/__manifest__.py b/edi_exchange_deduplicate_oca/__manifest__.py index f343c86c2..79f3cc646 100644 --- a/edi_exchange_deduplicate_oca/__manifest__.py +++ b/edi_exchange_deduplicate_oca/__manifest__.py @@ -5,7 +5,7 @@ "name": "Edi Exchange Deduplicate OCA", "summary": """ Introduce a deduplication mechanism at the sending step""", - "version": "16.0.1.0.0", + "version": "16.0.1.1.0", "license": "LGPL-3", "author": "Camptocamp,Odoo Community Association (OCA)", "maintainers": ["simahawk", "etobella"], diff --git a/edi_exchange_deduplicate_oca/static/description/icon.png b/edi_exchange_deduplicate_oca/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z z?n?eq1XP>p-IM$Z^C;2L3itnbJZAip*Zo0aw2bs8@(s^~*8T9go!%dHcAz2lM;`yp zD=7&xjFV$S&5uDaiScyD?B-i1ze`+CoRtz`Wn+Zl&#s4&}MO{@N!ufrzjG$B79)Y2d3tBk&)TxUTw@QS0TEL_?njX|@vq?Uz(nBFK5Pq7*xj#u*R&i|?7+6# z+|r_n#SW&LXhtheZdah{ZVoqwyT{D>MC3nkFF#N)xLi{p7J1jXlmVeb;cP5?e(=f# zuT7fvjSbjS781v?7{)-X3*?>tq?)Yd)~|1{BDS(pqC zC}~H#WXlkUW*H5CDOo<)#x7%RY)A;ShGhI5s*#cRDA8YgqG(HeKDx+#(ZQ?386dv! zlXCO)w91~Vw4AmOcATuV653fa9R$fyK8ul%rG z-wfS zihugoZyr38Im?Zuh6@RcF~t1anQu7>#lPpb#}4cOA!EM11`%f*07RqOVkmX{p~KJ9 z^zP;K#|)$`^Rb{rnHGH{~>1(fawV0*Z#)}M`m8-?ZJV<+e}s9wE# z)l&az?w^5{)`S(%MRzxdNqrs1n*-=jS^_jqE*5XDrA0+VE`5^*p3CuM<&dZEeCjoz zR;uu_H9ZPZV|fQq`Cyw4nscrVwi!fE6ciMmX$!_hN7uF;jjKG)d2@aC4ropY)8etW=xJvni)8eHi`H$%#zn^WJ5NLc-rqk|u&&4Z6fD_m&JfSI1Bvb?b<*n&sfl0^t z=HnmRl`XrFvMKB%9}>PaA`m-fK6a0(8=qPkWS5bb4=v?XcWi&hRY?O5HdulRi4?fN zlsJ*N-0Qw+Yic@s0(2uy%F@ib;GjXt01Fmx5XbRo6+n|pP(&nodMoap^z{~q ziEeaUT@Mxe3vJSfI6?uLND(CNr=#^W<1b}jzW58bIfyWTDle$mmS(|x-0|2UlX+9k zQ^EX7Nw}?EzVoBfT(-LT|=9N@^hcn-_p&sqG z&*oVs2JSU+N4ZD`FhCAWaS;>|wH2G*Id|?pa#@>tyxX`+4HyIArWDvVrX)2WAOQff z0qyHu&-S@i^MS-+j--!pr4fPBj~_8({~e1bfcl0wI1kaoN>mJL6KUPQm5N7lB(ui1 zE-o%kq)&djzWJ}ob<-GfDlkB;F31j-VHKvQUGQ3sp`CwyGJk_i!y^sD0fqC@$9|jO zOqN!r!8-p==F@ZVP=U$qSpY(gQ0)59P1&t@y?5rvg<}E+GB}26NYPp4f2YFQrQtot5mn3wu_qprZ=>Ig-$ zbW26Ws~IgY>}^5w`vTB(G`PTZaDiGBo5o(tp)qli|NeV( z@H_=R8V39rt5J5YB2Ky?4eJJ#b`_iBe2ot~6%7mLt5t8Vwi^Jy7|jWXqa3amOIoRb zOr}WVFP--DsS`1WpN%~)t3R!arKF^Q$e12KEqU36AWwnCBICpH4XCsfnyrHr>$I$4 z!DpKX$OKLWarN7nv@!uIA+~RNO)l$$w}p(;b>mx8pwYvu;dD_unryX_NhT8*Tj>BTrTTL&!?O+%Rv;b?B??gSzdp?6Uug9{ zd@V08Z$BdI?fpoCS$)t4mg4rT8Q_I}h`0d-vYZ^|dOB*Q^S|xqTV*vIg?@fVFSmMpaw0qtTRbx} z({Pg?#{2`sc9)M5N$*N|4;^t$+QP?#mov zGVC@I*lBVrOU-%2y!7%)fAKjpEFsgQc4{amtiHb95KQEwvf<(3T<9-Zm$xIew#P22 zc2Ix|App^>v6(3L_MCU0d3W##AB0M~3D00EWoKZqsJYT(#@w$Y_H7G22M~ApVFTRHMI_3be)Lkn#0F*V8Pq zc}`Cjy$bE;FJ6H7p=0y#R>`}-m4(0F>%@P|?7fx{=R^uFdISRnZ2W_xQhD{YuR3t< z{6yxu=4~JkeA;|(J6_nv#>Nvs&FuLA&PW^he@t(UwFFE8)|a!R{`E`K`i^ZnyE4$k z;(749Ix|oi$c3QbEJ3b~D_kQsPz~fIUKym($a_7dJ?o+40*OLl^{=&oq$<#Q(yyrp z{J-FAniyAw9tPbe&IhQ|a`DqFTVQGQ&Gq3!C2==4x{6EJwiPZ8zub-iXoUtkJiG{} zPaR&}_fn8_z~(=;5lD-aPWD3z8PZS@AaUiomF!G8I}Mf>e~0g#BelA-5#`cj;O5>N Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/edi_exchange_deduplicate_oca/static/description/index.html b/edi_exchange_deduplicate_oca/static/description/index.html index ea1e44368..5001c40e5 100644 --- a/edi_exchange_deduplicate_oca/static/description/index.html +++ b/edi_exchange_deduplicate_oca/static/description/index.html @@ -367,7 +367,7 @@

Edi Exchange Deduplicate OCA

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:c87271df5c59b606335e18395349874d1aeb6aa3e1cddff1bd724ba7a84e5712 +!! source digest: sha256:06edee3c1d1d40daaddff2ec21bb2d2ee194e014fe811281703f5271d98e31ae !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

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

From 4503fadc9cb0f8be65deaf15d051031acf39afcf Mon Sep 17 00:00:00 2001 From: mymage Date: Tue, 30 Jul 2024 12:13:31 +0000 Subject: [PATCH 04/15] Added translation using Weblate (Italian) --- edi_exchange_deduplicate_oca/i18n/it.po | 78 +++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 edi_exchange_deduplicate_oca/i18n/it.po diff --git a/edi_exchange_deduplicate_oca/i18n/it.po b/edi_exchange_deduplicate_oca/i18n/it.po new file mode 100644 index 000000000..4121338ae --- /dev/null +++ b/edi_exchange_deduplicate_oca/i18n/it.po @@ -0,0 +1,78 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * edi_exchange_deduplicate_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#. module: edi_exchange_deduplicate_oca +#: model:ir.model.fields,help:edi_exchange_deduplicate_oca.field_edi_exchange_type__deduplicate_on_send +msgid "" +"Before sending an exchange record, check if a fresher one does not exist for" +" same record; if so, mark oldest one as obsolete." +msgstr "" + +#. module: edi_exchange_deduplicate_oca +#: model:ir.model.fields,field_description:edi_exchange_deduplicate_oca.field_edi_exchange_record__block_obsolescence +msgid "Block Obsolescence" +msgstr "" + +#. module: edi_exchange_deduplicate_oca +#: model:ir.model.fields,field_description:edi_exchange_deduplicate_oca.field_edi_exchange_type__deduplicate_on_send +msgid "Deduplicate on Send" +msgstr "" + +#. module: edi_exchange_deduplicate_oca +#: model:ir.model.fields,field_description:edi_exchange_deduplicate_oca.field_edi_exchange_type__delete_obsolete_records +msgid "Delete obsolete records" +msgstr "" + +#. module: edi_exchange_deduplicate_oca +#: model:ir.model.fields,help:edi_exchange_deduplicate_oca.field_edi_exchange_type__delete_obsolete_records +msgid "Delete records marked as obsolete." +msgstr "" + +#. module: edi_exchange_deduplicate_oca +#: model:ir.model,name:edi_exchange_deduplicate_oca.model_edi_backend +msgid "EDI Backend" +msgstr "" + +#. module: edi_exchange_deduplicate_oca +#: model:ir.model,name:edi_exchange_deduplicate_oca.model_edi_exchange_type +msgid "EDI Exchange Type" +msgstr "" + +#. module: edi_exchange_deduplicate_oca +#: model:ir.model,name:edi_exchange_deduplicate_oca.model_edi_exchange_record +msgid "EDI exchange Record" +msgstr "" + +#. module: edi_exchange_deduplicate_oca +#: model:ir.actions.server,name:edi_exchange_deduplicate_oca.cron_edi_backend_delete_obsolete_records_ir_actions_server +#: model:ir.cron,cron_name:edi_exchange_deduplicate_oca.cron_edi_backend_delete_obsolete_records +msgid "EDI exchange delete obsolete records" +msgstr "" + +#. module: edi_exchange_deduplicate_oca +#: model:ir.model.fields,field_description:edi_exchange_deduplicate_oca.field_edi_exchange_record__edi_exchange_state +msgid "Exchange state" +msgstr "" + +#. module: edi_exchange_deduplicate_oca +#: model:ir.model.fields,help:edi_exchange_deduplicate_oca.field_edi_exchange_record__block_obsolescence +msgid "Flag record that can never be marked as obsolete" +msgstr "" + +#. module: edi_exchange_deduplicate_oca +#: model:ir.model.fields.selection,name:edi_exchange_deduplicate_oca.selection__edi_exchange_record__edi_exchange_state__obsolete +msgid "Obsolete" +msgstr "" From c7a73e4e4bddfbe1c8aac36bbf1af77493260d36 Mon Sep 17 00:00:00 2001 From: mymage Date: Wed, 7 Aug 2024 15:15:07 +0000 Subject: [PATCH 05/15] Translated using Weblate (Italian) Currently translated at 100.0% (12 of 12 strings) Translation: edi-framework-16.0/edi-framework-16.0-edi_exchange_deduplicate_oca Translate-URL: https://translation.odoo-community.org/projects/edi-framework-16-0/edi-framework-16-0-edi_exchange_deduplicate_oca/it/ --- edi_exchange_deduplicate_oca/i18n/it.po | 28 ++++++++++++++----------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/edi_exchange_deduplicate_oca/i18n/it.po b/edi_exchange_deduplicate_oca/i18n/it.po index 4121338ae..efddbf985 100644 --- a/edi_exchange_deduplicate_oca/i18n/it.po +++ b/edi_exchange_deduplicate_oca/i18n/it.po @@ -6,13 +6,15 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: Automatically generated\n" +"PO-Revision-Date: 2024-08-07 17:58+0000\n" +"Last-Translator: mymage \n" "Language-Team: none\n" "Language: it\n" "MIME-Version: 1.0\n" "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" #. module: edi_exchange_deduplicate_oca #: model:ir.model.fields,help:edi_exchange_deduplicate_oca.field_edi_exchange_type__deduplicate_on_send @@ -20,59 +22,61 @@ msgid "" "Before sending an exchange record, check if a fresher one does not exist for" " same record; if so, mark oldest one as obsolete." msgstr "" +"Prima di inviare un record di scambio, controlla se ne esiste uno più " +"recente per lo stesso record; se così, marca il vecchio come obsoleto." #. module: edi_exchange_deduplicate_oca #: model:ir.model.fields,field_description:edi_exchange_deduplicate_oca.field_edi_exchange_record__block_obsolescence msgid "Block Obsolescence" -msgstr "" +msgstr "Obsolescenza blocco" #. module: edi_exchange_deduplicate_oca #: model:ir.model.fields,field_description:edi_exchange_deduplicate_oca.field_edi_exchange_type__deduplicate_on_send msgid "Deduplicate on Send" -msgstr "" +msgstr "Duplica alla spedizione" #. module: edi_exchange_deduplicate_oca #: model:ir.model.fields,field_description:edi_exchange_deduplicate_oca.field_edi_exchange_type__delete_obsolete_records msgid "Delete obsolete records" -msgstr "" +msgstr "Cancella record obsoleti" #. module: edi_exchange_deduplicate_oca #: model:ir.model.fields,help:edi_exchange_deduplicate_oca.field_edi_exchange_type__delete_obsolete_records msgid "Delete records marked as obsolete." -msgstr "" +msgstr "Cancella record marcati come obsoleti." #. module: edi_exchange_deduplicate_oca #: model:ir.model,name:edi_exchange_deduplicate_oca.model_edi_backend msgid "EDI Backend" -msgstr "" +msgstr "Backend EDI" #. module: edi_exchange_deduplicate_oca #: model:ir.model,name:edi_exchange_deduplicate_oca.model_edi_exchange_type msgid "EDI Exchange Type" -msgstr "" +msgstr "Tipo scambio EDI" #. module: edi_exchange_deduplicate_oca #: model:ir.model,name:edi_exchange_deduplicate_oca.model_edi_exchange_record msgid "EDI exchange Record" -msgstr "" +msgstr "Record di scambio EDI" #. module: edi_exchange_deduplicate_oca #: model:ir.actions.server,name:edi_exchange_deduplicate_oca.cron_edi_backend_delete_obsolete_records_ir_actions_server #: model:ir.cron,cron_name:edi_exchange_deduplicate_oca.cron_edi_backend_delete_obsolete_records msgid "EDI exchange delete obsolete records" -msgstr "" +msgstr "Scambio EDI cancella record obsoleti" #. module: edi_exchange_deduplicate_oca #: model:ir.model.fields,field_description:edi_exchange_deduplicate_oca.field_edi_exchange_record__edi_exchange_state msgid "Exchange state" -msgstr "" +msgstr "Stato scambio" #. module: edi_exchange_deduplicate_oca #: model:ir.model.fields,help:edi_exchange_deduplicate_oca.field_edi_exchange_record__block_obsolescence msgid "Flag record that can never be marked as obsolete" -msgstr "" +msgstr "Segna record che non devono mai essere marcati obsoleti" #. module: edi_exchange_deduplicate_oca #: model:ir.model.fields.selection,name:edi_exchange_deduplicate_oca.selection__edi_exchange_record__edi_exchange_state__obsolete msgid "Obsolete" -msgstr "" +msgstr "Obsoleto" From 74e6d4cdfd9c8f3f1dd802e54ccd4a01236270e7 Mon Sep 17 00:00:00 2001 From: Ricardoalso Date: Thu, 16 Jan 2025 11:21:40 +0100 Subject: [PATCH 06/15] [IMP] edi_exchange_deduplicate_oca: pre-commit auto fixes --- edi_exchange_deduplicate_oca/README.rst | 47 ++++++++++++------- edi_exchange_deduplicate_oca/data/cron.xml | 22 ++++----- .../models/edi_backend.py | 1 - .../models/edi_exchange_record.py | 1 - .../models/edi_exchange_type.py | 1 - edi_exchange_deduplicate_oca/pyproject.toml | 3 ++ .../readme/CONFIGURE.md | 4 ++ .../readme/CONFIGURE.rst | 3 -- .../readme/CONTRIBUTORS.md | 2 + .../readme/CONTRIBUTORS.rst | 2 - .../readme/DESCRIPTION.md | 4 ++ .../readme/DESCRIPTION.rst | 3 -- edi_exchange_deduplicate_oca/readme/USAGE.md | 7 +++ edi_exchange_deduplicate_oca/readme/USAGE.rst | 6 --- .../static/description/index.html | 42 +++++++++-------- 15 files changed, 82 insertions(+), 66 deletions(-) create mode 100644 edi_exchange_deduplicate_oca/pyproject.toml create mode 100644 edi_exchange_deduplicate_oca/readme/CONFIGURE.md delete mode 100644 edi_exchange_deduplicate_oca/readme/CONFIGURE.rst create mode 100644 edi_exchange_deduplicate_oca/readme/CONTRIBUTORS.md delete mode 100644 edi_exchange_deduplicate_oca/readme/CONTRIBUTORS.rst create mode 100644 edi_exchange_deduplicate_oca/readme/DESCRIPTION.md delete mode 100644 edi_exchange_deduplicate_oca/readme/DESCRIPTION.rst create mode 100644 edi_exchange_deduplicate_oca/readme/USAGE.md delete mode 100644 edi_exchange_deduplicate_oca/readme/USAGE.rst diff --git a/edi_exchange_deduplicate_oca/README.rst b/edi_exchange_deduplicate_oca/README.rst index e6d59fdf5..7fa28f44a 100644 --- a/edi_exchange_deduplicate_oca/README.rst +++ b/edi_exchange_deduplicate_oca/README.rst @@ -17,20 +17,23 @@ Edi Exchange Deduplicate OCA :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/16.0/edi_exchange_deduplicate_oca + :target: https://github.com/OCA/edi-framework/tree/18.0/edi_exchange_deduplicate_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-16-0/edi-framework-16-0-edi_exchange_deduplicate_oca + :target: https://translation.odoo-community.org/projects/edi-framework-18-0/edi-framework-18-0-edi_exchange_deduplicate_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=16.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/edi-framework&target_branch=18.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| -This module adds options for deduplication records before sending step on type: - - deduplicate_on_send: check if a fresher one does not exist for the same record. If so, mark the oldest one as obsolete. - - delete_obsolete_records: Delete records marked as obsolete. +This module adds options for deduplication records before sending step +on type: + +- deduplicate_on_send: check if a fresher one does not exist for the + same record. If so, mark the oldest one as obsolete. +- delete_obsolete_records: Delete records marked as obsolete. **Table of contents** @@ -42,17 +45,25 @@ Configuration Go to "EDI -> Config -> Exchange Type". -Enable "Deduplicate on Send" option -> Enable "Delete obsolete records" option. +Enable "Deduplicate on Send" option -> Enable "Delete obsolete records" +option. Usage ===== +With all the types that have been enabled "Deduplicate on Send" option, +this module will check their records if a fresher one does not exist for +the same record. If so, mark the oldest one as obsolete (except +"block_obsolescence" records) + +- "block_obsolescence" is an technical option on records to avoid + marking them as obsolete. -With all the types that have been enabled "Deduplicate on Send" option, this module will check their records if a fresher one does not exist for the same record. If so, mark the oldest one as obsolete (except "block_obsolescence" records) - - "block_obsolescence" is an technical option on records to avoid marking them as obsolete. +With all the types that have been enabled "Delete obsolete records" +option, the cron will remove their obsolete records. -With all the types that have been enabled "Delete obsolete records" option, the cron will remove their obsolete records. - - If the records are obsolete, delete them even if their type's flag has been disabled. +- If the records are obsolete, delete them even if their type's flag has + been disabled. Bug Tracker =========== @@ -60,7 +71,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. @@ -68,18 +79,18 @@ Credits ======= Authors -~~~~~~~ +------- * Camptocamp Contributors -~~~~~~~~~~~~ +------------ -* Simone Orsi -* Duong (Tran Quoc) +- Simone Orsi +- Duong (Tran Quoc) Maintainers -~~~~~~~~~~~ +----------- This module is maintained by the OCA. @@ -102,6 +113,6 @@ Current `maintainers `__: |maintainer-simahawk| |maintainer-etobella| -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_exchange_deduplicate_oca/data/cron.xml b/edi_exchange_deduplicate_oca/data/cron.xml index 8e30571c9..236a0e0ec 100644 --- a/edi_exchange_deduplicate_oca/data/cron.xml +++ b/edi_exchange_deduplicate_oca/data/cron.xml @@ -5,15 +5,15 @@ model="ir.cron" forcecreate="True" > - EDI exchange delete obsolete records - - - 1 - days - -1 - - - code - model.search([])._cron_delete_obsolete_records() - + EDI exchange delete obsolete records + + + 1 + days + -1 + + + code + model.search([])._cron_delete_obsolete_records() + diff --git a/edi_exchange_deduplicate_oca/models/edi_backend.py b/edi_exchange_deduplicate_oca/models/edi_backend.py index 843fa264c..12a75a380 100644 --- a/edi_exchange_deduplicate_oca/models/edi_backend.py +++ b/edi_exchange_deduplicate_oca/models/edi_backend.py @@ -9,7 +9,6 @@ class EDIBackend(models.Model): - _inherit = "edi.backend" def _failed_output_check_send_msg(self): diff --git a/edi_exchange_deduplicate_oca/models/edi_exchange_record.py b/edi_exchange_deduplicate_oca/models/edi_exchange_record.py index f1f2efb80..ffd764320 100644 --- a/edi_exchange_deduplicate_oca/models/edi_exchange_record.py +++ b/edi_exchange_deduplicate_oca/models/edi_exchange_record.py @@ -5,7 +5,6 @@ class EDIExchangeRecord(models.Model): - _inherit = "edi.exchange.record" edi_exchange_state = fields.Selection( diff --git a/edi_exchange_deduplicate_oca/models/edi_exchange_type.py b/edi_exchange_deduplicate_oca/models/edi_exchange_type.py index c70cfaf7f..80fcbd7d8 100644 --- a/edi_exchange_deduplicate_oca/models/edi_exchange_type.py +++ b/edi_exchange_deduplicate_oca/models/edi_exchange_type.py @@ -5,7 +5,6 @@ class EDIExchangeType(models.Model): - _inherit = "edi.exchange.type" deduplicate_on_send = fields.Boolean( diff --git a/edi_exchange_deduplicate_oca/pyproject.toml b/edi_exchange_deduplicate_oca/pyproject.toml new file mode 100644 index 000000000..4231d0ccc --- /dev/null +++ b/edi_exchange_deduplicate_oca/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/edi_exchange_deduplicate_oca/readme/CONFIGURE.md b/edi_exchange_deduplicate_oca/readme/CONFIGURE.md new file mode 100644 index 000000000..fd2d3271d --- /dev/null +++ b/edi_exchange_deduplicate_oca/readme/CONFIGURE.md @@ -0,0 +1,4 @@ +Go to "EDI -\> Config -\> Exchange Type". + +Enable "Deduplicate on Send" option -\> Enable "Delete obsolete records" +option. diff --git a/edi_exchange_deduplicate_oca/readme/CONFIGURE.rst b/edi_exchange_deduplicate_oca/readme/CONFIGURE.rst deleted file mode 100644 index 3838d41fe..000000000 --- a/edi_exchange_deduplicate_oca/readme/CONFIGURE.rst +++ /dev/null @@ -1,3 +0,0 @@ -Go to "EDI -> Config -> Exchange Type". - -Enable "Deduplicate on Send" option -> Enable "Delete obsolete records" option. diff --git a/edi_exchange_deduplicate_oca/readme/CONTRIBUTORS.md b/edi_exchange_deduplicate_oca/readme/CONTRIBUTORS.md new file mode 100644 index 000000000..faee38dc0 --- /dev/null +++ b/edi_exchange_deduplicate_oca/readme/CONTRIBUTORS.md @@ -0,0 +1,2 @@ +- Simone Orsi \ +- Duong (Tran Quoc) \ diff --git a/edi_exchange_deduplicate_oca/readme/CONTRIBUTORS.rst b/edi_exchange_deduplicate_oca/readme/CONTRIBUTORS.rst deleted file mode 100644 index 20b0da936..000000000 --- a/edi_exchange_deduplicate_oca/readme/CONTRIBUTORS.rst +++ /dev/null @@ -1,2 +0,0 @@ -* Simone Orsi -* Duong (Tran Quoc) diff --git a/edi_exchange_deduplicate_oca/readme/DESCRIPTION.md b/edi_exchange_deduplicate_oca/readme/DESCRIPTION.md new file mode 100644 index 000000000..434a47858 --- /dev/null +++ b/edi_exchange_deduplicate_oca/readme/DESCRIPTION.md @@ -0,0 +1,4 @@ +This module adds options for deduplication records before sending step on type: +- deduplicate_on_send: check if a fresher one does not exist for the + same record. If so, mark the oldest one as obsolete. +- delete_obsolete_records: Delete records marked as obsolete. diff --git a/edi_exchange_deduplicate_oca/readme/DESCRIPTION.rst b/edi_exchange_deduplicate_oca/readme/DESCRIPTION.rst deleted file mode 100644 index f0e131712..000000000 --- a/edi_exchange_deduplicate_oca/readme/DESCRIPTION.rst +++ /dev/null @@ -1,3 +0,0 @@ -This module adds options for deduplication records before sending step on type: - - deduplicate_on_send: check if a fresher one does not exist for the same record. If so, mark the oldest one as obsolete. - - delete_obsolete_records: Delete records marked as obsolete. diff --git a/edi_exchange_deduplicate_oca/readme/USAGE.md b/edi_exchange_deduplicate_oca/readme/USAGE.md new file mode 100644 index 000000000..70fcdfdbd --- /dev/null +++ b/edi_exchange_deduplicate_oca/readme/USAGE.md @@ -0,0 +1,7 @@ +With all the types that have been enabled "Deduplicate on Send" option, this module will check their records if a fresher one does not exist for the same record. If so, mark the oldest one as obsolete (except "block_obsolescence" records) +- "block_obsolescence" is an technical option on records to avoid + marking them as obsolete. + +With all the types that have been enabled "Delete obsolete records" option, the cron will remove their obsolete records. +- If the records are obsolete, delete them even if their type's flag has + been disabled. diff --git a/edi_exchange_deduplicate_oca/readme/USAGE.rst b/edi_exchange_deduplicate_oca/readme/USAGE.rst deleted file mode 100644 index 61171bfe3..000000000 --- a/edi_exchange_deduplicate_oca/readme/USAGE.rst +++ /dev/null @@ -1,6 +0,0 @@ - -With all the types that have been enabled "Deduplicate on Send" option, this module will check their records if a fresher one does not exist for the same record. If so, mark the oldest one as obsolete (except "block_obsolescence" records) - - "block_obsolescence" is an technical option on records to avoid marking them as obsolete. - -With all the types that have been enabled "Delete obsolete records" option, the cron will remove their obsolete records. - - If the records are obsolete, delete them even if their type's flag has been disabled. diff --git a/edi_exchange_deduplicate_oca/static/description/index.html b/edi_exchange_deduplicate_oca/static/description/index.html index 5001c40e5..8857fc1b3 100644 --- a/edi_exchange_deduplicate_oca/static/description/index.html +++ b/edi_exchange_deduplicate_oca/static/description/index.html @@ -369,15 +369,14 @@

Edi Exchange Deduplicate OCA

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:06edee3c1d1d40daaddff2ec21bb2d2ee194e014fe811281703f5271d98e31ae !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

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

-
-
This module adds options for deduplication records before sending step on type:
-
    -
  • deduplicate_on_send: check if a fresher one does not exist for the same record. If so, mark the oldest one as obsolete.
  • +

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

    +

    This module adds options for deduplication records before sending step +on type:

    +
      +
    • deduplicate_on_send: check if a fresher one does not exist for the +same record. If so, mark the oldest one as obsolete.
    • delete_obsolete_records: Delete records marked as obsolete.
    -
-

Table of contents

    @@ -395,29 +394,32 @@

    Edi Exchange Deduplicate OCA

    Configuration

    Go to “EDI -> Config -> Exchange Type”.

    -

    Enable “Deduplicate on Send” option -> Enable “Delete obsolete records” option.

    +

    Enable “Deduplicate on Send” option -> Enable “Delete obsolete records” +option.

    Usage

    -
    -
    With all the types that have been enabled “Deduplicate on Send” option, this module will check their records if a fresher one does not exist for the same record. If so, mark the oldest one as obsolete (except “block_obsolescence” records)
    -
      -
    • “block_obsolescence” is an technical option on records to avoid marking them as obsolete.
    • +

      With all the types that have been enabled “Deduplicate on Send” option, +this module will check their records if a fresher one does not exist for +the same record. If so, mark the oldest one as obsolete (except +“block_obsolescence” records)

      +
        +
      • “block_obsolescence” is an technical option on records to avoid +marking them as obsolete.
      -
    -
    With all the types that have been enabled “Delete obsolete records” option, the cron will remove their obsolete records.
    -
      -
    • If the records are obsolete, delete them even if their type’s flag has been disabled.
    • +

      With all the types that have been enabled “Delete obsolete records” +option, the cron will remove their obsolete records.

      +
        +
      • If the records are obsolete, delete them even if their type’s flag has +been disabled.
      -
    -

    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.

    @@ -446,7 +448,7 @@

    Maintainers

    promote its widespread use.

    Current maintainers:

    simahawk etobella

    -

    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.

From bd61e8d180a894a281f773ab632e74de56e3b703 Mon Sep 17 00:00:00 2001 From: SilvioC2C Date: Wed, 11 Dec 2024 10:49:16 +0100 Subject: [PATCH 07/15] [MIG] edi_exchange_deduplicate_oca: Migration to 17.0 --- edi_exchange_deduplicate_oca/__manifest__.py | 2 +- edi_exchange_deduplicate_oca/models/edi_exchange_record.py | 4 +--- .../views/edi_exchange_type_views.xml | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/edi_exchange_deduplicate_oca/__manifest__.py b/edi_exchange_deduplicate_oca/__manifest__.py index 79f3cc646..995d03b4b 100644 --- a/edi_exchange_deduplicate_oca/__manifest__.py +++ b/edi_exchange_deduplicate_oca/__manifest__.py @@ -5,7 +5,7 @@ "name": "Edi Exchange Deduplicate OCA", "summary": """ Introduce a deduplication mechanism at the sending step""", - "version": "16.0.1.1.0", + "version": "17.0.1.0.0", "license": "LGPL-3", "author": "Camptocamp,Odoo Community Association (OCA)", "maintainers": ["simahawk", "etobella"], diff --git a/edi_exchange_deduplicate_oca/models/edi_exchange_record.py b/edi_exchange_deduplicate_oca/models/edi_exchange_record.py index ffd764320..c533a4e62 100644 --- a/edi_exchange_deduplicate_oca/models/edi_exchange_record.py +++ b/edi_exchange_deduplicate_oca/models/edi_exchange_record.py @@ -39,7 +39,7 @@ def create(self, vals_list): def _edi_get_duplicates(self, count=None): self.ensure_one() - older_duplicates = self.search( + return (self.search_count if count else self.search)( [ ("id", "<", self.id), ("res_id", "=", self.res_id), @@ -48,6 +48,4 @@ def _edi_get_duplicates(self, count=None): ("edi_exchange_state", "in", ("new", "output_pending")), ("block_obsolescence", "=", False), ], - count=count, ) - return older_duplicates diff --git a/edi_exchange_deduplicate_oca/views/edi_exchange_type_views.xml b/edi_exchange_deduplicate_oca/views/edi_exchange_type_views.xml index 821c20f1b..b1978ff24 100644 --- a/edi_exchange_deduplicate_oca/views/edi_exchange_type_views.xml +++ b/edi_exchange_deduplicate_oca/views/edi_exchange_type_views.xml @@ -9,7 +9,7 @@ From 94bf84d8b13534fd5f8d8d029a9596f4286b2cca Mon Sep 17 00:00:00 2001 From: Ricardoalso Date: Thu, 16 Jan 2025 11:37:19 +0100 Subject: [PATCH 08/15] [MIG] edi_exchange_deduplicate_oca: Migration to 18.0 --- edi_exchange_deduplicate_oca/__manifest__.py | 4 +- edi_exchange_deduplicate_oca/data/cron.xml | 4 +- .../models/edi_exchange_record.py | 2 +- .../tests/test_edi_backend_cron.py | 4 +- .../tests/test_edi_duplicate.py | 57 +++++++++++-------- .../views/edi_exchange_type_views.xml | 2 +- 6 files changed, 39 insertions(+), 34 deletions(-) diff --git a/edi_exchange_deduplicate_oca/__manifest__.py b/edi_exchange_deduplicate_oca/__manifest__.py index 995d03b4b..8576d5b5e 100644 --- a/edi_exchange_deduplicate_oca/__manifest__.py +++ b/edi_exchange_deduplicate_oca/__manifest__.py @@ -5,12 +5,12 @@ "name": "Edi Exchange Deduplicate OCA", "summary": """ Introduce a deduplication mechanism at the sending step""", - "version": "17.0.1.0.0", + "version": "18.0.1.0.0", "license": "LGPL-3", "author": "Camptocamp,Odoo Community Association (OCA)", "maintainers": ["simahawk", "etobella"], "website": "https://github.com/OCA/edi-framework", - "depends": ["edi_oca"], + "depends": ["edi_core_oca"], "data": [ "data/cron.xml", "views/edi_exchange_type_views.xml", diff --git a/edi_exchange_deduplicate_oca/data/cron.xml b/edi_exchange_deduplicate_oca/data/cron.xml index 236a0e0ec..02e9eb208 100644 --- a/edi_exchange_deduplicate_oca/data/cron.xml +++ b/edi_exchange_deduplicate_oca/data/cron.xml @@ -10,9 +10,7 @@ 1 days - -1 - - + code model.search([])._cron_delete_obsolete_records() diff --git a/edi_exchange_deduplicate_oca/models/edi_exchange_record.py b/edi_exchange_deduplicate_oca/models/edi_exchange_record.py index c533a4e62..dcbb3f096 100644 --- a/edi_exchange_deduplicate_oca/models/edi_exchange_record.py +++ b/edi_exchange_deduplicate_oca/models/edi_exchange_record.py @@ -37,7 +37,7 @@ def create(self, vals_list): obsoleted_records.edi_exchange_state = "obsolete" return records - def _edi_get_duplicates(self, count=None): + def _edi_get_duplicates(self, count=False): self.ensure_one() return (self.search_count if count else self.search)( [ diff --git a/edi_exchange_deduplicate_oca/tests/test_edi_backend_cron.py b/edi_exchange_deduplicate_oca/tests/test_edi_backend_cron.py index 8d71e1640..3162001be 100644 --- a/edi_exchange_deduplicate_oca/tests/test_edi_backend_cron.py +++ b/edi_exchange_deduplicate_oca/tests/test_edi_backend_cron.py @@ -3,9 +3,9 @@ from odoo.tools import mute_logger -from odoo.addons.edi_oca.tests.test_edi_backend_cron import EDIBackendTestCronCase +from odoo.addons.edi_core_oca.tests.test_edi_backend_cron import EDIBackendTestCronCase -LOGGERS = ("odoo.addons.edi_oca.models.edi_backend", "odoo.addons.queue_job.delay") +LOGGERS = ("odoo.addons.edi_core_oca.models.edi_backend", "odoo.addons.queue_job.delay") class EDIBackendTestCronDeduplicationCase(EDIBackendTestCronCase): diff --git a/edi_exchange_deduplicate_oca/tests/test_edi_duplicate.py b/edi_exchange_deduplicate_oca/tests/test_edi_duplicate.py index 36ff9c92f..2273e51d8 100644 --- a/edi_exchange_deduplicate_oca/tests/test_edi_duplicate.py +++ b/edi_exchange_deduplicate_oca/tests/test_edi_duplicate.py @@ -1,38 +1,43 @@ # Copyright 2024 Camptocamp # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). -from odoo.addons.edi_oca.tests.common import EDIBackendCommonComponentRegistryTestCase -from odoo.addons.edi_oca.tests.fake_components import ( - FakeInputProcess, - FakeOutputChecker, - FakeOutputGenerator, - FakeOutputSender, -) +from odoo_test_helper import FakeModelLoader -LOGGERS = ("odoo.addons.edi_oca.models.edi_backend", "odoo.addons.queue_job.delay") +from odoo.tools import mute_logger +from odoo.addons.edi_core_oca.tests.common import EDIBackendCommonTestCase -class EDIDeduplicateTestCase(EDIBackendCommonComponentRegistryTestCase): - @classmethod - def setUpClass(cls): - super().setUpClass() - cls._build_components( - cls, - FakeOutputGenerator, - FakeOutputSender, - FakeOutputChecker, - FakeInputProcess, - ) - cls.partner = cls.env.ref("base.res_partner_10") - cls.exchange_type_out.exchange_file_auto_generate = True +LOGGERS = ( + "odoo.addons.edi_core_oca.models.edi_backend", + "odoo.addons.queue_job.delay", +) + +class EDIDeduplicateTestCase(EDIBackendCommonTestCase): def setUp(self): super().setUp() - FakeOutputGenerator.reset_faked() - FakeOutputSender.reset_faked() - FakeOutputChecker.reset_faked() - FakeInputProcess.reset_faked() + self.loader = FakeModelLoader(self.env, self.__module__) + self.loader.backup_registry() + from odoo.addons.edi_core_oca.tests.fake_models import EdiTestExecution + + self.loader.update_registry((EdiTestExecution,)) + self.model = self.env["ir.model"].search( + [("model", "=", "edi.framework.test.execution")] + ) + self.exchange_type_out.write( + { + "exchange_file_auto_generate": True, + "generate_model_id": self.model.id, + "send_model_id": self.model.id, + "output_validate_model_id": self.model.id, + } + ) + + def tearDown(self): + self.loader.restore_registry() + super().tearDown() + @mute_logger(*LOGGERS) def test_deduplicate_on_send(self): self.exchange_type_out.write( { @@ -67,6 +72,7 @@ def test_deduplicate_on_send(self): self.assertEqual(record.edi_exchange_state, "obsolete") self.assertEqual(record3.edi_exchange_state, "output_sent") + @mute_logger(*LOGGERS) def test_no_deduplicate_on_send(self): self.exchange_type_out.write( { @@ -100,6 +106,7 @@ def test_no_deduplicate_on_send(self): for record in records: self.assertEqual(record.edi_exchange_state, "output_sent") + @mute_logger(*LOGGERS) def test_block_obsolescence(self): self.exchange_type_out.write( { diff --git a/edi_exchange_deduplicate_oca/views/edi_exchange_type_views.xml b/edi_exchange_deduplicate_oca/views/edi_exchange_type_views.xml index b1978ff24..0470b5255 100644 --- a/edi_exchange_deduplicate_oca/views/edi_exchange_type_views.xml +++ b/edi_exchange_deduplicate_oca/views/edi_exchange_type_views.xml @@ -3,7 +3,7 @@ edi.exchange.type.form.inherit edi.exchange.type - + From 0f36ad2f7b0d46efb52f51d75b0bbafc9cc84931 Mon Sep 17 00:00:00 2001 From: Ricardoalso Date: Mon, 1 Jun 2026 12:00:24 +0200 Subject: [PATCH 09/15] [IMP] edi_exchange_deduplicate_oca: pre-commit auto fixes --- edi_exchange_deduplicate_oca/README.rst | 16 ++++++---- .../static/description/index.html | 32 +++++++++++-------- 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/edi_exchange_deduplicate_oca/README.rst b/edi_exchange_deduplicate_oca/README.rst index 7fa28f44a..edc67406b 100644 --- a/edi_exchange_deduplicate_oca/README.rst +++ b/edi_exchange_deduplicate_oca/README.rst @@ -1,3 +1,7 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + ============================ Edi Exchange Deduplicate OCA ============================ @@ -13,17 +17,17 @@ Edi Exchange Deduplicate OCA .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status :alt: Beta -.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png +.. |badge2| image:: https://img.shields.io/badge/license-LGPL--3-blue.png :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html :alt: License: LGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fedi--framework-lightgray.png?logo=github - :target: https://github.com/OCA/edi-framework/tree/18.0/edi_exchange_deduplicate_oca + :target: https://github.com/OCA/edi-framework/tree/19.0/edi_exchange_deduplicate_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_exchange_deduplicate_oca + :target: https://translation.odoo-community.org/projects/edi-framework-19-0/edi-framework-19-0-edi_exchange_deduplicate_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| @@ -71,7 +75,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. @@ -113,6 +117,6 @@ Current `maintainers `__: |maintainer-simahawk| |maintainer-etobella| -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_exchange_deduplicate_oca/static/description/index.html b/edi_exchange_deduplicate_oca/static/description/index.html index 8857fc1b3..78790dc48 100644 --- a/edi_exchange_deduplicate_oca/static/description/index.html +++ b/edi_exchange_deduplicate_oca/static/description/index.html @@ -3,7 +3,7 @@ -Edi Exchange Deduplicate OCA +README.rst -
-

Edi Exchange Deduplicate OCA

+
+ + +Odoo Community Association + +
+

Edi Exchange Deduplicate OCA

-

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

This module adds options for deduplication records before sending step on type:

    @@ -392,13 +397,13 @@

    Edi Exchange Deduplicate OCA

-

Configuration

+

Configuration

Go to “EDI -> Config -> Exchange Type”.

Enable “Deduplicate on Send” option -> Enable “Delete obsolete records” option.

-

Usage

+

Usage

With all the types that have been enabled “Deduplicate on Send” option, this module will check their records if a fresher one does not exist for the same record. If so, mark the oldest one as obsolete (except @@ -415,30 +420,30 @@

Usage

-

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 -feedback.

+feedback.

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

-

Credits

+

Credits

-

Authors

+

Authors

  • Camptocamp
-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -448,10 +453,11 @@

Maintainers

promote its widespread use.

Current maintainers:

simahawk etobella

-

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.

+
From e5e54e95cfef95dad1ec0810b098ae0530571d07 Mon Sep 17 00:00:00 2001 From: Ricardoalso Date: Mon, 1 Jun 2026 13:50:41 +0200 Subject: [PATCH 10/15] [MIG] edi_exchange_deduplicate_oca: Migration to 19.0 --- edi_exchange_deduplicate_oca/__manifest__.py | 2 +- .../models/edi_backend.py | 3 +- .../models/edi_exchange_record.py | 19 ++++++----- .../tests/test_edi_duplicate.py | 34 ++++++++++--------- 4 files changed, 32 insertions(+), 26 deletions(-) diff --git a/edi_exchange_deduplicate_oca/__manifest__.py b/edi_exchange_deduplicate_oca/__manifest__.py index 8576d5b5e..909193ec3 100644 --- a/edi_exchange_deduplicate_oca/__manifest__.py +++ b/edi_exchange_deduplicate_oca/__manifest__.py @@ -5,7 +5,7 @@ "name": "Edi Exchange Deduplicate OCA", "summary": """ Introduce a deduplication mechanism at the sending step""", - "version": "18.0.1.0.0", + "version": "19.0.1.0.0", "license": "LGPL-3", "author": "Camptocamp,Odoo Community Association (OCA)", "maintainers": ["simahawk", "etobella"], diff --git a/edi_exchange_deduplicate_oca/models/edi_backend.py b/edi_exchange_deduplicate_oca/models/edi_backend.py index 12a75a380..895a602bf 100644 --- a/edi_exchange_deduplicate_oca/models/edi_backend.py +++ b/edi_exchange_deduplicate_oca/models/edi_backend.py @@ -4,6 +4,7 @@ import logging from odoo import models +from odoo.fields import Domain _logger = logging.getLogger(__name__) @@ -45,4 +46,4 @@ def _obsolete_records_domain(self, record_ids=None): ] if record_ids: domain.append(("id", "in", record_ids)) - return domain + return Domain(domain) diff --git a/edi_exchange_deduplicate_oca/models/edi_exchange_record.py b/edi_exchange_deduplicate_oca/models/edi_exchange_record.py index dcbb3f096..05318acd8 100644 --- a/edi_exchange_deduplicate_oca/models/edi_exchange_record.py +++ b/edi_exchange_deduplicate_oca/models/edi_exchange_record.py @@ -2,6 +2,7 @@ # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). from odoo import api, fields, models +from odoo.fields import Domain class EDIExchangeRecord(models.Model): @@ -40,12 +41,14 @@ def create(self, vals_list): def _edi_get_duplicates(self, count=False): self.ensure_one() return (self.search_count if count else self.search)( - [ - ("id", "<", self.id), - ("res_id", "=", self.res_id), - ("model", "=", self.model), - ("type_id", "=", self.type_id.id), - ("edi_exchange_state", "in", ("new", "output_pending")), - ("block_obsolescence", "=", False), - ], + Domain( + [ + ("id", "<", self.id), + ("res_id", "=", self.res_id), + ("model", "=", self.model), + ("type_id", "=", self.type_id.id), + ("edi_exchange_state", "in", ("new", "output_pending")), + ("block_obsolescence", "=", False), + ], + ) ) diff --git a/edi_exchange_deduplicate_oca/tests/test_edi_duplicate.py b/edi_exchange_deduplicate_oca/tests/test_edi_duplicate.py index 2273e51d8..4eba171a9 100644 --- a/edi_exchange_deduplicate_oca/tests/test_edi_duplicate.py +++ b/edi_exchange_deduplicate_oca/tests/test_edi_duplicate.py @@ -1,8 +1,7 @@ # Copyright 2024 Camptocamp # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). -from odoo_test_helper import FakeModelLoader - +from odoo.orm.model_classes import add_to_registry from odoo.tools import mute_logger from odoo.addons.edi_core_oca.tests.common import EDIBackendCommonTestCase @@ -14,29 +13,32 @@ class EDIDeduplicateTestCase(EDIBackendCommonTestCase): - def setUp(self): - super().setUp() - self.loader = FakeModelLoader(self.env, self.__module__) - self.loader.backup_registry() + @classmethod + def _setup_records(cls): # pylint:disable=missing-return + super()._setup_records() + # Load fake models from odoo.addons.edi_core_oca.tests.fake_models import EdiTestExecution - self.loader.update_registry((EdiTestExecution,)) - self.model = self.env["ir.model"].search( + add_to_registry(cls.registry, EdiTestExecution) + cls.registry._setup_models__(cls.env.cr, ["edi.framework.test.execution"]) + cls.registry.init_models( + cls.env.cr, + ["edi.framework.test.execution"], + {"models_to_check": True}, + ) + cls.addClassCleanup(cls.registry.__delitem__, "edi.framework.test.execution") + cls.model = cls.env["ir.model"].search( [("model", "=", "edi.framework.test.execution")] ) - self.exchange_type_out.write( + cls.exchange_type_out.write( { "exchange_file_auto_generate": True, - "generate_model_id": self.model.id, - "send_model_id": self.model.id, - "output_validate_model_id": self.model.id, + "generate_model_id": cls.model.id, + "send_model_id": cls.model.id, + "output_validate_model_id": cls.model.id, } ) - def tearDown(self): - self.loader.restore_registry() - super().tearDown() - @mute_logger(*LOGGERS) def test_deduplicate_on_send(self): self.exchange_type_out.write( From fe8a522d31e6acbe2110e859bee57448a59ffb68 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Wed, 10 Jun 2026 10:10:39 +0000 Subject: [PATCH 11/15] [UPD] Update edi_exchange_deduplicate_oca.pot --- .../i18n/edi_exchange_deduplicate_oca.pot | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/edi_exchange_deduplicate_oca/i18n/edi_exchange_deduplicate_oca.pot b/edi_exchange_deduplicate_oca/i18n/edi_exchange_deduplicate_oca.pot index 28481a0bc..d1c1c0457 100644 --- a/edi_exchange_deduplicate_oca/i18n/edi_exchange_deduplicate_oca.pot +++ b/edi_exchange_deduplicate_oca/i18n/edi_exchange_deduplicate_oca.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 16.0\n" +"Project-Id-Version: Odoo Server 19.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -40,6 +40,13 @@ msgstr "" msgid "Delete records marked as obsolete." msgstr "" +#. module: edi_exchange_deduplicate_oca +#: model:ir.model.fields,field_description:edi_exchange_deduplicate_oca.field_edi_backend__display_name +#: model:ir.model.fields,field_description:edi_exchange_deduplicate_oca.field_edi_exchange_record__display_name +#: model:ir.model.fields,field_description:edi_exchange_deduplicate_oca.field_edi_exchange_type__display_name +msgid "Display Name" +msgstr "" + #. module: edi_exchange_deduplicate_oca #: model:ir.model,name:edi_exchange_deduplicate_oca.model_edi_backend msgid "EDI Backend" @@ -57,7 +64,6 @@ msgstr "" #. module: edi_exchange_deduplicate_oca #: model:ir.actions.server,name:edi_exchange_deduplicate_oca.cron_edi_backend_delete_obsolete_records_ir_actions_server -#: model:ir.cron,cron_name:edi_exchange_deduplicate_oca.cron_edi_backend_delete_obsolete_records msgid "EDI exchange delete obsolete records" msgstr "" @@ -71,6 +77,13 @@ msgstr "" msgid "Flag record that can never be marked as obsolete" msgstr "" +#. module: edi_exchange_deduplicate_oca +#: model:ir.model.fields,field_description:edi_exchange_deduplicate_oca.field_edi_backend__id +#: model:ir.model.fields,field_description:edi_exchange_deduplicate_oca.field_edi_exchange_record__id +#: model:ir.model.fields,field_description:edi_exchange_deduplicate_oca.field_edi_exchange_type__id +msgid "ID" +msgstr "" + #. module: edi_exchange_deduplicate_oca #: model:ir.model.fields.selection,name:edi_exchange_deduplicate_oca.selection__edi_exchange_record__edi_exchange_state__obsolete msgid "Obsolete" From 83708f89abd470dd0477f7647bca53b4bbc60eb7 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 10 Jun 2026 10:13:45 +0000 Subject: [PATCH 12/15] [BOT] post-merge updates --- README.md | 1 + edi_exchange_deduplicate_oca/README.rst | 2 +- edi_exchange_deduplicate_oca/static/description/index.html | 2 +- setup/_metapackage/pyproject.toml | 3 ++- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 844fecd95..3edef04db 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ addon | version | maintainers | summary [edi_component_oca](edi_component_oca/) | 19.0.1.1.0 | simahawk etobella | Allow to use Connector as a source in EDI [edi_core_oca](edi_core_oca/) | 19.0.1.2.2 | simahawk etobella | Define backends, exchange types, exchange records, basic automation and views for handling EDI exchanges. [edi_endpoint_oca](edi_endpoint_oca/) | 19.0.1.1.1 | | Base module allowing configuration of custom endpoints for EDI framework. +[edi_exchange_deduplicate_oca](edi_exchange_deduplicate_oca/) | 19.0.1.0.0 | simahawk etobella | Introduce a deduplication mechanism at the sending step [edi_product_oca](edi_product_oca/) | 19.0.1.0.0 | | EDI framework configuration and base logic for products and units of measure [edi_purchase_oca](edi_purchase_oca/) | 19.0.1.0.0 | | Define EDI Configuration for Purchase Orders [edi_queue_oca](edi_queue_oca/) | 19.0.1.0.0 | | Set Queue Jobs on EDI diff --git a/edi_exchange_deduplicate_oca/README.rst b/edi_exchange_deduplicate_oca/README.rst index edc67406b..d44eca0fe 100644 --- a/edi_exchange_deduplicate_oca/README.rst +++ b/edi_exchange_deduplicate_oca/README.rst @@ -11,7 +11,7 @@ Edi Exchange Deduplicate OCA !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:06edee3c1d1d40daaddff2ec21bb2d2ee194e014fe811281703f5271d98e31ae + !! source digest: sha256:5ef00f94671b13ecf11e3f038feeb08e23d9defadc7b41a3e57be05f86c975c3 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/edi_exchange_deduplicate_oca/static/description/index.html b/edi_exchange_deduplicate_oca/static/description/index.html index 78790dc48..4d27b3d57 100644 --- a/edi_exchange_deduplicate_oca/static/description/index.html +++ b/edi_exchange_deduplicate_oca/static/description/index.html @@ -372,7 +372,7 @@

Edi Exchange Deduplicate OCA

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:06edee3c1d1d40daaddff2ec21bb2d2ee194e014fe811281703f5271d98e31ae +!! source digest: sha256:5ef00f94671b13ecf11e3f038feeb08e23d9defadc7b41a3e57be05f86c975c3 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

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

This module adds options for deduplication records before sending step diff --git a/setup/_metapackage/pyproject.toml b/setup/_metapackage/pyproject.toml index cbbcbd4bf..6971a1cc7 100644 --- a/setup/_metapackage/pyproject.toml +++ b/setup/_metapackage/pyproject.toml @@ -1,10 +1,11 @@ [project] name = "odoo-addons-oca-edi-framework" -version = "19.0.20260604.0" +version = "19.0.20260610.0" dependencies = [ "odoo-addon-edi_component_oca==19.0.*", "odoo-addon-edi_core_oca==19.0.*", "odoo-addon-edi_endpoint_oca==19.0.*", + "odoo-addon-edi_exchange_deduplicate_oca==19.0.*", "odoo-addon-edi_product_oca==19.0.*", "odoo-addon-edi_purchase_oca==19.0.*", "odoo-addon-edi_queue_oca==19.0.*", From 8347d36afe9c9ab9d8eb8305dc43d6ff6564c5ee Mon Sep 17 00:00:00 2001 From: Hadrien Huvelle Date: Wed, 10 Jun 2026 11:47:00 +0200 Subject: [PATCH 13/15] [IMP] edi_exchange_deduplicate_oca: add configurable deduplication states Add a technical setting to control which exchange states are eligible for deduplication, and validate configured values against exchange state selection. --- edi_exchange_deduplicate_oca/README.rst | 4 + .../models/edi_exchange_record.py | 5 +- .../models/edi_exchange_type.py | 35 ++++++- .../readme/CONTRIBUTORS.md | 1 + edi_exchange_deduplicate_oca/readme/USAGE.md | 1 + .../static/description/index.html | 4 + .../tests/__init__.py | 1 + ...t_deduplicate_on_exchange_record_status.py | 98 +++++++++++++++++++ 8 files changed, 147 insertions(+), 2 deletions(-) create mode 100644 edi_exchange_deduplicate_oca/tests/test_deduplicate_on_exchange_record_status.py diff --git a/edi_exchange_deduplicate_oca/README.rst b/edi_exchange_deduplicate_oca/README.rst index d44eca0fe..3ee92aee8 100644 --- a/edi_exchange_deduplicate_oca/README.rst +++ b/edi_exchange_deduplicate_oca/README.rst @@ -62,6 +62,9 @@ the same record. If so, mark the oldest one as obsolete (except - "block_obsolescence" is an technical option on records to avoid marking them as obsolete. +- You can restrict deduplication to specific exchange states with the + technical field "deduplicate_on_exchange_record_status" + (comma-separated values from "edi_exchange_state"). With all the types that have been enabled "Delete obsolete records" option, the cron will remove their obsolete records. @@ -92,6 +95,7 @@ Contributors - Simone Orsi - Duong (Tran Quoc) +- Hadrien Huvelle Maintainers ----------- diff --git a/edi_exchange_deduplicate_oca/models/edi_exchange_record.py b/edi_exchange_deduplicate_oca/models/edi_exchange_record.py index 05318acd8..fdc965fd1 100644 --- a/edi_exchange_deduplicate_oca/models/edi_exchange_record.py +++ b/edi_exchange_deduplicate_oca/models/edi_exchange_record.py @@ -40,6 +40,9 @@ def create(self, vals_list): def _edi_get_duplicates(self, count=False): self.ensure_one() + edi_exchange_state_to_check = list( + self.type_id._deduplicate_get_exchange_record_states() + ) return (self.search_count if count else self.search)( Domain( [ @@ -47,7 +50,7 @@ def _edi_get_duplicates(self, count=False): ("res_id", "=", self.res_id), ("model", "=", self.model), ("type_id", "=", self.type_id.id), - ("edi_exchange_state", "in", ("new", "output_pending")), + ("edi_exchange_state", "in", edi_exchange_state_to_check), ("block_obsolescence", "=", False), ], ) diff --git a/edi_exchange_deduplicate_oca/models/edi_exchange_type.py b/edi_exchange_deduplicate_oca/models/edi_exchange_type.py index 80fcbd7d8..d5ae889c2 100644 --- a/edi_exchange_deduplicate_oca/models/edi_exchange_type.py +++ b/edi_exchange_deduplicate_oca/models/edi_exchange_type.py @@ -1,7 +1,8 @@ # Copyright 2024 Camptocamp # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import fields, models +from odoo import api, fields, models +from odoo.exceptions import ValidationError class EDIExchangeType(models.Model): @@ -18,3 +19,35 @@ class EDIExchangeType(models.Model): default=True, help="Delete records marked as obsolete.", ) + + deduplicate_on_exchange_record_status = fields.Char( + default="new,output_pending", + groups="base.group_no_one", + ) + + def _deduplicate_get_exchange_record_states(self): + self.ensure_one() + return { + state.strip() + for state in (self.deduplicate_on_exchange_record_status or "").split(",") + if state.strip() + } + + @api.constrains("deduplicate_on_exchange_record_status") + def _check_deduplicate_on_exchange_record_status(self): + exchange_state_field = self.env["edi.exchange.record"]._fields[ + "edi_exchange_state" + ] + allowed_states = set(exchange_state_field.get_values(self.env)) + for rec in self: + configured_states = rec._deduplicate_get_exchange_record_states() + invalid_states = sorted(configured_states - allowed_states) + if invalid_states: + raise ValidationError( + self.env._( + "Invalid exchange state(s): %(invalid_states)s. " + "Allowed values are: %(allowed_states)s", + invalid_states=", ".join(invalid_states), + allowed_states=", ".join(sorted(allowed_states)), + ) + ) diff --git a/edi_exchange_deduplicate_oca/readme/CONTRIBUTORS.md b/edi_exchange_deduplicate_oca/readme/CONTRIBUTORS.md index faee38dc0..599f66192 100644 --- a/edi_exchange_deduplicate_oca/readme/CONTRIBUTORS.md +++ b/edi_exchange_deduplicate_oca/readme/CONTRIBUTORS.md @@ -1,2 +1,3 @@ - Simone Orsi \ - Duong (Tran Quoc) \ +- Hadrien Huvelle \ \ No newline at end of file diff --git a/edi_exchange_deduplicate_oca/readme/USAGE.md b/edi_exchange_deduplicate_oca/readme/USAGE.md index 70fcdfdbd..900ed5f76 100644 --- a/edi_exchange_deduplicate_oca/readme/USAGE.md +++ b/edi_exchange_deduplicate_oca/readme/USAGE.md @@ -1,6 +1,7 @@ With all the types that have been enabled "Deduplicate on Send" option, this module will check their records if a fresher one does not exist for the same record. If so, mark the oldest one as obsolete (except "block_obsolescence" records) - "block_obsolescence" is an technical option on records to avoid marking them as obsolete. +- You can restrict deduplication to specific exchange states with the technical field "deduplicate_on_exchange_record_status" (comma-separated values from "edi_exchange_state"). With all the types that have been enabled "Delete obsolete records" option, the cron will remove their obsolete records. - If the records are obsolete, delete them even if their type's flag has diff --git a/edi_exchange_deduplicate_oca/static/description/index.html b/edi_exchange_deduplicate_oca/static/description/index.html index 4d27b3d57..fa8467761 100644 --- a/edi_exchange_deduplicate_oca/static/description/index.html +++ b/edi_exchange_deduplicate_oca/static/description/index.html @@ -411,6 +411,9 @@

Usage

  • “block_obsolescence” is an technical option on records to avoid marking them as obsolete.
  • +
  • You can restrict deduplication to specific exchange states with the +technical field “deduplicate_on_exchange_record_status” +(comma-separated values from “edi_exchange_state”).

With all the types that have been enabled “Delete obsolete records” option, the cron will remove their obsolete records.

@@ -440,6 +443,7 @@

Contributors

diff --git a/edi_exchange_deduplicate_oca/tests/__init__.py b/edi_exchange_deduplicate_oca/tests/__init__.py index c4bb24c72..6c6e6a325 100644 --- a/edi_exchange_deduplicate_oca/tests/__init__.py +++ b/edi_exchange_deduplicate_oca/tests/__init__.py @@ -1,2 +1,3 @@ from . import test_edi_backend_cron +from . import test_deduplicate_on_exchange_record_status from . import test_edi_duplicate diff --git a/edi_exchange_deduplicate_oca/tests/test_deduplicate_on_exchange_record_status.py b/edi_exchange_deduplicate_oca/tests/test_deduplicate_on_exchange_record_status.py new file mode 100644 index 000000000..0d3d0971b --- /dev/null +++ b/edi_exchange_deduplicate_oca/tests/test_deduplicate_on_exchange_record_status.py @@ -0,0 +1,98 @@ +# Copyright 2024 Camptocamp +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo.exceptions import ValidationError +from odoo.tools import mute_logger + +from .test_edi_duplicate import EDIDeduplicateTestCase + +LOGGERS = ( + "odoo.addons.edi_core_oca.models.edi_backend", + "odoo.addons.queue_job.delay", +) + + +class TestDeduplicateOnExchangeRecordStatus(EDIDeduplicateTestCase): + def test_configured_statuses_must_exist_in_selection(self): + with self.assertRaisesRegex(ValidationError, "Invalid exchange state"): + self.exchange_type_out.write( + { + "deduplicate_on_exchange_record_status": "new,not_a_state", + } + ) + + def test_configured_statuses_accept_valid_values(self): + # "obsolete" comes from this addon via selection_add on edi_exchange_state. + self.exchange_type_out.write( + { + "deduplicate_on_exchange_record_status": ( + "new, output_pending, obsolete" + ), + } + ) + self.assertEqual( + self.exchange_type_out.deduplicate_on_exchange_record_status, + "new, output_pending, obsolete", + ) + + @mute_logger(*LOGGERS) + def test_default_status_deduplicates_new_records(self): + self.exchange_type_out.write( + { + "deduplicate_on_send": True, + } + ) + record1 = self.backend.create_record( + "test_csv_output", + { + "model": self.partner._name, + "res_id": self.partner.id, + }, + ) + self.backend.create_record( + "test_csv_output", + { + "model": self.partner._name, + "res_id": self.partner.id, + }, + ) + + self.assertEqual(record1.edi_exchange_state, "obsolete") + + @mute_logger(*LOGGERS) + def test_custom_status_filter_is_used_for_deduplication(self): + self.exchange_type_out.write( + { + "deduplicate_on_send": True, + "deduplicate_on_exchange_record_status": "output_pending", + } + ) + record1 = self.backend.create_record( + "test_csv_output", + { + "model": self.partner._name, + "res_id": self.partner.id, + }, + ) + record2 = self.backend.create_record( + "test_csv_output", + { + "model": self.partner._name, + "res_id": self.partner.id, + }, + ) + + # "new" is not part of the configured list, so no deduplication yet. + self.assertEqual(record1.edi_exchange_state, "new") + + record1.edi_exchange_state = "output_pending" + self.backend.create_record( + "test_csv_output", + { + "model": self.partner._name, + "res_id": self.partner.id, + }, + ) + + self.assertEqual(record1.edi_exchange_state, "obsolete") + self.assertEqual(record2.edi_exchange_state, "new") From 2ca7bc86be0e6b579346fe9870a29c152d7857e3 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Wed, 10 Jun 2026 14:16:43 +0000 Subject: [PATCH 14/15] [UPD] Update edi_exchange_deduplicate_oca.pot --- .../i18n/edi_exchange_deduplicate_oca.pot | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/edi_exchange_deduplicate_oca/i18n/edi_exchange_deduplicate_oca.pot b/edi_exchange_deduplicate_oca/i18n/edi_exchange_deduplicate_oca.pot index d1c1c0457..bc0f7d94c 100644 --- a/edi_exchange_deduplicate_oca/i18n/edi_exchange_deduplicate_oca.pot +++ b/edi_exchange_deduplicate_oca/i18n/edi_exchange_deduplicate_oca.pot @@ -25,6 +25,11 @@ msgstr "" msgid "Block Obsolescence" msgstr "" +#. module: edi_exchange_deduplicate_oca +#: model:ir.model.fields,field_description:edi_exchange_deduplicate_oca.field_edi_exchange_type__deduplicate_on_exchange_record_status +msgid "Deduplicate On Exchange Record Status" +msgstr "" + #. module: edi_exchange_deduplicate_oca #: model:ir.model.fields,field_description:edi_exchange_deduplicate_oca.field_edi_exchange_type__deduplicate_on_send msgid "Deduplicate on Send" @@ -84,6 +89,14 @@ msgstr "" msgid "ID" msgstr "" +#. module: edi_exchange_deduplicate_oca +#. odoo-python +#: code:addons/edi_exchange_deduplicate_oca/models/edi_exchange_type.py:0 +msgid "" +"Invalid exchange state(s): %(invalid_states)s. Allowed values are: " +"%(allowed_states)s" +msgstr "" + #. module: edi_exchange_deduplicate_oca #: model:ir.model.fields.selection,name:edi_exchange_deduplicate_oca.selection__edi_exchange_record__edi_exchange_state__obsolete msgid "Obsolete" From 4e9bb890d36d30a8d219a1848c2c89bf92d18761 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 10 Jun 2026 14:19:51 +0000 Subject: [PATCH 15/15] [BOT] post-merge updates --- README.md | 2 +- edi_exchange_deduplicate_oca/README.rst | 2 +- edi_exchange_deduplicate_oca/__manifest__.py | 2 +- edi_exchange_deduplicate_oca/static/description/index.html | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 3edef04db..0c94c22dc 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ addon | version | maintainers | summary [edi_component_oca](edi_component_oca/) | 19.0.1.1.0 | simahawk etobella | Allow to use Connector as a source in EDI [edi_core_oca](edi_core_oca/) | 19.0.1.2.2 | simahawk etobella | Define backends, exchange types, exchange records, basic automation and views for handling EDI exchanges. [edi_endpoint_oca](edi_endpoint_oca/) | 19.0.1.1.1 | | Base module allowing configuration of custom endpoints for EDI framework. -[edi_exchange_deduplicate_oca](edi_exchange_deduplicate_oca/) | 19.0.1.0.0 | simahawk etobella | Introduce a deduplication mechanism at the sending step +[edi_exchange_deduplicate_oca](edi_exchange_deduplicate_oca/) | 19.0.1.1.0 | simahawk etobella | Introduce a deduplication mechanism at the sending step [edi_product_oca](edi_product_oca/) | 19.0.1.0.0 | | EDI framework configuration and base logic for products and units of measure [edi_purchase_oca](edi_purchase_oca/) | 19.0.1.0.0 | | Define EDI Configuration for Purchase Orders [edi_queue_oca](edi_queue_oca/) | 19.0.1.0.0 | | Set Queue Jobs on EDI diff --git a/edi_exchange_deduplicate_oca/README.rst b/edi_exchange_deduplicate_oca/README.rst index 3ee92aee8..1152fb298 100644 --- a/edi_exchange_deduplicate_oca/README.rst +++ b/edi_exchange_deduplicate_oca/README.rst @@ -11,7 +11,7 @@ Edi Exchange Deduplicate OCA !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:5ef00f94671b13ecf11e3f038feeb08e23d9defadc7b41a3e57be05f86c975c3 + !! source digest: sha256:f5a7501a3960f60fb0869000e315e9d6bdb2e254682e5038d8603111d141f1b7 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/edi_exchange_deduplicate_oca/__manifest__.py b/edi_exchange_deduplicate_oca/__manifest__.py index 909193ec3..728a9d37a 100644 --- a/edi_exchange_deduplicate_oca/__manifest__.py +++ b/edi_exchange_deduplicate_oca/__manifest__.py @@ -5,7 +5,7 @@ "name": "Edi Exchange Deduplicate OCA", "summary": """ Introduce a deduplication mechanism at the sending step""", - "version": "19.0.1.0.0", + "version": "19.0.1.1.0", "license": "LGPL-3", "author": "Camptocamp,Odoo Community Association (OCA)", "maintainers": ["simahawk", "etobella"], diff --git a/edi_exchange_deduplicate_oca/static/description/index.html b/edi_exchange_deduplicate_oca/static/description/index.html index fa8467761..69b2e9024 100644 --- a/edi_exchange_deduplicate_oca/static/description/index.html +++ b/edi_exchange_deduplicate_oca/static/description/index.html @@ -372,7 +372,7 @@

Edi Exchange Deduplicate OCA

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:5ef00f94671b13ecf11e3f038feeb08e23d9defadc7b41a3e57be05f86c975c3 +!! source digest: sha256:f5a7501a3960f60fb0869000e315e9d6bdb2e254682e5038d8603111d141f1b7 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

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

This module adds options for deduplication records before sending step