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
+
+
+

+
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
+
+
+
+
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
+
+
+
+
+
Bugs are tracked on GitHub Issues.
+In case of trouble, please check there if your issue has already been reported.
+If you spotted it first, help us smashing it by providing a detailed and welcomed
+feedback.
+
Do not contact contributors directly about support or help with technical issues.
+
+
+
+
+
+
+
+
This module is maintained by the OCA.
+

+
OCA, or the Odoo Community Association, is a nonprofit organization whose
+mission is to support the collaborative development of Odoo features and
+promote its widespread use.
+
This module is part of the OCA/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
+
+
+
+
+
+
-
+
To use this module, you need to:
- Go to ‘Email’ / ‘Templates’
@@ -400,10 +405,10 @@
-
+
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 @@
Do not contact contributors directly about support or help with technical issues.
+
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
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-

+

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 @@
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 @@
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