From 867b0a22495dbe51f617a810293711b715cc5c0a Mon Sep 17 00:00:00 2001 From: sbejaoui Date: Tue, 23 Jul 2019 17:45:19 +0200 Subject: [PATCH 01/15] [12.0][ADD] - new module: mail template substitute This module allows you to create substitution rules for mail templates. A typical use case is to replace a standard template by alternative templates when some conditions are met. For instance, it allows to configure alternate templates for different companies. --- mail_template_substitute/README.rst | 91 ++++ mail_template_substitute/__init__.py | 2 + mail_template_substitute/__manifest__.py | 19 + mail_template_substitute/models/__init__.py | 2 + .../models/mail_template.py | 41 ++ .../models/mail_template_substitution_rule.py | 24 + .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 4 + mail_template_substitute/readme/ROADMAP.rst | 0 mail_template_substitute/readme/USAGE.rst | 11 + .../mail_template_substitution_rule.xml | 16 + .../static/description/index.html | 434 ++++++++++++++++++ .../views/mail_template.xml | 44 ++ mail_template_substitute/wizards/__init__.py | 1 + .../wizards/mail_compose_message.py | 43 ++ 15 files changed, 733 insertions(+) create mode 100644 mail_template_substitute/README.rst create mode 100644 mail_template_substitute/__init__.py create mode 100644 mail_template_substitute/__manifest__.py create mode 100644 mail_template_substitute/models/__init__.py create mode 100644 mail_template_substitute/models/mail_template.py create mode 100644 mail_template_substitute/models/mail_template_substitution_rule.py create mode 100644 mail_template_substitute/readme/CONTRIBUTORS.rst create mode 100644 mail_template_substitute/readme/DESCRIPTION.rst create mode 100644 mail_template_substitute/readme/ROADMAP.rst create mode 100644 mail_template_substitute/readme/USAGE.rst create mode 100644 mail_template_substitute/security/mail_template_substitution_rule.xml create mode 100644 mail_template_substitute/static/description/index.html create mode 100644 mail_template_substitute/views/mail_template.xml create mode 100644 mail_template_substitute/wizards/__init__.py create mode 100644 mail_template_substitute/wizards/mail_compose_message.py diff --git a/mail_template_substitute/README.rst b/mail_template_substitute/README.rst new file mode 100644 index 000000000..3421c57b1 --- /dev/null +++ b/mail_template_substitute/README.rst @@ -0,0 +1,91 @@ +======================== +Mail Template Substitute +======================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fsocial-lightgray.png?logo=github + :target: https://github.com/OCA/social/tree/12.0/mail_template_substitute + :alt: OCA/social +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/social-12-0/social-12-0-mail_template_substitute + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/205/12.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allows you to create substitution rules for mail templates. +A typical use case is to replace a standard template by alternative templates +when some conditions are met. For instance, it allows to configure alternate +templates for different companies. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +To use this module, you need to: + +#. Go to 'Email' / 'Templates' + +#. Select the desired template you want to substitute + +#. In the substitutions page add a new line + +#. Select the substitution template + +#. Set a domain to specify when this substitution should happen + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* ACSONE SA/NV + +Contributors +~~~~~~~~~~~~ + +* Bejaoui Souheil + +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/social `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/mail_template_substitute/__init__.py b/mail_template_substitute/__init__.py new file mode 100644 index 000000000..aee8895e7 --- /dev/null +++ b/mail_template_substitute/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import wizards diff --git a/mail_template_substitute/__manifest__.py b/mail_template_substitute/__manifest__.py new file mode 100644 index 000000000..5c23b9469 --- /dev/null +++ b/mail_template_substitute/__manifest__.py @@ -0,0 +1,19 @@ +# Copyright 2019 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Mail Template Substitute", + "summary": """ + This module allows to create substitution rules for mail templates. + """, + "version": "12.0.1.0.0", + "license": "AGPL-3", + "author": "ACSONE SA/NV," + "Odoo Community Association (OCA)", + "website": "https://github.com/acsone/social", + "depends": ["base", "mail"], + "data": [ + "security/mail_template_substitution_rule.xml", + "views/mail_template.xml", + ], +} diff --git a/mail_template_substitute/models/__init__.py b/mail_template_substitute/models/__init__.py new file mode 100644 index 000000000..09e1a8f27 --- /dev/null +++ b/mail_template_substitute/models/__init__.py @@ -0,0 +1,2 @@ +from . import mail_template +from . import mail_template_substitution_rule diff --git a/mail_template_substitute/models/mail_template.py b/mail_template_substitute/models/mail_template.py new file mode 100644 index 000000000..3229e0677 --- /dev/null +++ b/mail_template_substitute/models/mail_template.py @@ -0,0 +1,41 @@ +# Copyright 2019 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models +from odoo.tools import pycompat +from odoo.tools.safe_eval import safe_eval + + +class MailTemplate(models.Model): + + _inherit = "mail.template" + + mail_template_substitution_rule_ids = fields.One2many( + comodel_name="mail.template.substitution.rule", + inverse_name="mail_template_id", + string="Substitution Rules", + ) + + @api.multi + def _get_substitution_template(self, model_id, active_ids): + self.ensure_one() + if isinstance(active_ids, pycompat.integer_types): + active_ids = [active_ids] + model = self.env[model_id.model] + for ( + substitution_template_rule + ) in self.mail_template_substitution_rule_ids: + domain = safe_eval(substitution_template_rule.domain) + domain.append(("id", "in", active_ids)) + if set(model.search(domain).ids) == set(active_ids): + return substitution_template_rule.substitution_mail_template_id + return False + + @api.multi + def get_email_template(self, res_ids): + substitution_template = self._get_substitution_template( + self.model_id, res_ids + ) + if substitution_template: + return substitution_template.get_email_template(res_ids) + return super().get_email_template(res_ids) diff --git a/mail_template_substitute/models/mail_template_substitution_rule.py b/mail_template_substitute/models/mail_template_substitution_rule.py new file mode 100644 index 000000000..0670493e6 --- /dev/null +++ b/mail_template_substitute/models/mail_template_substitution_rule.py @@ -0,0 +1,24 @@ +# Copyright 2019 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class MailTemplateSubstitutionRule(models.Model): + + _name = "mail.template.substitution.rule" + _description = "Mail Template Substitution Rule" + _order = "sequence ASC" + + sequence = fields.Integer(default=10) + mail_template_id = fields.Many2one( + comodel_name="mail.template", required=True, ondelete="cascade" + ) + model = fields.Char(related="mail_template_id.model_id.model", store=True) + domain = fields.Char(string="Domain", required=True, default="[]") + substitution_mail_template_id = fields.Many2one( + comodel_name="mail.template", + required=True, + ondelete="cascade", + domain="[('model', '=', model)]", + ) diff --git a/mail_template_substitute/readme/CONTRIBUTORS.rst b/mail_template_substitute/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..35c03ffe0 --- /dev/null +++ b/mail_template_substitute/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Bejaoui Souheil diff --git a/mail_template_substitute/readme/DESCRIPTION.rst b/mail_template_substitute/readme/DESCRIPTION.rst new file mode 100644 index 000000000..008be85a5 --- /dev/null +++ b/mail_template_substitute/readme/DESCRIPTION.rst @@ -0,0 +1,4 @@ +This module allows you to create substitution rules for mail templates. +A typical use case is to replace a standard template by alternative templates +when some conditions are met. For instance, it allows to configure alternate +templates for different companies. diff --git a/mail_template_substitute/readme/ROADMAP.rst b/mail_template_substitute/readme/ROADMAP.rst new file mode 100644 index 000000000..e69de29bb diff --git a/mail_template_substitute/readme/USAGE.rst b/mail_template_substitute/readme/USAGE.rst new file mode 100644 index 000000000..d762ef627 --- /dev/null +++ b/mail_template_substitute/readme/USAGE.rst @@ -0,0 +1,11 @@ +To use this module, you need to: + +#. Go to 'Email' / 'Templates' + +#. Select the desired template you want to substitute + +#. In the substitutions page add a new line + +#. Select the substitution template + +#. Set a domain to specify when this substitution should happen diff --git a/mail_template_substitute/security/mail_template_substitution_rule.xml b/mail_template_substitute/security/mail_template_substitution_rule.xml new file mode 100644 index 000000000..98b95eb2e --- /dev/null +++ b/mail_template_substitute/security/mail_template_substitution_rule.xml @@ -0,0 +1,16 @@ + + + + + + + mail.template.substitution.rule access + + + + + + + + diff --git a/mail_template_substitute/static/description/index.html b/mail_template_substitute/static/description/index.html new file mode 100644 index 000000000..91691a08b --- /dev/null +++ b/mail_template_substitute/static/description/index.html @@ -0,0 +1,434 @@ + + + + + + +Mail Template Substitute + + + +
+

