diff --git a/addons/mail/models/mail_template.py b/addons/mail/models/mail_template.py index b14205a460b..a72cad177db 100644 --- a/addons/mail/models/mail_template.py +++ b/addons/mail/models/mail_template.py @@ -71,6 +71,7 @@ class MailTemplate(models.Model): column2='ir_actions_report_id', string='Dynamic Reports', domain="[('model', '=', model)]") + email_layout_xmlid = fields.Char('Email Notification Layout', copy=False) # options mail_server_id = fields.Many2one('ir.mail_server', 'Outgoing Mail Server', readonly=False, help="Optional preferred server for outgoing mails. If not set, the highest " @@ -424,6 +425,8 @@ class MailTemplate(models.Model): # technical settings if 'auto_delete' in render_fields: values['auto_delete'] = self.auto_delete + if 'email_layout_xmlid' in render_fields: + values['email_layout_xmlid'] = self.email_layout_xmlid if 'mail_server_id' in render_fields: values['mail_server_id'] = self.mail_server_id.id if 'model' in render_fields: @@ -461,6 +464,7 @@ class MailTemplate(models.Model): 'scheduled_date', # specific # not rendered (static) 'auto_delete', + 'email_layout_xmlid', 'mail_server_id', 'model', 'res_id', @@ -569,6 +573,7 @@ class MailTemplate(models.Model): if 'email_from' in values and not values.get('email_from'): values.pop('email_from') # encapsulate body + email_layout_xmlid = email_layout_xmlid or self.email_layout_xmlid if email_layout_xmlid and values['body_html']: record = self.env[self.model].browse(res_id) model = self.env['ir.model']._get(record._name) diff --git a/addons/mail/wizard/mail_compose_message.py b/addons/mail/wizard/mail_compose_message.py index c503f5213c9..1a4fe63bebc 100644 --- a/addons/mail/wizard/mail_compose_message.py +++ b/addons/mail/wizard/mail_compose_message.py @@ -92,7 +92,10 @@ class MailComposer(models.TransientModel): 'ir.attachment', 'mail_compose_message_ir_attachments_rel', 'wizard_id', 'attachment_id', string='Attachments', compute='_compute_attachment_ids', readonly=False, store=True) - email_layout_xmlid = fields.Char('Email Notification Layout', copy=False) + email_layout_xmlid = fields.Char( + 'Email Notification Layout', + compute='_compute_email_layout_xmlid', readonly=False, store=True, + copy=False) email_add_signature = fields.Boolean( 'Add signature', compute='_compute_email_add_signature', readonly=False, store=True) @@ -275,6 +278,17 @@ class MailComposer(models.TransientModel): else: composer.email_add_signature = not bool(composer.template_id) + @api.depends('template_id') + def _compute_email_layout_xmlid(self): + """ Computation is coming either from template, either reset. When + having a template with a value set, set it on composer.When removing + the template, reset it. """ + for composer in self: + if composer.template_id.email_layout_xmlid: + composer.email_layout_xmlid = composer.template_id.email_layout_xmlid + if not composer.template_id: + composer.email_layout_xmlid = False + @api.depends('composition_mode', 'email_from', 'model', 'res_domain', 'res_ids', 'template_id') def _compute_authorship(self): diff --git a/addons/test_mail/tests/test_mail_composer.py b/addons/test_mail/tests/test_mail_composer.py index 19d33643386..a399ee0521a 100644 --- a/addons/test_mail/tests/test_mail_composer.py +++ b/addons/test_mail/tests/test_mail_composer.py @@ -95,6 +95,13 @@ class TestMailComposer(TestMailCommon, TestRecipients): 'scheduled_date': '{{ (object.create_date or datetime.datetime(2022, 12, 26, 18, 0, 0)) + datetime.timedelta(days=2) }}', }) + # activate translations + cls._activate_multi_lang( + layout_arch_db=None, # use default mail.test_layout + test_record=cls.test_records, + test_template=cls.template, + ) + def _get_web_context(self, records, add_web=True, **values): """ Helper to generate composer context. Will make tests a bit less verbose. @@ -1332,13 +1339,17 @@ class TestComposerResultsComment(TestMailComposer, CronMixinCase): attachs = self.env['ir.attachment'].search([('name', 'in', [a['name'] for a in attachment_data])]) self.assertEqual(len(attachs), 2) - for batch_mode, scheduled_date in product( + for batch_mode, scheduled_date, email_layout_xmlid in product( (False, True, 'domain'), - (False, '{{ (object.create_date or datetime.datetime(2022, 12, 26, 18, 0, 0)) + datetime.timedelta(days=2) }}') + (False, '{{ (object.create_date or datetime.datetime(2022, 12, 26, 18, 0, 0)) + datetime.timedelta(days=2) }}'), + (False, 'mail.test_layout'), ): with self.subTest(batch_mode=batch_mode, scheduled_date=scheduled_date): batch = bool(batch_mode) - self.template.write({'scheduled_date': scheduled_date}) + self.template.write({ + 'scheduled_date': scheduled_date, + 'email_layout_xmlid': email_layout_xmlid, + }) test_records = self.test_records if batch else self.test_record # ensure initial data @@ -1361,6 +1372,7 @@ class TestComposerResultsComment(TestMailComposer, CronMixinCase): # open a composer and run it in comment mode composer_form = Form(self.env['mail.compose.message'].with_context(ctx)) composer = composer_form.save() + self.assertEqual(composer.email_layout_xmlid, email_layout_xmlid) # ensure some parameters used afterwards if batch: