summaryrefslogtreecommitdiff
path: root/addons/mail/wizard/mail_template_preview.py
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/mail/wizard/mail_template_preview.py
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/mail/wizard/mail_template_preview.py')
-rw-r--r--addons/mail/wizard/mail_template_preview.py86
1 files changed, 86 insertions, 0 deletions
diff --git a/addons/mail/wizard/mail_template_preview.py b/addons/mail/wizard/mail_template_preview.py
new file mode 100644
index 00000000..03062bee
--- /dev/null
+++ b/addons/mail/wizard/mail_template_preview.py
@@ -0,0 +1,86 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import api, fields, models
+from odoo.exceptions import UserError
+
+
+class MailTemplatePreview(models.TransientModel):
+ _name = 'mail.template.preview'
+ _description = 'Email Template Preview'
+ _MAIL_TEMPLATE_FIELDS = ['subject', 'body_html', 'email_from', 'email_to',
+ 'email_cc', 'reply_to', 'scheduled_date', 'attachment_ids']
+
+ @api.model
+ def _selection_target_model(self):
+ return [(model.model, model.name) for model in self.env['ir.model'].search([])]
+
+ @api.model
+ def _selection_languages(self):
+ return self.env['res.lang'].get_installed()
+
+ @api.model
+ def default_get(self, fields):
+ result = super(MailTemplatePreview, self).default_get(fields)
+ if not result.get('mail_template_id') or 'resource_ref' not in fields:
+ return result
+ mail_template = self.env['mail.template'].browse(result['mail_template_id'])
+ res = self.env[mail_template.model_id.model].search([], limit=1)
+ if res:
+ result['resource_ref'] = '%s,%s' % (mail_template.model_id.model, res.id)
+ return result
+
+ mail_template_id = fields.Many2one('mail.template', string='Related Mail Template', required=True)
+ model_id = fields.Many2one('ir.model', string='Targeted model', related="mail_template_id.model_id")
+ resource_ref = fields.Reference(string='Record', selection='_selection_target_model')
+ lang = fields.Selection(_selection_languages, string='Template Preview Language')
+ no_record = fields.Boolean('No Record', compute='_compute_no_record')
+ error_msg = fields.Char('Error Message', readonly=True)
+ # Fields same than the mail.template model, computed with resource_ref and lang
+ subject = fields.Char('Subject', compute='_compute_mail_template_fields')
+ email_from = fields.Char('From', compute='_compute_mail_template_fields', help="Sender address")
+ email_to = fields.Char('To', compute='_compute_mail_template_fields',
+ help="Comma-separated recipient addresses")
+ email_cc = fields.Char('Cc', compute='_compute_mail_template_fields', help="Carbon copy recipients")
+ reply_to = fields.Char('Reply-To', compute='_compute_mail_template_fields', help="Preferred response address")
+ scheduled_date = fields.Char('Scheduled Date', compute='_compute_mail_template_fields',
+ help="The queue manager will send the email after the date")
+ body_html = fields.Html('Body', compute='_compute_mail_template_fields', sanitize=False)
+ attachment_ids = fields.Many2many('ir.attachment', 'Attachments', compute='_compute_mail_template_fields')
+ # Extra fields info generated by generate_email
+ partner_ids = fields.Many2many('res.partner', string='Recipients', compute='_compute_mail_template_fields')
+
+ @api.depends('model_id')
+ def _compute_no_record(self):
+ for preview in self:
+ preview.no_record = (self.env[preview.model_id.model].search_count([]) == 0) if preview.model_id else True
+
+ @api.depends('lang', 'resource_ref')
+ def _compute_mail_template_fields(self):
+ """ Preview the mail template (body, subject, ...) depending of the language and
+ the record reference, more precisely the record id for the defined model of the mail template.
+ If no record id is selectable/set, the jinja placeholders won't be replace in the display information. """
+ copy_depends_values = {'lang': self.lang}
+ mail_template = self.mail_template_id.with_context(lang=self.lang)
+ try:
+ if not self.resource_ref:
+ self._set_mail_attributes()
+ else:
+ copy_depends_values['resource_ref'] = '%s,%s' % (self.resource_ref._name, self.resource_ref.id)
+ mail_values = mail_template.with_context(template_preview_lang=self.lang).generate_email(
+ self.resource_ref.id, self._MAIL_TEMPLATE_FIELDS)
+ self._set_mail_attributes(values=mail_values)
+ self.error_msg = False
+ except UserError as user_error:
+ self._set_mail_attributes()
+ self.error_msg = user_error.args[0]
+ finally:
+ # Avoid to be change by a invalidate_cache call (in generate_mail), e.g. Quotation / Order report
+ for key, value in copy_depends_values.items():
+ self[key] = value
+
+ def _set_mail_attributes(self, values=None):
+ for field in self._MAIL_TEMPLATE_FIELDS:
+ field_value = values.get(field, False) if values else self.mail_template_id[field]
+ self[field] = field_value
+ self.partner_ids = values.get('partner_ids', False) if values else False