Mail Template Substitute

+ + +

Beta License: AGPL-3 OCA/social Translate me on Weblate Try me on Runbot

+

This module allows you to create substitution rules for mail templates. +A typical use case is to replace a standard template by alternative templates +when some conditions are met. For instance, it allows to configure alternate +templates for different companies.

+

Table of contents

+ +
+

Usage

+

To use this module, you need to:

+
    +
  1. Go to ‘Email’ / ‘Templates’
  2. +
  3. Select the desired template you want to substitute
  4. +
  5. In the substitutions page add a new line
  6. +
  7. Select the substitution template
  8. +
  9. Set a domain to specify when this substitution should happen
  10. +
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • ACSONE SA/NV
  • +
+
+
+

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.

+

This module is part of the OCA/social project on GitHub.

+

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

+
+
+
+ + diff --git a/mail_template_substitute/views/mail_template.xml b/mail_template_substitute/views/mail_template.xml new file mode 100644 index 000000000..e243662e2 --- /dev/null +++ b/mail_template_substitute/views/mail_template.xml @@ -0,0 +1,44 @@ + + + + + + + mail.template.form (in mail_template_substitute) + + mail.template + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+
+ + +
diff --git a/mail_template_substitute/wizards/__init__.py b/mail_template_substitute/wizards/__init__.py new file mode 100644 index 000000000..b528d997d --- /dev/null +++ b/mail_template_substitute/wizards/__init__.py @@ -0,0 +1 @@ +from . import mail_compose_message diff --git a/mail_template_substitute/wizards/mail_compose_message.py b/mail_template_substitute/wizards/mail_compose_message.py new file mode 100644 index 000000000..ecf952f11 --- /dev/null +++ b/mail_template_substitute/wizards/mail_compose_message.py @@ -0,0 +1,43 @@ +# Copyright 2019 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, models + + +class MailComposeMessage(models.TransientModel): + + _inherit = 'mail.compose.message' + + @api.model + def _get_substitution_template(self, composition_mode, template, res_ids): + if template: + if composition_mode == 'mass_mail' and self.env.context.get( + 'active_ids' + ): + res_ids = self.env.context.get('active_ids') + res_ids_to_templates = template.get_email_template(res_ids) + if res_ids_to_templates: + return list(res_ids_to_templates.values())[0] + return False + + @api.model + def default_get(self, fields): + result = super(MailComposeMessage, self).default_get(fields) + substitution_template = self._get_substitution_template( + result.get('composition_mode'), + self.env['mail.template'].browse(result.get('template_id')), + [result.get('res_id')], + ) + if substitution_template: + result['template_id'] = substitution_template.id + return result + + @api.multi + @api.onchange('template_id') + def onchange_template_id_wrapper(self): + substitution_template = self._get_substitution_template( + self.composition_mode, self.template_id, [self.res_id] + ) + if substitution_template: + self.template_id = substitution_template + return super().onchange_template_id_wrapper() From 74fdee5e3b72b858c9b6b5aa2a83e493614dff22 Mon Sep 17 00:00:00 2001 From: sbejaoui Date: Tue, 30 Jul 2019 14:37:00 +0200 Subject: [PATCH 02/15] [FIX] - substitution mail template have the same model as the base template --- mail_template_substitute/views/mail_template.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mail_template_substitute/views/mail_template.xml b/mail_template_substitute/views/mail_template.xml index e243662e2..6229d264b 100644 --- a/mail_template_substitute/views/mail_template.xml +++ b/mail_template_substitute/views/mail_template.xml @@ -26,7 +26,7 @@ required="0"/> + domain="[('model', '=', model), ('id', '!=', parent.id)]"/> Date: Tue, 30 Jul 2019 15:24:21 +0200 Subject: [PATCH 03/15] [FIX] - Add dependecy report_substitute --- mail_template_substitute/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mail_template_substitute/__manifest__.py b/mail_template_substitute/__manifest__.py index 5c23b9469..eca79392f 100644 --- a/mail_template_substitute/__manifest__.py +++ b/mail_template_substitute/__manifest__.py @@ -11,7 +11,7 @@ "author": "ACSONE SA/NV," "Odoo Community Association (OCA)", "website": "https://github.com/acsone/social", - "depends": ["base", "mail"], + "depends": ["base", "mail", "report_substitute"], "data": [ "security/mail_template_substitution_rule.xml", "views/mail_template.xml", From 74a4a34fe3f1fd10dc3e873c724e559ba6de0dba Mon Sep 17 00:00:00 2001 From: sbejaoui Date: Tue, 1 Oct 2019 16:30:44 +0200 Subject: [PATCH 04/15] [12.0][ADD] - Add unit tests --- mail_template_substitute/__init__.py | 1 + mail_template_substitute/__manifest__.py | 4 +- .../i18n/mail_template_substitute.pot | 97 ++++++++++++++++++ .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 2 +- mail_template_substitute/tests/__init__.py | 1 + .../tests/test_mail_template_substitute.py | 74 +++++++++++++ 7 files changed, 176 insertions(+), 3 deletions(-) create mode 100644 mail_template_substitute/i18n/mail_template_substitute.pot create mode 100644 mail_template_substitute/static/description/icon.png create mode 100644 mail_template_substitute/tests/__init__.py create mode 100644 mail_template_substitute/tests/test_mail_template_substitute.py diff --git a/mail_template_substitute/__init__.py b/mail_template_substitute/__init__.py index aee8895e7..1c15bc7ee 100644 --- a/mail_template_substitute/__init__.py +++ b/mail_template_substitute/__init__.py @@ -1,2 +1,3 @@ from . import models from . import wizards +from . import tests diff --git a/mail_template_substitute/__manifest__.py b/mail_template_substitute/__manifest__.py index eca79392f..112d99b93 100644 --- a/mail_template_substitute/__manifest__.py +++ b/mail_template_substitute/__manifest__.py @@ -6,11 +6,11 @@ "summary": """ This module allows to create substitution rules for mail templates. """, - "version": "12.0.1.0.0", + "version": "12.0.1.0.1", "license": "AGPL-3", "author": "ACSONE SA/NV," "Odoo Community Association (OCA)", - "website": "https://github.com/acsone/social", + "website": "https://github.com/OCA/social", "depends": ["base", "mail", "report_substitute"], "data": [ "security/mail_template_substitution_rule.xml", diff --git a/mail_template_substitute/i18n/mail_template_substitute.pot b/mail_template_substitute/i18n/mail_template_substitute.pot new file mode 100644 index 000000000..da3ee1976 --- /dev/null +++ b/mail_template_substitute/i18n/mail_template_substitute.pot @@ -0,0 +1,97 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mail_template_substitute +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.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: mail_template_substitute +#: model:ir.model.fields,field_description:mail_template_substitute.field_mail_template_substitution_rule__create_uid +msgid "Created by" +msgstr "" + +#. module: mail_template_substitute +#: model:ir.model.fields,field_description:mail_template_substitute.field_mail_template_substitution_rule__create_date +msgid "Created on" +msgstr "" + +#. module: mail_template_substitute +#: model:ir.model.fields,field_description:mail_template_substitute.field_mail_template_substitution_rule__display_name +msgid "Display Name" +msgstr "" + +#. module: mail_template_substitute +#: model:ir.model.fields,field_description:mail_template_substitute.field_mail_template_substitution_rule__domain +msgid "Domain" +msgstr "" + +#. module: mail_template_substitute +#: model:ir.model,name:mail_template_substitute.model_mail_template +msgid "Email Templates" +msgstr "" + +#. module: mail_template_substitute +#: model:ir.model,name:mail_template_substitute.model_mail_compose_message +msgid "Email composition wizard" +msgstr "" + +#. module: mail_template_substitute +#: model:ir.model.fields,field_description:mail_template_substitute.field_mail_template_substitution_rule__id +msgid "ID" +msgstr "" + +#. module: mail_template_substitute +#: model:ir.model.fields,field_description:mail_template_substitute.field_mail_template_substitution_rule____last_update +msgid "Last Modified on" +msgstr "" + +#. module: mail_template_substitute +#: model:ir.model.fields,field_description:mail_template_substitute.field_mail_template_substitution_rule__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: mail_template_substitute +#: model:ir.model.fields,field_description:mail_template_substitute.field_mail_template_substitution_rule__write_date +msgid "Last Updated on" +msgstr "" + +#. module: mail_template_substitute +#: model:ir.model.fields,field_description:mail_template_substitute.field_mail_template_substitution_rule__mail_template_id +msgid "Mail Template" +msgstr "" + +#. module: mail_template_substitute +#: model:ir.model,name:mail_template_substitute.model_mail_template_substitution_rule +msgid "Mail Template Substitution Rule" +msgstr "" + +#. module: mail_template_substitute +#: model:ir.model.fields,field_description:mail_template_substitute.field_mail_template_substitution_rule__model +msgid "Model" +msgstr "" + +#. module: mail_template_substitute +#: model:ir.model.fields,field_description:mail_template_substitute.field_mail_template_substitution_rule__sequence +msgid "Sequence" +msgstr "" + +#. module: mail_template_substitute +#: model:ir.model.fields,field_description:mail_template_substitute.field_mail_template_substitution_rule__substitution_mail_template_id +msgid "Substitution Mail Template" +msgstr "" + +#. module: mail_template_substitute +#: model:ir.model.fields,field_description:mail_template_substitute.field_email_template_preview__mail_template_substitution_rule_ids +#: model:ir.model.fields,field_description:mail_template_substitute.field_mail_template__mail_template_substitution_rule_ids +#: model_terms:ir.ui.view,arch_db:mail_template_substitute.email_template_form +msgid "Substitution Rules" +msgstr "" + diff --git a/mail_template_substitute/static/description/icon.png b/mail_template_substitute/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/mail_template_substitute/static/description/index.html b/mail_template_substitute/static/description/index.html index 91691a08b..5d8c4311a 100644 --- a/mail_template_substitute/static/description/index.html +++ b/mail_template_substitute/static/description/index.html @@ -3,7 +3,7 @@ - + Mail Template Substitute -
-

