diff --git a/mail_layout_force/README.rst b/mail_layout_force/README.rst new file mode 100644 index 00000000..70bde64e --- /dev/null +++ b/mail_layout_force/README.rst @@ -0,0 +1,145 @@ +================= +Mail Layout Force +================= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:988dd474248a3c1d5cf299ddbbe938b3706c0ebaca05219cede46dc6a2eed89a + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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%2Fmail-lightgray.png?logo=github + :target: https://github.com/OCA/mail/tree/18.0/mail_layout_force + :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_layout_force + :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 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Odoo will add a default email layout on most commercial communications. + +The email layout is a ``QWeb`` view that ends up wrapping the message +body when sending an email. It usually displays the related document +reference, the company logo, and a small footer saying "Powered by +Odoo". + +There are notably two main layouts used in Odoo, and the user can't +control when they're used, as it's hardcoded into the different +applications. + +- ``mail.message_notification_email`` +- ``mail.mail_notification_light`` +- ``mail.mail_notification_paynow`` + +This module allows to force a specific layout for a given +``email.template``, effectively overwritting the one hardcoded by Odoo. +Additionally, it enables forcing a custom layout for emails that do not +use an existing ``email.template`` record (e.g., when sending an email +from the chatter). + +This allows you to fully customize the way Odoo emails are rendered and +sent to your customers. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +# Go to Configuration > Technical > Emails > Templates # Open the +desired ``email.template`` record. # In Advanced Parameters tab, find +the Force Layout field. + +You can leave it empty to use the default email layout (chosen by Odoo). +You can force a custom email layout of your own. You can use the *Mail: +No-Layout notification template* to prevent Odoo from adding a layout. + +To configure a custom layout of your own, some technical knowledge is +needed. You can see how the existing layouts are defined for details or +inspiration: + +- ``mail.mail_notification_light`` +- ``mail.mail_notification_paynow`` +- ``mail.mail_notification_borders`` + +To force a new custom layout for emails that do not use an existing +``email.template`` record (e.g., emails sent from the chatter): + +#. Go to Settings > Technical > User Interface > Views. #. Copy the +current layout (e.g., mail.message_notification_email) to create a new +one, and remove any parts you don’t need. #. Open the layout that you +want to swap with a substitute. Then, under the Layout Mapping tab: \* +Set ``Substitute Layout`` to the new custom layout you created. \* Set +``Models`` if you want to apply the replacement only to specific models. +If left empty, the email layout will be replaced for all models. + +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 +------------ + +- ``Camptocamp ``\ \_ + + - Iván Todorovich ivan.todorovich@camptocamp.com + +- Abraham Anes abrahamanes@gmail.com + +- ``Quartile ``\ \_ + + - Aung Ko Ko Lin + - Yoshi Tashiro + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-ivantodorovich| image:: https://github.com/ivantodorovich.png?size=40px + :target: https://github.com/ivantodorovich + :alt: ivantodorovich + +Current `maintainer `__: + +|maintainer-ivantodorovich| + +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_layout_force/__init__.py b/mail_layout_force/__init__.py new file mode 100644 index 00000000..0650744f --- /dev/null +++ b/mail_layout_force/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/mail_layout_force/__manifest__.py b/mail_layout_force/__manifest__.py new file mode 100644 index 00000000..f822287f --- /dev/null +++ b/mail_layout_force/__manifest__.py @@ -0,0 +1,22 @@ +# Copyright 2022 Camptocamp SA (https://www.camptocamp.com). +# @author Iván Todorovich +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Mail Layout Force", + "summary": "Force a mail layout on selected email templates", + "version": "18.0.1.0.0", + "author": "Camptocamp, Odoo Community Association (OCA)", + "maintainers": ["ivantodorovich"], + "website": "https://github.com/OCA/mail", + "license": "AGPL-3", + "category": "Marketing", + "depends": ["mail"], + "demo": ["demo/mail_layout.xml"], + "data": [ + "security/ir.model.access.csv", + "data/mail_layout.xml", + "views/ir_ui_views.xml", + "views/mail_template.xml", + ], +} diff --git a/mail_layout_force/data/mail_layout.xml b/mail_layout_force/data/mail_layout.xml new file mode 100644 index 00000000..75463da0 --- /dev/null +++ b/mail_layout_force/data/mail_layout.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/mail_layout_force/demo/mail_layout.xml b/mail_layout_force/demo/mail_layout.xml new file mode 100644 index 00000000..c4df36b3 --- /dev/null +++ b/mail_layout_force/demo/mail_layout.xml @@ -0,0 +1,114 @@ + + + + + diff --git a/mail_layout_force/i18n/it.po b/mail_layout_force/i18n/it.po new file mode 100644 index 00000000..d4c44764 --- /dev/null +++ b/mail_layout_force/i18n/it.po @@ -0,0 +1,42 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mail_layout_force +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-04-02 11:43+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 4.17\n" + +#. module: mail_layout_force +#: model:ir.model,name:mail_layout_force.model_mail_template +msgid "Email Templates" +msgstr "Modelli e-mail" + +#. module: mail_layout_force +#: model:ir.model,name:mail_layout_force.model_mail_thread +msgid "Email Thread" +msgstr "Discussione e-mail" + +#. module: mail_layout_force +#: model:ir.model,name:mail_layout_force.model_mail_compose_message +msgid "Email composition wizard" +msgstr "Procedura guidata creazione e-mail" + +#. module: mail_layout_force +#: model:ir.model.fields,field_description:mail_layout_force.field_mail_template__force_email_layout_id +msgid "Force Layout" +msgstr "Forza disposizione" + +#. module: mail_layout_force +#: model:ir.model.fields,help:mail_layout_force.field_mail_template__force_email_layout_id +msgid "Force a mail layout for this template." +msgstr "Forza disposizione e-mail per questo modello." diff --git a/mail_layout_force/i18n/mail_layout_force.pot b/mail_layout_force/i18n/mail_layout_force.pot new file mode 100644 index 00000000..a1057522 --- /dev/null +++ b/mail_layout_force/i18n/mail_layout_force.pot @@ -0,0 +1,109 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mail_layout_force +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.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_layout_force +#: model:ir.model.fields,field_description:mail_layout_force.field_email_layout_mapping__create_uid +msgid "Created by" +msgstr "" + +#. module: mail_layout_force +#: model:ir.model.fields,field_description:mail_layout_force.field_email_layout_mapping__create_date +msgid "Created on" +msgstr "" + +#. module: mail_layout_force +#: model:ir.model.fields,field_description:mail_layout_force.field_email_layout_mapping__display_name +msgid "Display Name" +msgstr "" + +#. module: mail_layout_force +#: model:ir.model,name:mail_layout_force.model_email_layout_mapping +msgid "Email Layout Mapping" +msgstr "" + +#. module: mail_layout_force +#: model:ir.model,name:mail_layout_force.model_mail_template +msgid "Email Templates" +msgstr "" + +#. module: mail_layout_force +#: model:ir.model,name:mail_layout_force.model_mail_thread +msgid "Email Thread" +msgstr "" + +#. module: mail_layout_force +#: model:ir.model.fields,field_description:mail_layout_force.field_mail_template__force_email_layout_id +msgid "Force Layout" +msgstr "" + +#. module: mail_layout_force +#: model:ir.model.fields,help:mail_layout_force.field_mail_template__force_email_layout_id +msgid "Force a mail layout for this template." +msgstr "" + +#. module: mail_layout_force +#: model:ir.model.fields,field_description:mail_layout_force.field_email_layout_mapping__id +msgid "ID" +msgstr "" + +#. module: mail_layout_force +#: model:ir.model.fields,field_description:mail_layout_force.field_email_layout_mapping__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: mail_layout_force +#: model:ir.model.fields,field_description:mail_layout_force.field_email_layout_mapping__write_date +msgid "Last Updated on" +msgstr "" + +#. module: mail_layout_force +#: model:ir.model.fields,field_description:mail_layout_force.field_email_layout_mapping__layout_id +msgid "Layout" +msgstr "" + +#. module: mail_layout_force +#: model_terms:ir.ui.view,arch_db:mail_layout_force.view_ir_ui_view_form_inherit +msgid "Layout Mapping" +msgstr "" + +#. module: mail_layout_force +#: model:ir.model.fields,field_description:mail_layout_force.field_ir_ui_view__layout_mapping_line_ids +msgid "Layout Mapping Line" +msgstr "" + +#. module: mail_layout_force +#: model:ir.model.fields,field_description:mail_layout_force.field_email_layout_mapping__model_ids +msgid "Models" +msgstr "" + +#. module: mail_layout_force +#: model:ir.model.fields,help:mail_layout_force.field_email_layout_mapping__substitute_layout_id +msgid "Select a target layout." +msgstr "" + +#. module: mail_layout_force +#: model:ir.model.fields,help:mail_layout_force.field_email_layout_mapping__model_ids +msgid "Select models that the swapping applies to." +msgstr "" + +#. module: mail_layout_force +#: model:ir.model.fields,field_description:mail_layout_force.field_email_layout_mapping__substitute_layout_id +msgid "Substitute Layout" +msgstr "" + +#. module: mail_layout_force +#: model:ir.model,name:mail_layout_force.model_ir_ui_view +msgid "View" +msgstr "" diff --git a/mail_layout_force/models/__init__.py b/mail_layout_force/models/__init__.py new file mode 100644 index 00000000..e37fa21e --- /dev/null +++ b/mail_layout_force/models/__init__.py @@ -0,0 +1,4 @@ +from . import email_layout_mapping +from . import ir_ui_view +from . import mail_template +from . import mail_thread diff --git a/mail_layout_force/models/email_layout_mapping.py b/mail_layout_force/models/email_layout_mapping.py new file mode 100644 index 00000000..b8e162e4 --- /dev/null +++ b/mail_layout_force/models/email_layout_mapping.py @@ -0,0 +1,20 @@ +# Copyright 2025 Quartile (https://www.quartile.co) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class EmailLayoutMapping(models.Model): + _name = "email.layout.mapping" + _description = "Email Layout Mapping" + + layout_id = fields.Many2one("ir.ui.view", ondelete="cascade") + substitute_layout_id = fields.Many2one( + "ir.ui.view", + domain=[("type", "=", "qweb")], + required=True, + help="Select a target layout.", + ) + model_ids = fields.Many2many( + "ir.model", string="Models", help="Select models that the swapping applies to." + ) diff --git a/mail_layout_force/models/ir_ui_view.py b/mail_layout_force/models/ir_ui_view.py new file mode 100644 index 00000000..ae9b7215 --- /dev/null +++ b/mail_layout_force/models/ir_ui_view.py @@ -0,0 +1,10 @@ +# Copyright 2025 Quartile (https://www.quartile.co) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class IrUiView(models.Model): + _inherit = "ir.ui.view" + + layout_mapping_line_ids = fields.One2many("email.layout.mapping", "layout_id") diff --git a/mail_layout_force/models/mail_template.py b/mail_layout_force/models/mail_template.py new file mode 100644 index 00000000..5fc5af44 --- /dev/null +++ b/mail_layout_force/models/mail_template.py @@ -0,0 +1,35 @@ +# Copyright 2022 Camptocamp SA (https://www.camptocamp.com). +# @author Iván Todorovich +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class MailTemplate(models.Model): + _inherit = "mail.template" + + force_email_layout_id = fields.Many2one( + comodel_name="ir.ui.view", + string="Force Layout", + domain=[("type", "=", "qweb"), ("mode", "=", "primary")], + compute="_compute_force_email_layout_id", + inverse="_inverse_force_email_layout_id", + help="Force a mail layout for this template.", + ) + + @api.depends("email_layout_xmlid") + def _compute_force_email_layout_id(self): + for template in self: + if template.email_layout_xmlid: + template.force_email_layout_id = self.env.ref( + template.email_layout_xmlid, raise_if_not_found=False + ) + else: + template.force_email_layout_id = False + + def _inverse_force_email_layout_id(self): + for template in self: + if template.force_email_layout_id: + template.email_layout_xmlid = template.force_email_layout_id.xml_id + else: + template.email_layout_xmlid = False diff --git a/mail_layout_force/models/mail_thread.py b/mail_layout_force/models/mail_thread.py new file mode 100644 index 00000000..d5880949 --- /dev/null +++ b/mail_layout_force/models/mail_thread.py @@ -0,0 +1,64 @@ +# Copyright 2022 Camptocamp SA (https://www.camptocamp.com). +# @author Iván Todorovich +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import models + + +class MailThread(models.AbstractModel): + _inherit = "mail.thread" + + def _notify_thread_by_email( + self, + message, + recipients_data, + msg_vals=False, + mail_auto_delete=True, + model_description=False, + force_email_company=False, + force_email_lang=False, + subtitles=None, + resend_existing=False, + force_send=True, + send_after_commit=True, + **kwargs, + ): + msg_vals = msg_vals or {} + layout_xmlid = ( + msg_vals.get("email_layout_xmlid") + or message.email_layout_xmlid + or "mail.mail_notification_layout" + ) + layout = self.env.ref(layout_xmlid, raise_if_not_found=True) + res_model = ( + self.env["ir.model"].sudo().search([("model", "=", self._name)], limit=1) + ) + mapping = self.env["email.layout.mapping"].search( + [("layout_id", "=", layout.id), ("model_ids", "in", res_model.ids)], + limit=1, + ) + if not mapping: + mapping = self.env["email.layout.mapping"].search( + [("layout_id", "=", layout.id), ("model_ids", "=", False)], limit=1 + ) + if mapping: + substitute_layout = mapping.substitute_layout_id + if not substitute_layout.xml_id: + substitute_layout._export_rows([["id"]]) + # Refresh cache to get xml_id assigned by _export_rows + substitute_layout.invalidate_recordset() + msg_vals["email_layout_xmlid"] = mapping.substitute_layout_id.xml_id + return super()._notify_thread_by_email( + message, + recipients_data, + msg_vals=msg_vals, + mail_auto_delete=mail_auto_delete, + model_description=model_description, + force_email_company=force_email_company, + force_email_lang=force_email_lang, + subtitles=subtitles, + resend_existing=resend_existing, + force_send=force_send, + send_after_commit=send_after_commit, + **kwargs, + ) diff --git a/mail_layout_force/pyproject.toml b/mail_layout_force/pyproject.toml new file mode 100644 index 00000000..4231d0cc --- /dev/null +++ b/mail_layout_force/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/mail_layout_force/readme/CONFIGURE.md b/mail_layout_force/readme/CONFIGURE.md new file mode 100644 index 00000000..c67d8387 --- /dev/null +++ b/mail_layout_force/readme/CONFIGURE.md @@ -0,0 +1,25 @@ +\# Go to Configuration \> Technical \> Emails \> Templates \# Open the +desired `email.template` record. \# In Advanced Parameters tab, find the +Force Layout field. + +You can leave it empty to use the default email layout (chosen by Odoo). +You can force a custom email layout of your own. You can use the *Mail: +No-Layout notification template* to prevent Odoo from adding a layout. + +To configure a custom layout of your own, some technical knowledge is +needed. You can see how the existing layouts are defined for details or +inspiration: + +- `mail.mail_notification_light` +- `mail.mail_notification_paynow` +- `mail.mail_notification_borders` + +To force a new custom layout for emails that do not use an existing ``email.template`` +record (e.g., emails sent from the chatter): + +#. Go to Settings > Technical > User Interface > Views. +#. Copy the current layout (e.g., mail.message_notification_email) to create a new one, and remove any parts you don’t need. +#. Open the layout that you want to swap with a substitute. Then, under the Layout Mapping tab: + * Set ``Substitute Layout`` to the new custom layout you created. + * Set ``Models`` if you want to apply the replacement only to specific models. If left empty, + the email layout will be replaced for all models. diff --git a/mail_layout_force/readme/CONTRIBUTORS.md b/mail_layout_force/readme/CONTRIBUTORS.md new file mode 100644 index 00000000..c78cf379 --- /dev/null +++ b/mail_layout_force/readme/CONTRIBUTORS.md @@ -0,0 +1,8 @@ +* `Camptocamp `_ + + * Iván Todorovich +* Abraham Anes +* `Quartile `_ + + * Aung Ko Ko Lin + * Yoshi Tashiro \ No newline at end of file diff --git a/mail_layout_force/readme/DESCRIPTION.md b/mail_layout_force/readme/DESCRIPTION.md new file mode 100644 index 00000000..798c3b48 --- /dev/null +++ b/mail_layout_force/readme/DESCRIPTION.md @@ -0,0 +1,20 @@ +Odoo will add a default email layout on most commercial communications. + +The email layout is a ``QWeb`` view that ends up wrapping the message body +when sending an email. It usually displays the related document reference, +the company logo, and a small footer saying "Powered by Odoo". + +There are notably two main layouts used in Odoo, and the user can't control when +they're used, as it's hardcoded into the different applications. + +* ``mail.message_notification_email`` +* ``mail.mail_notification_light`` +* ``mail.mail_notification_paynow`` + +This module allows to force a specific layout for a given ``email.template``, +effectively overwritting the one hardcoded by Odoo. Additionally, it enables +forcing a custom layout for emails that do not use an existing ``email.template`` +record (e.g., when sending an email from the chatter). + +This allows you to fully customize the way Odoo emails are rendered and sent +to your customers. diff --git a/mail_layout_force/security/ir.model.access.csv b/mail_layout_force/security/ir.model.access.csv new file mode 100644 index 00000000..3e32b44d --- /dev/null +++ b/mail_layout_force/security/ir.model.access.csv @@ -0,0 +1,5 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_email_layout_mapping_public,email.layout.mapping.public,model_email_layout_mapping,base.group_public,1,0,0,0 +access_email_layout_mapping_portal,email.layout.mapping.portal,model_email_layout_mapping,base.group_portal,1,0,0,0 +access_email_layout_mapping_user,email.layout.mapping.user,model_email_layout_mapping,base.group_user,1,0,0,0 +access_email_layout_mapping_admin,email.layout.mapping.admin,model_email_layout_mapping,base.group_system,1,1,1,1 diff --git a/mail_layout_force/static/description/icon.png b/mail_layout_force/static/description/icon.png new file mode 100644 index 00000000..3a0328b5 Binary files /dev/null and b/mail_layout_force/static/description/icon.png differ diff --git a/mail_layout_force/static/description/index.html b/mail_layout_force/static/description/index.html new file mode 100644 index 00000000..426ae346 --- /dev/null +++ b/mail_layout_force/static/description/index.html @@ -0,0 +1,480 @@ + + + + + +Mail Layout Force + + + +
+

