From 3e702300f92ce7f73d8d76f705a3703d016b26e1 Mon Sep 17 00:00:00 2001 From: duongtq Date: Mon, 25 Mar 2024 12:19:40 +0700 Subject: [PATCH 1/8] [ADD] edi_notification_oca --- edi_notification_oca/README.rst | 87 ++++ edi_notification_oca/__init__.py | 2 + edi_notification_oca/__manifest__.py | 17 + edi_notification_oca/components/__init__.py | 1 + edi_notification_oca/components/listener.py | 46 ++ .../data/mail_activity_data.xml | 12 + .../i18n/edi_notification_oca.pot | 150 ++++++ edi_notification_oca/models/__init__.py | 2 + .../models/edi_exchange_record.py | 11 + .../models/edi_exchange_type.py | 52 +++ edi_notification_oca/readme/CONTRIBUTORS.rst | 2 + edi_notification_oca/readme/CREDITS.rst | 1 + edi_notification_oca/readme/DESCRIPTION.rst | 1 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 435 ++++++++++++++++++ edi_notification_oca/tests/__init__.py | 1 + .../tests/test_edi_notification.py | 176 +++++++ .../views/edi_exchange_type_views.xml | 36 ++ 18 files changed, 1032 insertions(+) create mode 100644 edi_notification_oca/README.rst create mode 100644 edi_notification_oca/__init__.py create mode 100644 edi_notification_oca/__manifest__.py create mode 100644 edi_notification_oca/components/__init__.py create mode 100644 edi_notification_oca/components/listener.py create mode 100644 edi_notification_oca/data/mail_activity_data.xml create mode 100644 edi_notification_oca/i18n/edi_notification_oca.pot create mode 100644 edi_notification_oca/models/__init__.py create mode 100644 edi_notification_oca/models/edi_exchange_record.py create mode 100644 edi_notification_oca/models/edi_exchange_type.py create mode 100644 edi_notification_oca/readme/CONTRIBUTORS.rst create mode 100644 edi_notification_oca/readme/CREDITS.rst create mode 100644 edi_notification_oca/readme/DESCRIPTION.rst create mode 100644 edi_notification_oca/static/description/icon.png create mode 100644 edi_notification_oca/static/description/index.html create mode 100644 edi_notification_oca/tests/__init__.py create mode 100644 edi_notification_oca/tests/test_edi_notification.py create mode 100644 edi_notification_oca/views/edi_exchange_type_views.xml diff --git a/edi_notification_oca/README.rst b/edi_notification_oca/README.rst new file mode 100644 index 000000000..0953238f1 --- /dev/null +++ b/edi_notification_oca/README.rst @@ -0,0 +1,87 @@ +================ +EDI Notification +================ + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:d8651cf2a0e90d542e65ce8083a2bccffd0b1a3549867bb7a8e91843bd62a770 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png + :target: https://odoo-community.org/page/development-status + :alt: Alpha +.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png + :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fedi--framework-lightgray.png?logo=github + :target: https://github.com/OCA/edi-framework/tree/16.0/edi_notification_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_notification_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 provides sending notification feature when exchange record. + +.. IMPORTANT:: + This is an alpha version, the data model and design can change at any time without warning. + Only for development or testing purpose, do not use in production. + `More details on development status `_ + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us 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 +~~~~~~~~~~~~ + +* Duong (Tran Quoc) +* Simone Orsi + +Other credits +~~~~~~~~~~~~~ + +The creation of this module was financially supported by Camptocamp. + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/edi-framework `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/edi_notification_oca/__init__.py b/edi_notification_oca/__init__.py new file mode 100644 index 000000000..f24d3e242 --- /dev/null +++ b/edi_notification_oca/__init__.py @@ -0,0 +1,2 @@ +from . import components +from . import models diff --git a/edi_notification_oca/__manifest__.py b/edi_notification_oca/__manifest__.py new file mode 100644 index 000000000..f3696bc1d --- /dev/null +++ b/edi_notification_oca/__manifest__.py @@ -0,0 +1,17 @@ +# Copyright 2024 Camptocamp SA +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +{ + "name": "EDI Notification", + "summary": """Define notification activities on exchange records.""", + "version": "16.0.1.0.0", + "development_status": "Alpha", + "license": "LGPL-3", + "website": "https://github.com/OCA/edi-framework", + "author": "Camptocamp,Odoo Community Association (OCA)", + "depends": [ + "edi_oca", + ], + "data": ["data/mail_activity_data.xml", "views/edi_exchange_type_views.xml"], + "installable": True, +} diff --git a/edi_notification_oca/components/__init__.py b/edi_notification_oca/components/__init__.py new file mode 100644 index 000000000..9430369c2 --- /dev/null +++ b/edi_notification_oca/components/__init__.py @@ -0,0 +1 @@ +from . import listener diff --git a/edi_notification_oca/components/listener.py b/edi_notification_oca/components/listener.py new file mode 100644 index 000000000..4dcb9b138 --- /dev/null +++ b/edi_notification_oca/components/listener.py @@ -0,0 +1,46 @@ +# Copyright 2024 Camptocamp SA +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo import _ + +from odoo.addons.component.core import Component + + +class EdiNotificationListener(Component): + _name = "edi.notification.component.listener" + _inherit = "base.event.listener" + + def on_edi_exchange_error(self, record): + exc_type = record.type_id + notify_on_process_error = exc_type.notify_on_process_error + activity_type = exc_type.notify_on_process_error_activity_type_id + if ( + not notify_on_process_error + or not activity_type + or not ( + exc_type.notify_on_process_error_groups_ids + or exc_type.notify_on_process_error_users_ids + ) + ): + return True + users = self._get_users_to_notify(exc_type) + # Send notification to defined users + for user in users: + record.activity_schedule( + activity_type_id=activity_type.id, + summary=_( + "EDI: Process error on record '%(identifier)s'.", + identifier=record.identifier, + ), + note=record.exchange_error, + user_id=user.id, + automated=True, + ) + return True + + def _get_users_to_notify(self, exc_type): + exc_type.ensure_one() + return ( + exc_type.notify_on_process_error_groups_ids.users + | exc_type.notify_on_process_error_users_ids + ) diff --git a/edi_notification_oca/data/mail_activity_data.xml b/edi_notification_oca/data/mail_activity_data.xml new file mode 100644 index 000000000..1bf2c1c88 --- /dev/null +++ b/edi_notification_oca/data/mail_activity_data.xml @@ -0,0 +1,12 @@ + + + + EDI Exchange Record: Failed + fa-warning + edi.exchange.record + warning + + diff --git a/edi_notification_oca/i18n/edi_notification_oca.pot b/edi_notification_oca/i18n/edi_notification_oca.pot new file mode 100644 index 000000000..43162d14e --- /dev/null +++ b/edi_notification_oca/i18n/edi_notification_oca.pot @@ -0,0 +1,150 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * edi_notification_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_notification_oca +#: model:ir.model.fields,field_description:edi_notification_oca.field_edi_exchange_record__activity_ids +msgid "Activities" +msgstr "" + +#. module: edi_notification_oca +#: model:ir.model.fields,field_description:edi_notification_oca.field_edi_exchange_record__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "" + +#. module: edi_notification_oca +#: model:ir.model.fields,field_description:edi_notification_oca.field_edi_exchange_record__activity_state +msgid "Activity State" +msgstr "" + +#. module: edi_notification_oca +#: model:ir.model.fields,field_description:edi_notification_oca.field_edi_exchange_record__activity_type_icon +msgid "Activity Type Icon" +msgstr "" + +#. module: edi_notification_oca +#: model:ir.model.fields,field_description:edi_notification_oca.field_edi_exchange_type__notify_on_process_error_activity_type_id +msgid "Activity Type Used When Notify On Process Error" +msgstr "" + +#. module: edi_notification_oca +#: model:mail.activity.type,name:edi_notification_oca.mail_activity_failed_exchange_record_warning +msgid "EDI Exchange Record: Failed" +msgstr "" + +#. module: edi_notification_oca +#: model:ir.model,name:edi_notification_oca.model_edi_exchange_type +msgid "EDI Exchange Type" +msgstr "" + +#. module: edi_notification_oca +#: model:ir.model,name:edi_notification_oca.model_edi_exchange_record +msgid "EDI exchange Record" +msgstr "" + +#. module: edi_notification_oca +#. odoo-python +#: code:addons/edi_notification_oca/components/listener.py:0 +#, python-format +msgid "EDI: Process error on record '%(identifier)s'." +msgstr "" + +#. module: edi_notification_oca +#: model:ir.model.fields,help:edi_notification_oca.field_edi_exchange_record__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "" + +#. module: edi_notification_oca +#: model:ir.model.fields,field_description:edi_notification_oca.field_edi_exchange_record__activity_exception_icon +msgid "Icon" +msgstr "" + +#. module: edi_notification_oca +#: model:ir.model.fields,help:edi_notification_oca.field_edi_exchange_record__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "" + +#. module: edi_notification_oca +#: model:ir.model.fields,help:edi_notification_oca.field_edi_exchange_type__notify_on_process_error +msgid "" +"If an error happens on process, a notification will be sent to all selected " +"users. If active, please select the specific groups and specific users in " +"the 'Notifications' page." +msgstr "" + +#. module: edi_notification_oca +#: model:ir.model.fields,field_description:edi_notification_oca.field_edi_exchange_record__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "" + +#. module: edi_notification_oca +#: model:ir.model.fields,field_description:edi_notification_oca.field_edi_exchange_record__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "" + +#. module: edi_notification_oca +#: model:ir.model.fields,field_description:edi_notification_oca.field_edi_exchange_record__activity_summary +msgid "Next Activity Summary" +msgstr "" + +#. module: edi_notification_oca +#: model:ir.model.fields,field_description:edi_notification_oca.field_edi_exchange_record__activity_type_id +msgid "Next Activity Type" +msgstr "" + +#. module: edi_notification_oca +#: model_terms:ir.ui.view,arch_db:edi_notification_oca.edi_exchange_type_view_form +msgid "Notification" +msgstr "" + +#. module: edi_notification_oca +#: model:ir.model.fields,field_description:edi_notification_oca.field_edi_exchange_type__notify_on_process_error_groups_ids +msgid "Notify Groups On Process Error" +msgstr "" + +#. module: edi_notification_oca +#: model:ir.model.fields,field_description:edi_notification_oca.field_edi_exchange_type__notify_on_process_error +msgid "Notify On Process Error" +msgstr "" + +#. module: edi_notification_oca +#: model:ir.model.fields,field_description:edi_notification_oca.field_edi_exchange_type__notify_on_process_error_users_ids +msgid "Notify Users On Process Error" +msgstr "" + +#. module: edi_notification_oca +#: model:ir.model.fields,field_description:edi_notification_oca.field_edi_exchange_record__activity_user_id +msgid "Responsible User" +msgstr "" + +#. module: edi_notification_oca +#: model:ir.model.fields,help:edi_notification_oca.field_edi_exchange_type__notify_on_process_error_users_ids +msgid "" +"Select users to send notifications to. If 'Notification Groups' have been " +"selected, notifications will also be sent to users selected in here." +msgstr "" + +#. module: edi_notification_oca +#: model:ir.model.fields,help:edi_notification_oca.field_edi_exchange_record__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" + +#. module: edi_notification_oca +#: model:ir.model.fields,help:edi_notification_oca.field_edi_exchange_record__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "" diff --git a/edi_notification_oca/models/__init__.py b/edi_notification_oca/models/__init__.py new file mode 100644 index 000000000..6128f744d --- /dev/null +++ b/edi_notification_oca/models/__init__.py @@ -0,0 +1,2 @@ +from . import edi_exchange_type +from . import edi_exchange_record diff --git a/edi_notification_oca/models/edi_exchange_record.py b/edi_notification_oca/models/edi_exchange_record.py new file mode 100644 index 000000000..a1279f4aa --- /dev/null +++ b/edi_notification_oca/models/edi_exchange_record.py @@ -0,0 +1,11 @@ +# Copyright 2024 Camptocamp SA +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + + +from odoo import models + + +class EDIExchangeRecord(models.Model): + + _name = "edi.exchange.record" + _inherit = ["edi.exchange.record", "mail.activity.mixin"] diff --git a/edi_notification_oca/models/edi_exchange_type.py b/edi_notification_oca/models/edi_exchange_type.py new file mode 100644 index 000000000..037f430ee --- /dev/null +++ b/edi_notification_oca/models/edi_exchange_type.py @@ -0,0 +1,52 @@ +# Copyright 2024 Camptocamp SA +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + + +from odoo import api, fields, models + + +class EDIExchangeType(models.Model): + _inherit = "edi.exchange.type" + + notify_on_process_error = fields.Boolean( + help="If an error happens on process, a notification will be sent to all" + " selected users. If active, please select the specific groups and" + " specific users in the 'Notifications' page.", + default=False, + ) + notify_on_process_error_groups_ids = fields.Many2many( + comodel_name="res.groups", + string="Notify Groups On Process Error", + inverse="_inverse_notify_on_process_error_groups_users", + ) + notify_on_process_error_users_ids = fields.Many2many( + comodel_name="res.users", + string="Notify Users On Process Error", + inverse="_inverse_notify_on_process_error_groups_users", + help="Select users to send notifications to. If 'Notification Groups' " + "have been selected, notifications will also be sent to users selected in here.", + ) + notify_on_process_error_activity_type_id = fields.Many2one( + "mail.activity.type", + string="Activity Type Used When Notify On Process Error", + default=lambda self: self._default_notify_on_process_error_activity_type_id(), + ) + + def _default_notify_on_process_error_activity_type_id(self): + return self.env.ref( + "edi_notification_oca.mail_activity_failed_exchange_record_warning", False + ) + + @api.onchange("notify_on_process_error") + def _onchange_notify_on_process_error(self): + if not self.notify_on_process_error: + self.notify_on_process_error_groups_ids = None + self.notify_on_process_error_users_ids = None + + def _inverse_notify_on_process_error_groups_users(self): + for rec in self: + if ( + rec.notify_on_process_error_groups_ids + or rec.notify_on_process_error_users_ids + ): + rec.notify_on_process_error = True diff --git a/edi_notification_oca/readme/CONTRIBUTORS.rst b/edi_notification_oca/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..7b3f8625e --- /dev/null +++ b/edi_notification_oca/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Duong (Tran Quoc) +* Simone Orsi diff --git a/edi_notification_oca/readme/CREDITS.rst b/edi_notification_oca/readme/CREDITS.rst new file mode 100644 index 000000000..ac19123b0 --- /dev/null +++ b/edi_notification_oca/readme/CREDITS.rst @@ -0,0 +1 @@ +The creation of this module was financially supported by Camptocamp. diff --git a/edi_notification_oca/readme/DESCRIPTION.rst b/edi_notification_oca/readme/DESCRIPTION.rst new file mode 100644 index 000000000..46a845420 --- /dev/null +++ b/edi_notification_oca/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module provides sending notification feature when exchange record. diff --git a/edi_notification_oca/static/description/icon.png b/edi_notification_oca/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/edi_notification_oca/static/description/index.html b/edi_notification_oca/static/description/index.html new file mode 100644 index 000000000..4e9ce77a0 --- /dev/null +++ b/edi_notification_oca/static/description/index.html @@ -0,0 +1,435 @@ + + + + + +EDI Notification + + + +
+