Mail Template Substitute

+
+ + +Odoo Community Association + +
+

Mail Template Substitute

-

Beta License: AGPL-3 OCA/mail Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/mail Translate me on Weblate Try me on Runboat

This module allows you to create substitution rules for mail templates. A typical use case is to replace a standard template by alternative templates when some conditions are met. For instance, it allows to @@ -389,7 +394,7 @@

Mail Template Substitute

-

Usage

+

Usage

To use this module, you need to:

  1. Go to ‘Email’ / ‘Templates’
  2. @@ -400,10 +405,10 @@

    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 @@ -411,22 +416,23 @@

Bug Tracker

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

-

Credits

+

Credits

-

Authors

+

Authors

  • ACSONE SA/NV
-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -439,5 +445,6 @@

Maintainers

+
diff --git a/mail_template_substitute/tests/test_mail_template_substitute.py b/mail_template_substitute/tests/test_mail_template_substitute.py index 727d4b22b..897fd4c2b 100644 --- a/mail_template_substitute/tests/test_mail_template_substitute.py +++ b/mail_template_substitute/tests/test_mail_template_substitute.py @@ -5,44 +5,45 @@ class TestMailTemplateSubstitute(TransactionCase): - def setUp(self): - super().setUp() - self.smt2 = self.env["mail.template"].create( + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.smt2 = cls.env["mail.template"].create( { "name": "substitute_template_2", - "model_id": self.env.ref("base.model_res_partner").id, + "model_id": cls.env.ref("base.model_res_partner").id, } ) - self.smt1 = self.env["mail.template"].create( + cls.smt1 = cls.env["mail.template"].create( { "name": "substitute_template_1", - "model_id": self.env.ref("base.model_res_partner").id, + "model_id": cls.env.ref("base.model_res_partner").id, "mail_template_substitution_rule_ids": [ ( 0, 0, { - "substitution_mail_template_id": self.smt2.id, + "substitution_mail_template_id": cls.smt2.id, "domain": "[('id', '=', False)]", }, ) ], } ) - self.mt = self.env["mail.template"].create( + cls.mt = cls.env["mail.template"].create( { "name": "base_template", - "model_id": self.env.ref("base.model_res_partner").id, + "model_id": cls.env.ref("base.model_res_partner").id, "mail_template_substitution_rule_ids": [ - (0, 0, {"substitution_mail_template_id": self.smt1.id}) + (0, 0, {"substitution_mail_template_id": cls.smt1.id}) ], } ) - self.mail_compose = self.env["mail.compose.message"].create( - {"template_id": self.mt.id, "composition_mode": "mass_mail"} + cls.mail_compose = cls.env["mail.compose.message"].create( + {"template_id": cls.mt.id, "composition_mode": "mass_mail"} ) - self.partners = self.env["res.partner"].search([]) - self.partner = self.env["res.partner"].search([], limit=1) + cls.partners = cls.env["res.partner"].search([]) + cls.partner = cls.env["res.partner"].search([], limit=1) def test_get_email_template_partners(self): self.assertEqual( @@ -93,3 +94,126 @@ def test_default_get(self): ) ) self.assertEqual(mail_compose_form.template_id, self.smt1) + + def test_get_substitution_template_account_move_send(self): + account_id = ( + self.env["account.account"] + .search([("account_type", "=", "asset_receivable")], limit=1) + .id + ) + move = self.env["account.move"].create( + { + "name": "Test Move", + "journal_id": self.env["account.journal"].search([], limit=1).id, + "date": "2024-01-01", + "move_type": "out_invoice", # Asegúrate de que sea una factura + "partner_id": self.partner.id, + "invoice_line_ids": [ + ( + 0, + 0, + { + "name": "Test line", + "quantity": 1, + "price_unit": 100, + "account_id": account_id, + }, + ) + ], + } + ) + move.action_post() + wizard = ( + self.env["account.move.send.wizard"] + .with_context(active_ids=[move.id]) + .create({}) + ) + template = self.env["mail.template"].create( + { + "name": "Test Template", + "model_id": self.env.ref("account.model_account_move").id, + } + ) + res = wizard._get_substitution_template(template, [move.id]) + self.assertTrue(res == template or res is False) + + def test_compute_mail_template_id(self): + """Test el cálculo del template por defecto en account.move.send.wizard""" + # Crear un template adicional para facturas + self.env["mail.template"].create( + { + "name": "Test Invoice Template", + "model_id": self.env.ref("account.model_account_move").id, + } + ) + + # Crear una factura utilizando la configuración de setUp + account_id = ( + self.env["account.account"] + .search([("account_type", "=", "asset_receivable")], limit=1) + .id + ) + move = self.env["account.move"].create( + { + "name": "Test Move", + "journal_id": self.env["account.journal"].search([], limit=1).id, + "date": "2024-01-01", + "move_type": "out_invoice", + "partner_id": self.partner.id, + "invoice_line_ids": [ + ( + 0, + 0, + { + "name": "Test line", + "quantity": 1, + "price_unit": 100, + "account_id": account_id, + }, + ) + ], + } + ) + move.action_post() + + # Crear el wizard y obtener el template por defecto + wizard = ( + self.env["account.move.send.wizard"] + .with_context(active_ids=[move.id]) + .create({}) + ) + original_template = wizard.mail_template_id + + # Crear un template de sustitución + template2 = self.env["mail.template"].create( + { + "name": "Substitution Invoice Template", + "model_id": self.env.ref("account.model_account_move").id, + } + ) + + # Añadir regla de sustitución al template original + original_template.write( + { + "mail_template_substitution_rule_ids": [ + ( + 0, + 0, + { + "substitution_mail_template_id": template2.id, + "domain": f"[('id', '=', {move.id})]", + }, + ) + ], + } + ) + + # Crear un nuevo wizard y verificar si aplica la sustitución + wizard2 = ( + self.env["account.move.send.wizard"] + .with_context(active_ids=[move.id]) + .create({}) + ) + + # Comprobar que mail_template_id es ahora el template de sustitución + self.assertEqual(wizard2.mail_template_id, template2) diff --git a/mail_template_substitute/wizards/__init__.py b/mail_template_substitute/wizards/__init__.py index b528d997d..197f44cf9 100644 --- a/mail_template_substitute/wizards/__init__.py +++ b/mail_template_substitute/wizards/__init__.py @@ -1 +1,2 @@ from . import mail_compose_message +from . import account_move_send diff --git a/mail_template_substitute/wizards/account_move_send.py b/mail_template_substitute/wizards/account_move_send.py new file mode 100644 index 000000000..6b57afc7c --- /dev/null +++ b/mail_template_substitute/wizards/account_move_send.py @@ -0,0 +1,27 @@ +# Copyright 2019 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, models + + +class AccountMoveSend(models.TransientModel): + _inherit = "account.move.send.wizard" + + def _compute_mail_template_id(self): + res = super()._compute_mail_template_id() + for wizard in self: + template = wizard._get_substitution_template( + wizard.mail_template_id, wizard.move_id.ids + ) + if template: + wizard.mail_template_id = template + return res + + @api.model + def _get_substitution_template(self, template, res_ids): + if template: + res_ids_to_templates = template._classify_per_lang(res_ids) + if len(res_ids_to_templates): + _lang, (template, _res_ids) = list(res_ids_to_templates.items())[0] + return template + return False From dee8969da4efdf04c241cf05eacf2d32c61e4365 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Paradis?= Date: Thu, 9 Apr 2026 17:18:16 +0000 Subject: [PATCH 14/15] [IMP] mail_template_substitute: pre-commit auto fixes --- mail_template_substitute/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mail_template_substitute/__manifest__.py b/mail_template_substitute/__manifest__.py index 8d4b5dd58..eff49235c 100644 --- a/mail_template_substitute/__manifest__.py +++ b/mail_template_substitute/__manifest__.py @@ -8,7 +8,7 @@ """, "version": "18.0.1.0.0", "license": "AGPL-3", - "author": "ACSONE SA/NV," "Odoo Community Association (OCA)", + "author": "ACSONE SA/NV,Odoo Community Association (OCA)", "website": "https://github.com/OCA/mail", "depends": ["base", "mail", "account"], "data": [ From 0fb4daf99af1703b0d69c1506940c237aafb407f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Paradis?= Date: Thu, 9 Apr 2026 17:18:17 +0000 Subject: [PATCH 15/15] [MIG] mail_template_substitute: Migration to 19.0 --- mail_template_substitute/README.rst | 10 ++--- mail_template_substitute/__manifest__.py | 2 +- .../models/mail_template.py | 5 ++- .../static/description/index.html | 6 +-- .../tests/test_mail_template_substitute.py | 41 +++++++++++++++---- .../wizards/account_move_send.py | 8 ++-- 6 files changed, 48 insertions(+), 24 deletions(-) diff --git a/mail_template_substitute/README.rst b/mail_template_substitute/README.rst index ad8cda59c..d1031d6a0 100644 --- a/mail_template_substitute/README.rst +++ b/mail_template_substitute/README.rst @@ -21,13 +21,13 @@ Mail Template Substitute :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fmail-lightgray.png?logo=github - :target: https://github.com/OCA/mail/tree/18.0/mail_template_substitute + :target: https://github.com/OCA/mail/tree/19.0/mail_template_substitute :alt: OCA/mail .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/mail-18-0/mail-18-0-mail_template_substitute + :target: https://translation.odoo-community.org/projects/mail-19-0/mail-19-0-mail_template_substitute :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/mail&target_branch=18.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/mail&target_branch=19.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -64,7 +64,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. @@ -96,6 +96,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/mail `_ project on GitHub. +This module is part of the `OCA/mail `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/mail_template_substitute/__manifest__.py b/mail_template_substitute/__manifest__.py index eff49235c..d430df92c 100644 --- a/mail_template_substitute/__manifest__.py +++ b/mail_template_substitute/__manifest__.py @@ -6,7 +6,7 @@ "summary": """ This module allows to create substitution rules for mail templates. """, - "version": "18.0.1.0.0", + "version": "19.0.1.0.0", "license": "AGPL-3", "author": "ACSONE SA/NV,Odoo Community Association (OCA)", "website": "https://github.com/OCA/mail", diff --git a/mail_template_substitute/models/mail_template.py b/mail_template_substitute/models/mail_template.py index ddc598dc6..6f45621d5 100644 --- a/mail_template_substitute/models/mail_template.py +++ b/mail_template_substitute/models/mail_template.py @@ -2,6 +2,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from odoo import fields, models +from odoo.fields import Domain from odoo.tools.safe_eval import safe_eval @@ -20,8 +21,8 @@ def _get_substitution_template(self, model_id, active_ids): active_ids = [active_ids] model = self.env[model_id.sudo().model] for substitution_template_rule in self.mail_template_substitution_rule_ids: - domain = safe_eval(substitution_template_rule.domain) - domain.append(("id", "in", active_ids)) + domain = Domain(safe_eval(substitution_template_rule.domain)) + domain &= Domain("id", "in", active_ids) if set(model.search(domain).ids) == set(active_ids): return substitution_template_rule.substitution_mail_template_id return False diff --git a/mail_template_substitute/static/description/index.html b/mail_template_substitute/static/description/index.html index 088b72625..0a9b79352 100644 --- a/mail_template_substitute/static/description/index.html +++ b/mail_template_substitute/static/description/index.html @@ -374,7 +374,7 @@

Mail Template Substitute

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:88353a58d02303f8d5b8af82bca0b8774a236b6cba6857e55f5a208cbe6d9921 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: AGPL-3 OCA/mail Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/mail Translate me on Weblate Try me on Runboat

This module allows you to create substitution rules for mail templates. A typical use case is to replace a standard template by alternative templates when some conditions are met. For instance, it allows to @@ -412,7 +412,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.

@@ -440,7 +440,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/mail project on GitHub.

+

This module is part of the OCA/mail project on GitHub.

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

diff --git a/mail_template_substitute/tests/test_mail_template_substitute.py b/mail_template_substitute/tests/test_mail_template_substitute.py index 897fd4c2b..7b7f4fe0b 100644 --- a/mail_template_substitute/tests/test_mail_template_substitute.py +++ b/mail_template_substitute/tests/test_mail_template_substitute.py @@ -1,8 +1,12 @@ # Copyright 2019 ACSONE SA/NV # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +import logging + from odoo.tests import Form, TransactionCase +_logger = logging.getLogger(__name__) + class TestMailTemplateSubstitute(TransactionCase): @classmethod @@ -44,6 +48,24 @@ def setUpClass(cls): ) cls.partners = cls.env["res.partner"].search([]) cls.partner = cls.env["res.partner"].search([], limit=1) + cls.env["account.journal"].create( + { + "name": "account_journal_purchase", + "code": "purcj", + "type": "purchase", + } + ) + cls.env["account.journal"].create( + {"name": "account_journal_sale", "code": "salej", "type": "sale"} + ) + + cls.account_receivable = cls.env["account.account"].create( + { + "name": "Asset Receivable", + "account_type": "asset_receivable", + "code": "AccR", + } + ) def test_get_email_template_partners(self): self.assertEqual( @@ -96,15 +118,13 @@ def test_default_get(self): self.assertEqual(mail_compose_form.template_id, self.smt1) def test_get_substitution_template_account_move_send(self): - account_id = ( - self.env["account.account"] - .search([("account_type", "=", "asset_receivable")], limit=1) - .id - ) + account_id = self.account_receivable.id move = self.env["account.move"].create( { "name": "Test Move", - "journal_id": self.env["account.journal"].search([], limit=1).id, + "journal_id": self.env["account.journal"] + .search([("type", "=", "sale")], limit=1) + .id, "date": "2024-01-01", "move_type": "out_invoice", # Asegúrate de que sea una factura "partner_id": self.partner.id, @@ -153,10 +173,13 @@ def test_compute_mail_template_id(self): .search([("account_type", "=", "asset_receivable")], limit=1) .id ) + move = self.env["account.move"].create( { "name": "Test Move", - "journal_id": self.env["account.journal"].search([], limit=1).id, + "journal_id": self.env["account.journal"] + .search([("type", "=", "sale")], limit=1) + .id, "date": "2024-01-01", "move_type": "out_invoice", "partner_id": self.partner.id, @@ -182,7 +205,7 @@ def test_compute_mail_template_id(self): .with_context(active_ids=[move.id]) .create({}) ) - original_template = wizard.mail_template_id + original_template = wizard.template_id # Crear un template de sustitución template2 = self.env["mail.template"].create( @@ -216,4 +239,4 @@ def test_compute_mail_template_id(self): ) # Comprobar que mail_template_id es ahora el template de sustitución - self.assertEqual(wizard2.mail_template_id, template2) + self.assertEqual(wizard2.template_id, template2) diff --git a/mail_template_substitute/wizards/account_move_send.py b/mail_template_substitute/wizards/account_move_send.py index 6b57afc7c..6f8c923e4 100644 --- a/mail_template_substitute/wizards/account_move_send.py +++ b/mail_template_substitute/wizards/account_move_send.py @@ -7,14 +7,14 @@ class AccountMoveSend(models.TransientModel): _inherit = "account.move.send.wizard" - def _compute_mail_template_id(self): - res = super()._compute_mail_template_id() + def _compute_template_id(self): + res = super()._compute_template_id() for wizard in self: template = wizard._get_substitution_template( - wizard.mail_template_id, wizard.move_id.ids + wizard.template_id, wizard.move_id.ids ) if template: - wizard.mail_template_id = template + wizard.template_id = template return res @api.model