Mail Layout Force

+ + +

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

+

Odoo will add a default email layout on most commercial communications.

+

The email layout is a QWeb view that ends up wrapping the message +body when sending an email. It usually displays the related document +reference, the company logo, and a small footer saying “Powered by +Odoo”.

+

There are notably two main layouts used in Odoo, and the user can’t +control when they’re used, as it’s hardcoded into the different +applications.

+
    +
  • mail.message_notification_email
  • +
  • mail.mail_notification_light
  • +
  • mail.mail_notification_paynow
  • +
+

This module allows to force a specific layout for a given +email.template, effectively overwritting the one hardcoded by Odoo. +Additionally, it enables forcing a custom layout for emails that do not +use an existing email.template record (e.g., when sending an email +from the chatter).

+

This allows you to fully customize the way Odoo emails are rendered and +sent to your customers.

+

Table of contents

+ +
+

Configuration

+

# Go to Configuration > Technical > Emails > Templates # Open the +desired email.template record. # In Advanced Parameters tab, find +the Force Layout field.

+

You can leave it empty to use the default email layout (chosen by Odoo). +You can force a custom email layout of your own. You can use the Mail: +No-Layout notification template to prevent Odoo from adding a layout.

+

To configure a custom layout of your own, some technical knowledge is +needed. You can see how the existing layouts are defined for details or +inspiration:

+
    +
  • mail.mail_notification_light
  • +
  • mail.mail_notification_paynow
  • +
  • mail.mail_notification_borders
  • +
+

To force a new custom layout for emails that do not use an existing +email.template record (e.g., emails sent from the chatter):

+

#. Go to Settings > Technical > User Interface > Views. #. Copy the +current layout (e.g., mail.message_notification_email) to create a new +one, and remove any parts you don’t need. #. Open the layout that you +want to swap with a substitute. Then, under the Layout Mapping tab: * +Set Substitute Layout to the new custom layout you created. * Set +Models if you want to apply the replacement only to specific models. +If left empty, the email layout will be replaced for all models.

+
+
+

Bug Tracker

+

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

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Camptocamp
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

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

+

Current maintainer:

+

ivantodorovich

+

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_layout_force/tests/__init__.py b/mail_layout_force/tests/__init__.py new file mode 100644 index 00000000..9fd17597 --- /dev/null +++ b/mail_layout_force/tests/__init__.py @@ -0,0 +1 @@ +from . import test_mail_layout_force diff --git a/mail_layout_force/tests/test_mail_layout_force.py b/mail_layout_force/tests/test_mail_layout_force.py new file mode 100644 index 00000000..6052d9bb --- /dev/null +++ b/mail_layout_force/tests/test_mail_layout_force.py @@ -0,0 +1,94 @@ +# Copyright 2022 Camptocamp SA (https://www.camptocamp.com). +# @author Iván Todorovich +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + + +from odoo import Command +from odoo.tests.common import TransactionCase + + +class TestMailLayoutForce(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.view = cls.env["ir.ui.view"].create( + { + "name": "Test QWeb View", + "type": "qweb", + "mode": "primary", + "arch": "
Test
", + } + ) + cls.view_xml_id = "mail_layout_force.test_qweb_view" + cls.env["ir.model.data"].create( + { + "module": "mail_layout_force", + "name": "test_qweb_view", + "model": "ir.ui.view", + "res_id": cls.view.id, + } + ) + cls.mail_notification_layout = cls.env.ref("mail.mail_notification_layout") + cls.layout_substitute = cls.env["ir.ui.view"].create( + { + "name": "Substitute Layout", + "type": "qweb", + "mode": "primary", + "arch": """ + +
+
+