EDI Notification

+ + +

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

+

This module provides sending notification feature when exchange record.

+
+

Important

+

This is an alpha version, the data model and design can change at any time without warning. +Only for development or testing purpose, do not use in production. +More details on development status

+
+

Table of contents

+ +
+

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

+ +
+
+

Other credits

+

The creation of this module was financially supported by Camptocamp.

+
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

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

+

This module is part of the OCA/edi-framework project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/edi_notification_oca/tests/__init__.py b/edi_notification_oca/tests/__init__.py new file mode 100644 index 000000000..ab8b6e8bd --- /dev/null +++ b/edi_notification_oca/tests/__init__.py @@ -0,0 +1 @@ +from . import test_edi_notification diff --git a/edi_notification_oca/tests/test_edi_notification.py b/edi_notification_oca/tests/test_edi_notification.py new file mode 100644 index 000000000..3e2e958a3 --- /dev/null +++ b/edi_notification_oca/tests/test_edi_notification.py @@ -0,0 +1,176 @@ +# Copyright 2024 Camptocamp SA +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + + +import base64 + +from odoo.tests.common import RecordCapturer + +from odoo.addons.edi_oca.tests.common import EDIBackendCommonComponentRegistryTestCase +from odoo.addons.edi_oca.tests.fake_components import FakeInputProcess + + +class TestEDINotification(EDIBackendCommonComponentRegistryTestCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls._setup_env() + cls._build_components( + cls, + FakeInputProcess, + ) + cls._load_module_components(cls, "edi_notification_oca") + vals = { + "model": cls.partner._name, + "res_id": cls.partner.id, + "exchange_file": base64.b64encode(b"1234"), + } + cls.record = cls.backend.create_record("test_csv_input", vals) + cls.group_portal = cls.env.ref("base.group_portal") + cls.user_a = cls._create_user(cls, "A") + cls.user_b = cls._create_user(cls, "B") + cls.user_c = cls._create_user(cls, "C") + + def setUp(self): + super().setUp() + FakeInputProcess.reset_faked() + + def _create_user(self, letter): + return ( + self.env["res.users"] + .with_context(no_reset_password=True) + .create( + { + "name": "User %s" % letter, + "login": "user_%s" % letter, + "groups_id": [(6, 0, [self.group_portal.id])], + } + ) + ) + + def test_inverse_notify_on_process_error(self): + self.exchange_type_in.notify_on_process_error = False + # If we forgot to enable notify_on_process_error + self.exchange_type_in.write( + { + "notify_on_process_error_groups_ids": [(6, 0, [self.group_portal.id])], + "notify_on_process_error_users_ids": [(6, 0, [self.user_c.id])], + } + ) + # Make sure notify_on_process_error should be enabled + self.assertTrue(self.exchange_type_in.notify_on_process_error) + + def test_dont_notify_on_process_error(self): + self.exchange_type_in.notify_on_process_error = False + self.record.write({"edi_exchange_state": "input_received"}) + self.record._set_file_content("TEST %d" % self.record.id) + with RecordCapturer(self.env["mail.activity"], []) as capture: + self.record.with_context( + test_break_process="OOPS! Something went wrong :(" + ).action_exchange_process() + self.assertRecordValues( + self.record, + [ + { + "edi_exchange_state": "input_processed_error", + } + ], + ) + self.assertIn("OOPS! Something went wrong :(", self.record.exchange_error) + # We don't expect any notification + self.assertEqual(len(capture.records), 0) + + def test_notify_on_process_error_to_group(self): + self.exchange_type_in.write( + { + "notify_on_process_error": True, + "notify_on_process_error_groups_ids": [(6, 0, [self.group_portal.id])], + } + ) + # Remove group on user C to test + self.user_c.groups_id = None + self.record.write({"edi_exchange_state": "input_received"}) + self.record._set_file_content("TEST %d" % self.record.id) + with RecordCapturer(self.env["mail.activity"], []) as capture: + self.record.with_context( + test_break_process="OOPS! Something went wrong :(" + ).action_exchange_process() + # Send notification to all users in defined groups when error + a_noti = capture.records.filtered(lambda x: x.user_id == self.user_a) + self.assertEqual(len(a_noti), 1) + self.assertEqual( + a_noti.summary, + f"EDI: Process error on record '{self.record.identifier}'.", + ) + self.assertIn( + "OOPS! Something went wrong :(", + a_noti.note, + ) + b_noti = capture.records.filtered(lambda x: x.user_id == self.user_b) + self.assertEqual(len(a_noti), 1) + self.assertEqual( + b_noti.summary, + f"EDI: Process error on record '{self.record.identifier}'.", + ) + self.assertIn( + "OOPS! Something went wrong :(", + b_noti.note, + ) + # We don't send notification to user C + # because C is not belonging to the group_portal + c_noti = capture.records.filtered(lambda x: x.user_id == self.user_c) + self.assertEqual(len(c_noti), 0) + + def test_notify_on_process_error_to_users(self): + self.exchange_type_in.write( + { + "notify_on_process_error": True, + "notify_on_process_error_users_ids": [(6, 0, [self.user_c.id])], + } + ) + self.record.write({"edi_exchange_state": "input_received"}) + self.record._set_file_content("TEST %d" % self.record.id) + with RecordCapturer(self.env["mail.activity"], []) as capture: + self.record.with_context( + test_break_process="OOPS! Something went wrong :(" + ).action_exchange_process() + # Send notification to all users in defined users when error + a_b_noti = capture.records.filtered( + lambda x: x.user_id in (self.user_a | self.user_b) + ) + self.assertEqual(len(a_b_noti), 0) + c_noti = capture.records.filtered(lambda x: x.user_id == self.user_c) + self.assertEqual(len(c_noti), 1) + self.assertEqual( + c_noti.summary, + f"EDI: Process error on record '{self.record.identifier}'.", + ) + self.assertIn( + "OOPS! Something went wrong :(", + c_noti.note, + ) + + def test_notify_on_process_error_to_groups_and_users(self): + self.exchange_type_in.write( + { + "notify_on_process_error": True, + "notify_on_process_error_groups_ids": [(6, 0, [self.group_portal.id])], + "notify_on_process_error_users_ids": [(6, 0, [self.user_c.id])], + } + ) + # Remove group on user C to test + self.user_c.groups_id = None + self.record.write({"edi_exchange_state": "input_received"}) + self.record._set_file_content("TEST %d" % self.record.id) + with RecordCapturer(self.env["mail.activity"], []) as capture: + self.record.with_context( + test_break_process="OOPS! Something went wrong :(" + ).action_exchange_process() + # Send notification to all users in defined users when error + a_b_noti = capture.records.filtered( + lambda x: x.user_id in (self.user_a | self.user_b) + ) + self.assertEqual(len(a_b_noti), 2) + # also send notification to user C + c_noti = capture.records.filtered(lambda x: x.user_id == self.user_c) + self.assertEqual(len(c_noti), 1) diff --git a/edi_notification_oca/views/edi_exchange_type_views.xml b/edi_notification_oca/views/edi_exchange_type_views.xml new file mode 100644 index 000000000..58da40517 --- /dev/null +++ b/edi_notification_oca/views/edi_exchange_type_views.xml @@ -0,0 +1,36 @@ + + + + edi.exchange.type + + + + + + + + + + + + + + + + + From 95c050098a4686a5d365aacc01a11e7dcbd9af42 Mon Sep 17 00:00:00 2001 From: mymage Date: Tue, 30 Jul 2024 12:13:25 +0000 Subject: [PATCH 2/8] Added translation using Weblate (Italian) --- edi_notification_oca/i18n/it.po | 163 ++++++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 edi_notification_oca/i18n/it.po diff --git a/edi_notification_oca/i18n/it.po b/edi_notification_oca/i18n/it.po new file mode 100644 index 000000000..5a02a680f --- /dev/null +++ b/edi_notification_oca/i18n/it.po @@ -0,0 +1,163 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * edi_notification_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-09-10 14:06+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_notification_oca +#: model:ir.model.fields,field_description:edi_notification_oca.field_edi_exchange_record__activity_ids +msgid "Activities" +msgstr "Attività" + +#. module: edi_notification_oca +#: model:ir.model.fields,field_description:edi_notification_oca.field_edi_exchange_record__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "Decorazione eccezione attività" + +#. module: edi_notification_oca +#: model:ir.model.fields,field_description:edi_notification_oca.field_edi_exchange_record__activity_state +msgid "Activity State" +msgstr "Stato attività" + +#. module: edi_notification_oca +#: model:ir.model.fields,field_description:edi_notification_oca.field_edi_exchange_record__activity_type_icon +msgid "Activity Type Icon" +msgstr "Icona tipo attività" + +#. module: edi_notification_oca +#: model:ir.model.fields,field_description:edi_notification_oca.field_edi_exchange_type__notify_on_process_error_activity_type_id +msgid "Activity Type Used When Notify On Process Error" +msgstr "Tipo attività utilizzata nelle notifiche di errori di processo" + +#. module: edi_notification_oca +#: model:mail.activity.type,name:edi_notification_oca.mail_activity_failed_exchange_record_warning +msgid "EDI Exchange Record: Failed" +msgstr "Record scambio EDI: fallito" + +#. module: edi_notification_oca +#: model:ir.model,name:edi_notification_oca.model_edi_exchange_type +msgid "EDI Exchange Type" +msgstr "Tipo scambio EDI" + +#. module: edi_notification_oca +#: model:ir.model,name:edi_notification_oca.model_edi_exchange_record +msgid "EDI exchange Record" +msgstr "Record di scambio EDI" + +#. module: edi_notification_oca +#. odoo-python +#: code:addons/edi_notification_oca/components/listener.py:0 +#, python-format +msgid "EDI: Process error on record '%(identifier)s'." +msgstr "EDI: errore di processo nel record '%(identifier)s'." + +#. module: edi_notification_oca +#: model:ir.model.fields,help:edi_notification_oca.field_edi_exchange_record__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "Icona Font Awesome es. fa-tasks" + +#. module: edi_notification_oca +#: model:ir.model.fields,field_description:edi_notification_oca.field_edi_exchange_record__activity_exception_icon +msgid "Icon" +msgstr "Icona" + +#. module: edi_notification_oca +#: model:ir.model.fields,help:edi_notification_oca.field_edi_exchange_record__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "Icona per indicare un'attività eccezione." + +#. module: edi_notification_oca +#: model:ir.model.fields,help:edi_notification_oca.field_edi_exchange_type__notify_on_process_error +msgid "" +"If an error happens on process, a notification will be sent to all selected " +"users. If active, please select the specific groups and specific users in " +"the 'Notifications' page." +msgstr "" +"Se si verifica un errore durante il processo, verrà inviata una notifica a " +"tutti gli utenti selezionati. Se attiva, selezionare i gruppi e gli utenti " +"specifici nella pagina \"Notifiche\"." + +#. module: edi_notification_oca +#: model:ir.model.fields,field_description:edi_notification_oca.field_edi_exchange_record__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "Scadenza mia attività" + +#. module: edi_notification_oca +#: model:ir.model.fields,field_description:edi_notification_oca.field_edi_exchange_record__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "Scadenza prossima attività" + +#. module: edi_notification_oca +#: model:ir.model.fields,field_description:edi_notification_oca.field_edi_exchange_record__activity_summary +msgid "Next Activity Summary" +msgstr "Riepilogo prossima attività" + +#. module: edi_notification_oca +#: model:ir.model.fields,field_description:edi_notification_oca.field_edi_exchange_record__activity_type_id +msgid "Next Activity Type" +msgstr "Tipo prossima attività" + +#. module: edi_notification_oca +#: model_terms:ir.ui.view,arch_db:edi_notification_oca.edi_exchange_type_view_form +msgid "Notification" +msgstr "Notifica" + +#. module: edi_notification_oca +#: model:ir.model.fields,field_description:edi_notification_oca.field_edi_exchange_type__notify_on_process_error_groups_ids +msgid "Notify Groups On Process Error" +msgstr "Avvisa i gruppi all'errore di processo" + +#. module: edi_notification_oca +#: model:ir.model.fields,field_description:edi_notification_oca.field_edi_exchange_type__notify_on_process_error +msgid "Notify On Process Error" +msgstr "Avvisa all'errore di processo" + +#. module: edi_notification_oca +#: model:ir.model.fields,field_description:edi_notification_oca.field_edi_exchange_type__notify_on_process_error_users_ids +msgid "Notify Users On Process Error" +msgstr "Avvisa gli utenti all'errore di processo" + +#. module: edi_notification_oca +#: model:ir.model.fields,field_description:edi_notification_oca.field_edi_exchange_record__activity_user_id +msgid "Responsible User" +msgstr "Utente responsabile" + +#. module: edi_notification_oca +#: model:ir.model.fields,help:edi_notification_oca.field_edi_exchange_type__notify_on_process_error_users_ids +msgid "" +"Select users to send notifications to. If 'Notification Groups' have been " +"selected, notifications will also be sent to users selected in here." +msgstr "" +"Seleziona gli utenti a cui inviare le notifiche. Se sono stati selezionati " +"'Gruppi di notifica', le notifiche saranno inviate anche agli utenti " +"selezionati qui." + +#. module: edi_notification_oca +#: model:ir.model.fields,help:edi_notification_oca.field_edi_exchange_record__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" +"Stato in base alle attività\n" +"Scaduto: la data richiesta è trascorsa\n" +"Oggi: la data attività è oggi\n" +"Pianificato: attività future." + +#. module: edi_notification_oca +#: model:ir.model.fields,help:edi_notification_oca.field_edi_exchange_record__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "Tipo di attività eccezione sul record." From 6ec7c67f3538181bf6f81160b2dc86cde1527306 Mon Sep 17 00:00:00 2001 From: SilvioC2C Date: Wed, 18 Mar 2026 15:46:37 +0100 Subject: [PATCH 3/8] [IMP] edi_notification_oca: pre-commit auto fixes --- edi_notification_oca/README.rst | 22 +++++++++---------- .../data/mail_activity_data.xml | 12 +++++----- .../models/edi_exchange_record.py | 1 - edi_notification_oca/pyproject.toml | 3 +++ edi_notification_oca/readme/CONTRIBUTORS.md | 2 ++ edi_notification_oca/readme/CONTRIBUTORS.rst | 2 -- .../readme/{CREDITS.rst => CREDITS.md} | 0 .../{DESCRIPTION.rst => DESCRIPTION.md} | 0 .../static/description/index.html | 6 ++--- 9 files changed, 25 insertions(+), 23 deletions(-) create mode 100644 edi_notification_oca/pyproject.toml create mode 100644 edi_notification_oca/readme/CONTRIBUTORS.md delete mode 100644 edi_notification_oca/readme/CONTRIBUTORS.rst rename edi_notification_oca/readme/{CREDITS.rst => CREDITS.md} (100%) rename edi_notification_oca/readme/{DESCRIPTION.rst => DESCRIPTION.md} (100%) diff --git a/edi_notification_oca/README.rst b/edi_notification_oca/README.rst index 0953238f1..3ea1c4c32 100644 --- a/edi_notification_oca/README.rst +++ b/edi_notification_oca/README.rst @@ -17,13 +17,13 @@ EDI Notification :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_notification_oca + :target: https://github.com/OCA/edi-framework/tree/18.0/edi_notification_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_notification_oca + :target: https://translation.odoo-community.org/projects/edi-framework-18-0/edi-framework-18-0-edi_notification_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| @@ -46,7 +46,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. @@ -54,23 +54,23 @@ Credits ======= Authors -~~~~~~~ +------- * Camptocamp Contributors -~~~~~~~~~~~~ +------------ -* Duong (Tran Quoc) -* Simone Orsi +- Duong (Tran Quoc) +- Simone Orsi Other credits -~~~~~~~~~~~~~ +------------- The creation of this module was financially supported by Camptocamp. Maintainers -~~~~~~~~~~~ +----------- This module is maintained by the OCA. @@ -82,6 +82,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/edi-framework `_ project on GitHub. +This module is part of the `OCA/edi-framework `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/edi_notification_oca/data/mail_activity_data.xml b/edi_notification_oca/data/mail_activity_data.xml index 1bf2c1c88..7fa92c0d4 100644 --- a/edi_notification_oca/data/mail_activity_data.xml +++ b/edi_notification_oca/data/mail_activity_data.xml @@ -1,12 +1,12 @@ - - EDI Exchange Record: Failed - fa-warning - edi.exchange.record - warning - + EDI Exchange Record: Failed + fa-warning + edi.exchange.record + warning + diff --git a/edi_notification_oca/models/edi_exchange_record.py b/edi_notification_oca/models/edi_exchange_record.py index a1279f4aa..629c7c4df 100644 --- a/edi_notification_oca/models/edi_exchange_record.py +++ b/edi_notification_oca/models/edi_exchange_record.py @@ -6,6 +6,5 @@ class EDIExchangeRecord(models.Model): - _name = "edi.exchange.record" _inherit = ["edi.exchange.record", "mail.activity.mixin"] diff --git a/edi_notification_oca/pyproject.toml b/edi_notification_oca/pyproject.toml new file mode 100644 index 000000000..4231d0ccc --- /dev/null +++ b/edi_notification_oca/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/edi_notification_oca/readme/CONTRIBUTORS.md b/edi_notification_oca/readme/CONTRIBUTORS.md new file mode 100644 index 000000000..289708028 --- /dev/null +++ b/edi_notification_oca/readme/CONTRIBUTORS.md @@ -0,0 +1,2 @@ +- Duong (Tran Quoc) \<\> +- Simone Orsi \<\> diff --git a/edi_notification_oca/readme/CONTRIBUTORS.rst b/edi_notification_oca/readme/CONTRIBUTORS.rst deleted file mode 100644 index 7b3f8625e..000000000 --- a/edi_notification_oca/readme/CONTRIBUTORS.rst +++ /dev/null @@ -1,2 +0,0 @@ -* Duong (Tran Quoc) -* Simone Orsi diff --git a/edi_notification_oca/readme/CREDITS.rst b/edi_notification_oca/readme/CREDITS.md similarity index 100% rename from edi_notification_oca/readme/CREDITS.rst rename to edi_notification_oca/readme/CREDITS.md diff --git a/edi_notification_oca/readme/DESCRIPTION.rst b/edi_notification_oca/readme/DESCRIPTION.md similarity index 100% rename from edi_notification_oca/readme/DESCRIPTION.rst rename to edi_notification_oca/readme/DESCRIPTION.md diff --git a/edi_notification_oca/static/description/index.html b/edi_notification_oca/static/description/index.html index 4e9ce77a0..e1cd25ca1 100644 --- a/edi_notification_oca/static/description/index.html +++ b/edi_notification_oca/static/description/index.html @@ -369,7 +369,7 @@

EDI Notification

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:d8651cf2a0e90d542e65ce8083a2bccffd0b1a3549867bb7a8e91843bd62a770 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

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

+

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

This module provides sending notification feature when exchange record.

Important

@@ -395,7 +395,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.

@@ -426,7 +426,7 @@

Maintainers

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

-

This module is part of the OCA/edi-framework project on GitHub.

+

This module is part of the OCA/edi-framework project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

From 71ad11ec61efdc2fd5e5b8ff527f1f18d37df110 Mon Sep 17 00:00:00 2001 From: SilvioC2C Date: Wed, 18 Mar 2026 16:02:55 +0100 Subject: [PATCH 4/8] [MIG] edi_notification_oca: Migration to 18.0 --- edi_notification_oca/README.rst | 30 ++++++++---- edi_notification_oca/__manifest__.py | 9 ++-- edi_notification_oca/components/listener.py | 4 +- ...tivity_data.xml => mail_activity_type.xml} | 0 .../i18n/edi_notification_oca.pot | 3 +- .../models/edi_exchange_record.py | 1 - .../models/edi_exchange_type.py | 6 +-- edi_notification_oca/readme/CREDITS.md | 1 - edi_notification_oca/readme/DESCRIPTION.md | 11 ++++- .../static/description/index.html | 46 ++++++++++++------- .../tests/test_edi_notification.py | 17 +++---- ...e_type_views.xml => edi_exchange_type.xml} | 8 ++-- 12 files changed, 81 insertions(+), 55 deletions(-) rename edi_notification_oca/data/{mail_activity_data.xml => mail_activity_type.xml} (100%) delete mode 100644 edi_notification_oca/readme/CREDITS.md rename edi_notification_oca/views/{edi_exchange_type_views.xml => edi_exchange_type.xml} (75%) diff --git a/edi_notification_oca/README.rst b/edi_notification_oca/README.rst index 3ea1c4c32..3c08c4141 100644 --- a/edi_notification_oca/README.rst +++ b/edi_notification_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 Notification ================ @@ -7,13 +11,13 @@ EDI Notification !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:d8651cf2a0e90d542e65ce8083a2bccffd0b1a3549867bb7a8e91843bd62a770 + !! source digest: sha256:d865a9ca8287a26c0e9185d73c56951401b600d75381622a3f3474f5ee2c0992 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png :target: https://odoo-community.org/page/development-status :alt: Alpha -.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png +.. |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 @@ -28,7 +32,18 @@ EDI Notification |badge1| |badge2| |badge3| |badge4| |badge5| -This module provides sending notification feature when exchange record. +This module creates activities for users when an exchange record's +process fails. + +Exchange types must be configured properly to create such activities: + +- field "Notify On Process Error" must be checked to activate the + feature for the current exchange type +- field "Activity Type Used When Notify On Process Error" is used to + define the type of the newly created activity +- fields "Notify Groups On Process Error" and "Notify Users On Process + Error" are used to define the users that will be assigned to the newly + created activity .. IMPORTANT:: This is an alpha version, the data model and design can change at any time without warning. @@ -61,13 +76,8 @@ Authors Contributors ------------ -- Duong (Tran Quoc) -- Simone Orsi - -Other credits -------------- - -The creation of this module was financially supported by Camptocamp. +- Duong (Tran Quoc) +- Simone Orsi Maintainers ----------- diff --git a/edi_notification_oca/__manifest__.py b/edi_notification_oca/__manifest__.py index f3696bc1d..5fc8183f9 100644 --- a/edi_notification_oca/__manifest__.py +++ b/edi_notification_oca/__manifest__.py @@ -4,14 +4,13 @@ { "name": "EDI Notification", "summary": """Define notification activities on exchange records.""", - "version": "16.0.1.0.0", + "version": "18.0.1.0.0", "development_status": "Alpha", "license": "LGPL-3", "website": "https://github.com/OCA/edi-framework", "author": "Camptocamp,Odoo Community Association (OCA)", - "depends": [ - "edi_oca", - ], - "data": ["data/mail_activity_data.xml", "views/edi_exchange_type_views.xml"], + # TODO v19: consider getting rid off `edi_component_oca` dep + "depends": ["edi_core_oca", "edi_component_oca"], + "data": ["data/mail_activity_type.xml", "views/edi_exchange_type.xml"], "installable": True, } diff --git a/edi_notification_oca/components/listener.py b/edi_notification_oca/components/listener.py index 4dcb9b138..30945e128 100644 --- a/edi_notification_oca/components/listener.py +++ b/edi_notification_oca/components/listener.py @@ -1,8 +1,6 @@ # Copyright 2024 Camptocamp SA # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). -from odoo import _ - from odoo.addons.component.core import Component @@ -28,7 +26,7 @@ def on_edi_exchange_error(self, record): for user in users: record.activity_schedule( activity_type_id=activity_type.id, - summary=_( + summary=self.env._( "EDI: Process error on record '%(identifier)s'.", identifier=record.identifier, ), diff --git a/edi_notification_oca/data/mail_activity_data.xml b/edi_notification_oca/data/mail_activity_type.xml similarity index 100% rename from edi_notification_oca/data/mail_activity_data.xml rename to edi_notification_oca/data/mail_activity_type.xml diff --git a/edi_notification_oca/i18n/edi_notification_oca.pot b/edi_notification_oca/i18n/edi_notification_oca.pot index 43162d14e..f31e62e4a 100644 --- a/edi_notification_oca/i18n/edi_notification_oca.pot +++ b/edi_notification_oca/i18n/edi_notification_oca.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 16.0\n" +"Project-Id-Version: Odoo Server 18.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -56,7 +56,6 @@ msgstr "" #. module: edi_notification_oca #. odoo-python #: code:addons/edi_notification_oca/components/listener.py:0 -#, python-format msgid "EDI: Process error on record '%(identifier)s'." msgstr "" diff --git a/edi_notification_oca/models/edi_exchange_record.py b/edi_notification_oca/models/edi_exchange_record.py index 629c7c4df..e6b48bc68 100644 --- a/edi_notification_oca/models/edi_exchange_record.py +++ b/edi_notification_oca/models/edi_exchange_record.py @@ -1,7 +1,6 @@ # Copyright 2024 Camptocamp SA # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). - from odoo import models diff --git a/edi_notification_oca/models/edi_exchange_type.py b/edi_notification_oca/models/edi_exchange_type.py index 037f430ee..3f29d606e 100644 --- a/edi_notification_oca/models/edi_exchange_type.py +++ b/edi_notification_oca/models/edi_exchange_type.py @@ -1,7 +1,6 @@ # Copyright 2024 Camptocamp SA # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). - from odoo import api, fields, models @@ -23,8 +22,9 @@ class EDIExchangeType(models.Model): comodel_name="res.users", string="Notify Users On Process Error", inverse="_inverse_notify_on_process_error_groups_users", - help="Select users to send notifications to. If 'Notification Groups' " - "have been selected, notifications will also be sent to users selected in here.", + help="Select users to send notifications to." + " If 'Notification Groups' have been selected, notifications will also be sent" + " to users selected in here.", ) notify_on_process_error_activity_type_id = fields.Many2one( "mail.activity.type", diff --git a/edi_notification_oca/readme/CREDITS.md b/edi_notification_oca/readme/CREDITS.md deleted file mode 100644 index ac19123b0..000000000 --- a/edi_notification_oca/readme/CREDITS.md +++ /dev/null @@ -1 +0,0 @@ -The creation of this module was financially supported by Camptocamp. diff --git a/edi_notification_oca/readme/DESCRIPTION.md b/edi_notification_oca/readme/DESCRIPTION.md index 46a845420..3f250b798 100644 --- a/edi_notification_oca/readme/DESCRIPTION.md +++ b/edi_notification_oca/readme/DESCRIPTION.md @@ -1 +1,10 @@ -This module provides sending notification feature when exchange record. +This module creates activities for users when an exchange record's process fails. + +Exchange types must be configured properly to create such activities: + +- field "Notify On Process Error" must be checked to activate the feature + for the current exchange type +- field "Activity Type Used When Notify On Process Error" is used to define + the type of the newly created activity +- fields "Notify Groups On Process Error" and "Notify Users On Process Error" are used + to define the users that will be assigned to the newly created activity diff --git a/edi_notification_oca/static/description/index.html b/edi_notification_oca/static/description/index.html index e1cd25ca1..cbf2538dc 100644 --- a/edi_notification_oca/static/description/index.html +++ b/edi_notification_oca/static/description/index.html @@ -3,7 +3,7 @@ -EDI Notification +README.rst -
-