Substituted

+ """, + } + ) + cls.template = cls.env["mail.template"].create( + { + "name": "Test Template", + "model_id": cls.env.ref("base.model_res_partner").id, + "force_email_layout_id": cls.view.id, + } + ) + cls.partner = cls.env.ref("base.res_partner_10") + cls.partner.message_ids.unlink() + cls.partner.message_subscribe([cls.partner.id]) + + def test_chatter_message_uses_default_layout(self): + self.partner.message_post( + body="Test Message", + email_layout_xmlid=self.mail_notification_layout.xml_id, + message_type="email", + subtype_xmlid="mail.mt_comment", + mail_auto_delete=False, + force_send=True, + ) + message = self.partner.message_ids[-1] + self.assertNotIn("

Substituted

", message.mail_ids.body_html) + self.assertIn("Test Message", message.mail_ids.body_html) + + def test_chatter_message_uses_substituted_layout(self): + self.mail_notification_layout.layout_mapping_line_ids = [ + Command.create({"substitute_layout_id": self.layout_substitute.id}) + ] + self.partner.message_post( + body="Test Message", + email_layout_xmlid=self.mail_notification_layout.xml_id, + message_type="email", + subtype_xmlid="mail.mt_comment", + mail_auto_delete=False, + force_send=True, + ) + message = self.partner.message_ids[-1] + self.assertIn("

Substituted

", message.mail_ids.body_html) + self.assertIn("Test Message", message.mail_ids.body_html) + + def test_inverse_method_sets_xmlid(self): + self.assertEqual(self.template.email_layout_xmlid, self.view_xml_id) + self.template.force_email_layout_id = False + self.assertFalse(self.template.email_layout_xmlid) + + def test_compute_method_gets_view(self): + self.template.email_layout_xmlid = self.view_xml_id + self.assertEqual(self.template.force_email_layout_id, self.view) + self.template.email_layout_xmlid = False + self.assertFalse(self.template.force_email_layout_id) diff --git a/mail_layout_force/views/ir_ui_views.xml b/mail_layout_force/views/ir_ui_views.xml new file mode 100644 index 00000000..cb29b28f --- /dev/null +++ b/mail_layout_force/views/ir_ui_views.xml @@ -0,0 +1,24 @@ + + + + ir.ui.view.form.inherit + ir.ui.view + + + + + + + + + + + + + + + diff --git a/mail_layout_force/views/mail_template.xml b/mail_layout_force/views/mail_template.xml new file mode 100644 index 00000000..003983d7 --- /dev/null +++ b/mail_layout_force/views/mail_template.xml @@ -0,0 +1,17 @@ + + + + + mail.template + + + + + + + +