EDI Notification

+
+ + +Odoo Community Association + +
+

EDI Notification

-

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

-

This module provides sending notification feature when exchange record.

+

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

+

This module creates activities for users when an exchange record’s +process fails.

+

Exchange types must be configured properly to create such activities:

+
    +
  • field “Notify On Process Error” must be checked to activate the +feature for the current exchange type
  • +
  • field “Activity Type Used When Notify On Process Error” is used to +define the type of the newly created activity
  • +
  • fields “Notify Groups On Process Error” and “Notify Users On Process +Error” are used to define the users that will be assigned to the newly +created activity
  • +

Important

This is an alpha version, the data model and design can change at any time without warning. @@ -384,14 +400,13 @@

EDI Notification

  • Credits
  • -

    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 @@ -399,26 +414,22 @@

    Bug Tracker

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

    -

    Credits

    +

    Credits

    -

    Authors

    +

    Authors

    • Camptocamp
    -
    -

    Other credits

    -

    The creation of this module was financially supported by Camptocamp.

    -
    -

    Maintainers

    +

    Maintainers

    This module is maintained by the OCA.

    Odoo Community Association @@ -431,5 +442,6 @@

    Maintainers

    +
    diff --git a/edi_notification_oca/tests/test_edi_notification.py b/edi_notification_oca/tests/test_edi_notification.py index 3e2e958a3..cd9ee4f88 100644 --- a/edi_notification_oca/tests/test_edi_notification.py +++ b/edi_notification_oca/tests/test_edi_notification.py @@ -27,23 +27,24 @@ def setUpClass(cls): } cls.record = cls.backend.create_record("test_csv_input", vals) cls.group_portal = cls.env.ref("base.group_portal") - cls.user_a = cls._create_user(cls, "A") - cls.user_b = cls._create_user(cls, "B") - cls.user_c = cls._create_user(cls, "C") + cls.user_a = cls._create_user("A") + cls.user_b = cls._create_user("B") + cls.user_c = cls._create_user("C") def setUp(self): super().setUp() FakeInputProcess.reset_faked() - def _create_user(self, letter): + @classmethod + def _create_user(cls, letter: str): return ( - self.env["res.users"] + cls.env["res.users"] .with_context(no_reset_password=True) .create( { - "name": "User %s" % letter, - "login": "user_%s" % letter, - "groups_id": [(6, 0, [self.group_portal.id])], + "name": f"User {letter}", + "login": f"user_{letter}", + "groups_id": [(6, 0, [cls.group_portal.id])], } ) ) diff --git a/edi_notification_oca/views/edi_exchange_type_views.xml b/edi_notification_oca/views/edi_exchange_type.xml similarity index 75% rename from edi_notification_oca/views/edi_exchange_type_views.xml rename to edi_notification_oca/views/edi_exchange_type.xml index 58da40517..e052b6eb5 100644 --- a/edi_notification_oca/views/edi_exchange_type_views.xml +++ b/edi_notification_oca/views/edi_exchange_type.xml @@ -11,22 +11,22 @@ From 58684e503a81ff7dae337f46c942d347fc0d48bd Mon Sep 17 00:00:00 2001 From: Ricardoalso Date: Thu, 4 Jun 2026 15:20:06 +0200 Subject: [PATCH 5/8] [MIG] edi_notification_oca: Migration to 19.0 --- edi_notification_oca/README.rst | 10 +- edi_notification_oca/__manifest__.py | 2 +- .../models/edi_exchange_type.py | 6 +- .../static/description/index.html | 6 +- .../tests/test_edi_notification.py | 98 +++++++------------ .../views/edi_exchange_type.xml | 2 +- 6 files changed, 46 insertions(+), 78 deletions(-) diff --git a/edi_notification_oca/README.rst b/edi_notification_oca/README.rst index 3c08c4141..f48e886c3 100644 --- a/edi_notification_oca/README.rst +++ b/edi_notification_oca/README.rst @@ -21,13 +21,13 @@ EDI Notification :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_notification_oca + :target: https://github.com/OCA/edi-framework/tree/19.0/edi_notification_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_notification_oca + :target: https://translation.odoo-community.org/projects/edi-framework-19-0/edi-framework-19-0-edi_notification_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| @@ -61,7 +61,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. @@ -92,6 +92,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/edi-framework `_ project on GitHub. +This module is part of the `OCA/edi-framework `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/edi_notification_oca/__manifest__.py b/edi_notification_oca/__manifest__.py index 5fc8183f9..f5e6320ac 100644 --- a/edi_notification_oca/__manifest__.py +++ b/edi_notification_oca/__manifest__.py @@ -4,7 +4,7 @@ { "name": "EDI Notification", "summary": """Define notification activities on exchange records.""", - "version": "18.0.1.0.0", + "version": "19.0.1.0.0", "development_status": "Alpha", "license": "LGPL-3", "website": "https://github.com/OCA/edi-framework", diff --git a/edi_notification_oca/models/edi_exchange_type.py b/edi_notification_oca/models/edi_exchange_type.py index 3f29d606e..bbe2781cf 100644 --- a/edi_notification_oca/models/edi_exchange_type.py +++ b/edi_notification_oca/models/edi_exchange_type.py @@ -1,7 +1,7 @@ # Copyright 2024 Camptocamp SA # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). -from odoo import api, fields, models +from odoo import Command, api, fields, models class EDIExchangeType(models.Model): @@ -40,8 +40,8 @@ def _default_notify_on_process_error_activity_type_id(self): @api.onchange("notify_on_process_error") def _onchange_notify_on_process_error(self): if not self.notify_on_process_error: - self.notify_on_process_error_groups_ids = None - self.notify_on_process_error_users_ids = None + self.notify_on_process_error_groups_ids = [Command.clear()] + self.notify_on_process_error_users_ids = [Command.clear()] def _inverse_notify_on_process_error_groups_users(self): for rec in self: diff --git a/edi_notification_oca/static/description/index.html b/edi_notification_oca/static/description/index.html index cbf2538dc..7ccfe601a 100644 --- a/edi_notification_oca/static/description/index.html +++ b/edi_notification_oca/static/description/index.html @@ -374,7 +374,7 @@

    EDI Notification

    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:d865a9ca8287a26c0e9185d73c56951401b600d75381622a3f3474f5ee2c0992 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

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

    +

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

    This module creates activities for users when an exchange record’s process fails.

    Exchange types must be configured properly to create such activities:

    @@ -410,7 +410,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.

    @@ -437,7 +437,7 @@

    Maintainers

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

    -

    This module is part of the OCA/edi-framework project on GitHub.

    +

    This module is part of the OCA/edi-framework project on GitHub.

    You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

    diff --git a/edi_notification_oca/tests/test_edi_notification.py b/edi_notification_oca/tests/test_edi_notification.py index cd9ee4f88..d78c7e5d9 100644 --- a/edi_notification_oca/tests/test_edi_notification.py +++ b/edi_notification_oca/tests/test_edi_notification.py @@ -4,22 +4,17 @@ import base64 +from odoo import Command from odoo.tests.common import RecordCapturer -from odoo.addons.edi_oca.tests.common import EDIBackendCommonComponentRegistryTestCase -from odoo.addons.edi_oca.tests.fake_components import FakeInputProcess +from odoo.addons.edi_core_oca.tests.common import EDIBackendCommonTestCase -class TestEDINotification(EDIBackendCommonComponentRegistryTestCase): +class TestEDINotification(EDIBackendCommonTestCase): @classmethod def setUpClass(cls): super().setUpClass() cls._setup_env() - cls._build_components( - cls, - FakeInputProcess, - ) - cls._load_module_components(cls, "edi_notification_oca") vals = { "model": cls.partner._name, "res_id": cls.partner.id, @@ -31,10 +26,6 @@ def setUpClass(cls): cls.user_b = cls._create_user("B") cls.user_c = cls._create_user("C") - def setUp(self): - super().setUp() - FakeInputProcess.reset_faked() - @classmethod def _create_user(cls, letter: str): return ( @@ -44,18 +35,24 @@ def _create_user(cls, letter: str): { "name": f"User {letter}", "login": f"user_{letter}", - "groups_id": [(6, 0, [cls.group_portal.id])], + "group_ids": [Command.set([cls.group_portal.id])], } ) ) + def _trigger_process_error(self, message="OOPS! Something went wrong :("): + self.record.exchange_error = message + self.record._notify_error("process_ko") + def test_inverse_notify_on_process_error(self): self.exchange_type_in.notify_on_process_error = False # If we forgot to enable notify_on_process_error self.exchange_type_in.write( { - "notify_on_process_error_groups_ids": [(6, 0, [self.group_portal.id])], - "notify_on_process_error_users_ids": [(6, 0, [self.user_c.id])], + "notify_on_process_error_groups_ids": [ + Command.set([self.group_portal.id]) + ], + "notify_on_process_error_users_ids": [Command.set([self.user_c.id])], } ) # Make sure notify_on_process_error should be enabled @@ -63,20 +60,8 @@ def test_inverse_notify_on_process_error(self): def test_dont_notify_on_process_error(self): self.exchange_type_in.notify_on_process_error = False - self.record.write({"edi_exchange_state": "input_received"}) - self.record._set_file_content("TEST %d" % self.record.id) with RecordCapturer(self.env["mail.activity"], []) as capture: - self.record.with_context( - test_break_process="OOPS! Something went wrong :(" - ).action_exchange_process() - self.assertRecordValues( - self.record, - [ - { - "edi_exchange_state": "input_processed_error", - } - ], - ) + self._trigger_process_error() self.assertIn("OOPS! Something went wrong :(", self.record.exchange_error) # We don't expect any notification self.assertEqual(len(capture.records), 0) @@ -85,40 +70,32 @@ def test_notify_on_process_error_to_group(self): self.exchange_type_in.write( { "notify_on_process_error": True, - "notify_on_process_error_groups_ids": [(6, 0, [self.group_portal.id])], + "notify_on_process_error_groups_ids": [ + Command.set([self.group_portal.id]) + ], } ) # Remove group on user C to test - self.user_c.groups_id = None - self.record.write({"edi_exchange_state": "input_received"}) - self.record._set_file_content("TEST %d" % self.record.id) + self.user_c.group_ids = [Command.clear()] with RecordCapturer(self.env["mail.activity"], []) as capture: - self.record.with_context( - test_break_process="OOPS! Something went wrong :(" - ).action_exchange_process() - # Send notification to all users in defined groups when error + # Send notification to all users in defined groups when error + self._trigger_process_error() a_noti = capture.records.filtered(lambda x: x.user_id == self.user_a) self.assertEqual(len(a_noti), 1) self.assertEqual( a_noti.summary, f"EDI: Process error on record '{self.record.identifier}'.", ) - self.assertIn( - "OOPS! Something went wrong :(", - a_noti.note, - ) + self.assertIn("OOPS! Something went wrong :(", a_noti.note) b_noti = capture.records.filtered(lambda x: x.user_id == self.user_b) - self.assertEqual(len(a_noti), 1) + self.assertEqual(len(b_noti), 1) self.assertEqual( b_noti.summary, f"EDI: Process error on record '{self.record.identifier}'.", ) - self.assertIn( - "OOPS! Something went wrong :(", - b_noti.note, - ) # We don't send notification to user C # because C is not belonging to the group_portal + self.assertIn("OOPS! Something went wrong :(", b_noti.note) c_noti = capture.records.filtered(lambda x: x.user_id == self.user_c) self.assertEqual(len(c_noti), 0) @@ -126,16 +103,12 @@ def test_notify_on_process_error_to_users(self): self.exchange_type_in.write( { "notify_on_process_error": True, - "notify_on_process_error_users_ids": [(6, 0, [self.user_c.id])], + "notify_on_process_error_users_ids": [Command.set([self.user_c.id])], } ) - self.record.write({"edi_exchange_state": "input_received"}) - self.record._set_file_content("TEST %d" % self.record.id) with RecordCapturer(self.env["mail.activity"], []) as capture: - self.record.with_context( - test_break_process="OOPS! Something went wrong :(" - ).action_exchange_process() - # Send notification to all users in defined users when error + # Send notification to all users in defined users when error + self._trigger_process_error() a_b_noti = capture.records.filtered( lambda x: x.user_id in (self.user_a | self.user_b) ) @@ -146,28 +119,23 @@ def test_notify_on_process_error_to_users(self): c_noti.summary, f"EDI: Process error on record '{self.record.identifier}'.", ) - self.assertIn( - "OOPS! Something went wrong :(", - c_noti.note, - ) + self.assertIn("OOPS! Something went wrong :(", c_noti.note) def test_notify_on_process_error_to_groups_and_users(self): self.exchange_type_in.write( { "notify_on_process_error": True, - "notify_on_process_error_groups_ids": [(6, 0, [self.group_portal.id])], - "notify_on_process_error_users_ids": [(6, 0, [self.user_c.id])], + "notify_on_process_error_groups_ids": [ + Command.set([self.group_portal.id]) + ], + "notify_on_process_error_users_ids": [Command.set([self.user_c.id])], } ) # Remove group on user C to test - self.user_c.groups_id = None - self.record.write({"edi_exchange_state": "input_received"}) - self.record._set_file_content("TEST %d" % self.record.id) + self.user_c.group_ids = [Command.clear()] with RecordCapturer(self.env["mail.activity"], []) as capture: - self.record.with_context( - test_break_process="OOPS! Something went wrong :(" - ).action_exchange_process() - # Send notification to all users in defined users when error + # Send notification to all users in defined users when error + self._trigger_process_error() a_b_noti = capture.records.filtered( lambda x: x.user_id in (self.user_a | self.user_b) ) diff --git a/edi_notification_oca/views/edi_exchange_type.xml b/edi_notification_oca/views/edi_exchange_type.xml index e052b6eb5..058cf7311 100644 --- a/edi_notification_oca/views/edi_exchange_type.xml +++ b/edi_notification_oca/views/edi_exchange_type.xml @@ -2,7 +2,7 @@ edi.exchange.type - + From 9a6388fd8e49b904e6b8866b96d505f3831c76b6 Mon Sep 17 00:00:00 2001 From: Ricardoalso Date: Thu, 4 Jun 2026 16:12:01 +0200 Subject: [PATCH 6/8] [REF] edi_notification_oca: getting rid of edi_component_oca dependency --- edi_notification_oca/README.rst | 21 +++++++++ edi_notification_oca/__init__.py | 1 - edi_notification_oca/__manifest__.py | 9 ++-- edi_notification_oca/components/__init__.py | 1 - edi_notification_oca/components/listener.py | 44 ------------------- .../data/edi_configuration.xml | 20 +++++++++ edi_notification_oca/models/__init__.py | 1 + .../models/edi_exchange_type.py | 20 +++++++++ .../models/edi_notification_tool.py | 38 ++++++++++++++++ edi_notification_oca/readme/CONFIGURE.md | 12 +++++ edi_notification_oca/readme/DESCRIPTION.md | 3 ++ .../static/description/index.html | 39 +++++++++++----- 12 files changed, 150 insertions(+), 59 deletions(-) delete mode 100644 edi_notification_oca/components/__init__.py delete mode 100644 edi_notification_oca/components/listener.py create mode 100644 edi_notification_oca/data/edi_configuration.xml create mode 100644 edi_notification_oca/models/edi_notification_tool.py create mode 100644 edi_notification_oca/readme/CONFIGURE.md diff --git a/edi_notification_oca/README.rst b/edi_notification_oca/README.rst index f48e886c3..7ffc46d52 100644 --- a/edi_notification_oca/README.rst +++ b/edi_notification_oca/README.rst @@ -35,6 +35,10 @@ EDI Notification This module creates activities for users when an exchange record's process fails. +It also installs an ``edi.configuration`` rule +(``Notify Users On Exchange Error``) that calls +``edi.notification.tool`` on process errors. + Exchange types must be configured properly to create such activities: - field "Notify On Process Error" must be checked to activate the @@ -55,6 +59,23 @@ Exchange types must be configured properly to create such activities: .. contents:: :local: +Configuration +============= + +The module provides an ``edi.configuration`` entry named +``Notify Users On Exchange Error``. + +You can review or adapt this configuration under EDI configurations if +you need to change the trigger behavior or the executed snippets. + +To enable notifications for a specific exchange type: + +- enable *Notify On Process Error* +- select an activity type in *Activity Type Used When Notify On Process + Error* +- assign recipients with *Notify Groups On Process Error* and/or *Notify + Users On Process Error* + Bug Tracker =========== diff --git a/edi_notification_oca/__init__.py b/edi_notification_oca/__init__.py index f24d3e242..0650744f6 100644 --- a/edi_notification_oca/__init__.py +++ b/edi_notification_oca/__init__.py @@ -1,2 +1 @@ -from . import components from . import models diff --git a/edi_notification_oca/__manifest__.py b/edi_notification_oca/__manifest__.py index f5e6320ac..2d3204b2b 100644 --- a/edi_notification_oca/__manifest__.py +++ b/edi_notification_oca/__manifest__.py @@ -9,8 +9,11 @@ "license": "LGPL-3", "website": "https://github.com/OCA/edi-framework", "author": "Camptocamp,Odoo Community Association (OCA)", - # TODO v19: consider getting rid off `edi_component_oca` dep - "depends": ["edi_core_oca", "edi_component_oca"], - "data": ["data/mail_activity_type.xml", "views/edi_exchange_type.xml"], + "depends": ["edi_core_oca"], + "data": [ + "data/mail_activity_type.xml", + "data/edi_configuration.xml", + "views/edi_exchange_type.xml", + ], "installable": True, } diff --git a/edi_notification_oca/components/__init__.py b/edi_notification_oca/components/__init__.py deleted file mode 100644 index 9430369c2..000000000 --- a/edi_notification_oca/components/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from . import listener diff --git a/edi_notification_oca/components/listener.py b/edi_notification_oca/components/listener.py deleted file mode 100644 index 30945e128..000000000 --- a/edi_notification_oca/components/listener.py +++ /dev/null @@ -1,44 +0,0 @@ -# Copyright 2024 Camptocamp SA -# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). - -from odoo.addons.component.core import Component - - -class EdiNotificationListener(Component): - _name = "edi.notification.component.listener" - _inherit = "base.event.listener" - - def on_edi_exchange_error(self, record): - exc_type = record.type_id - notify_on_process_error = exc_type.notify_on_process_error - activity_type = exc_type.notify_on_process_error_activity_type_id - if ( - not notify_on_process_error - or not activity_type - or not ( - exc_type.notify_on_process_error_groups_ids - or exc_type.notify_on_process_error_users_ids - ) - ): - return True - users = self._get_users_to_notify(exc_type) - # Send notification to defined users - for user in users: - record.activity_schedule( - activity_type_id=activity_type.id, - summary=self.env._( - "EDI: Process error on record '%(identifier)s'.", - identifier=record.identifier, - ), - note=record.exchange_error, - user_id=user.id, - automated=True, - ) - return True - - def _get_users_to_notify(self, exc_type): - exc_type.ensure_one() - return ( - exc_type.notify_on_process_error_groups_ids.users - | exc_type.notify_on_process_error_users_ids - ) diff --git a/edi_notification_oca/data/edi_configuration.xml b/edi_notification_oca/data/edi_configuration.xml new file mode 100644 index 000000000..425d37668 --- /dev/null +++ b/edi_notification_oca/data/edi_configuration.xml @@ -0,0 +1,20 @@ + + + + Notify Users On Exchange Error + + Schedule activities for configured users/groups on EDI process errors. + + True + + +exc_type = record.type_id +result = { + "todo": exc_type.notify_on_process_error_enabled +} + + +result = env["edi.notification.tool"].on_edi_exchange_error(record) + + + diff --git a/edi_notification_oca/models/__init__.py b/edi_notification_oca/models/__init__.py index 6128f744d..d02f28d9f 100644 --- a/edi_notification_oca/models/__init__.py +++ b/edi_notification_oca/models/__init__.py @@ -1,2 +1,3 @@ from . import edi_exchange_type from . import edi_exchange_record +from . import edi_notification_tool diff --git a/edi_notification_oca/models/edi_exchange_type.py b/edi_notification_oca/models/edi_exchange_type.py index bbe2781cf..acea88e56 100644 --- a/edi_notification_oca/models/edi_exchange_type.py +++ b/edi_notification_oca/models/edi_exchange_type.py @@ -31,6 +31,26 @@ class EDIExchangeType(models.Model): string="Activity Type Used When Notify On Process Error", default=lambda self: self._default_notify_on_process_error_activity_type_id(), ) + notify_on_process_error_enabled = fields.Boolean( + compute="_compute_notify_on_process_error_enabled", + ) + + @api.depends( + "notify_on_process_error", + "notify_on_process_error_activity_type_id", + "notify_on_process_error_groups_ids", + "notify_on_process_error_users_ids", + ) + def _compute_notify_on_process_error_enabled(self): + for rec in self: + rec.notify_on_process_error_enabled = bool( + rec.notify_on_process_error + and rec.notify_on_process_error_activity_type_id + and ( + rec.notify_on_process_error_groups_ids + or rec.notify_on_process_error_users_ids + ) + ) def _default_notify_on_process_error_activity_type_id(self): return self.env.ref( diff --git a/edi_notification_oca/models/edi_notification_tool.py b/edi_notification_oca/models/edi_notification_tool.py new file mode 100644 index 000000000..c9d5605b7 --- /dev/null +++ b/edi_notification_oca/models/edi_notification_tool.py @@ -0,0 +1,38 @@ +# Copyright 2024 Camptocamp SA +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo import models + + +class EDINotificationTool(models.AbstractModel): + _name = "edi.notification.tool" + _description = "EDI Notification Tool" + + def on_edi_exchange_error(self, exchange_record): + """Schedule notification activities for a failed exchange record. + + This hook is intended to be called by an ``edi.configuration`` snippet + (see ``edi_notification_oca/data/edi_configuration.xml``) when an + exchange record process ends in error. + """ + exchange_record.ensure_one() + exc_type = exchange_record.type_id + activity_type = exc_type.notify_on_process_error_activity_type_id + groups = exc_type.notify_on_process_error_groups_ids + group_users_field = "users" if "users" in groups._fields else "user_ids" + users = ( + groups.mapped(group_users_field) + | exc_type.notify_on_process_error_users_ids + ) + for user in users: + exchange_record.activity_schedule( + activity_type_id=activity_type.id, + summary=self.env._( + "EDI: Process error on record '%(identifier)s'.", + identifier=exchange_record.identifier, + ), + note=exchange_record.exchange_error, + user_id=user.id, + automated=True, + ) + return True diff --git a/edi_notification_oca/readme/CONFIGURE.md b/edi_notification_oca/readme/CONFIGURE.md new file mode 100644 index 000000000..4c0ff62ad --- /dev/null +++ b/edi_notification_oca/readme/CONFIGURE.md @@ -0,0 +1,12 @@ +The module provides an ``edi.configuration`` entry named +``Notify Users On Exchange Error``. + +You can review or adapt this configuration under EDI configurations if you need +to change the trigger behavior or the executed snippets. + +To enable notifications for a specific exchange type: + +- enable *Notify On Process Error* +- select an activity type in *Activity Type Used When Notify On Process Error* +- assign recipients with *Notify Groups On Process Error* and/or + *Notify Users On Process Error* diff --git a/edi_notification_oca/readme/DESCRIPTION.md b/edi_notification_oca/readme/DESCRIPTION.md index 3f250b798..e4a5be458 100644 --- a/edi_notification_oca/readme/DESCRIPTION.md +++ b/edi_notification_oca/readme/DESCRIPTION.md @@ -1,5 +1,8 @@ This module creates activities for users when an exchange record's process fails. +It also installs an ``edi.configuration`` rule (``Notify Users On Exchange +Error``) that calls ``edi.notification.tool`` on process errors. + Exchange types must be configured properly to create such activities: - field "Notify On Process Error" must be checked to activate the feature diff --git a/edi_notification_oca/static/description/index.html b/edi_notification_oca/static/description/index.html index 7ccfe601a..21f2cf3b8 100644 --- a/edi_notification_oca/static/description/index.html +++ b/edi_notification_oca/static/description/index.html @@ -377,6 +377,9 @@

    EDI Notification

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

    This module creates activities for users when an exchange record’s process fails.

    +

    It also installs an edi.configuration rule +(Notify Users On Exchange Error) that calls +edi.notification.tool on process errors.

    Exchange types must be configured properly to create such activities: