social/mail_composer_cc_bcc/wizards/mail_compose_message.py

85 lines
3.0 KiB
Python

# Copyright 2023 Camptocamp
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import Command, api, fields, models, tools
CC_BCC_FIELDS = {
"email_cc": "partner_cc_ids",
"email_bcc": "partner_bcc_ids",
}
class MailComposeMessage(models.TransientModel):
_inherit = "mail.compose.message"
@api.model
def default_get(self, fields_list):
company = self.env.company
res = super().default_get(fields_list)
partner_cc = company.default_partner_cc_ids
if partner_cc:
res["partner_cc_ids"] = [Command.set(partner_cc.ids)]
partner_bcc = company.default_partner_bcc_ids
if partner_bcc:
res["partner_bcc_ids"] = [Command.set(partner_bcc.ids)]
return res
partner_cc_ids = fields.Many2many(
"res.partner",
"mail_compose_message_res_partner_cc_rel",
"wizard_id",
"partner_id",
string="Cc",
)
partner_bcc_ids = fields.Many2many(
"res.partner",
"mail_compose_message_res_partner_bcc_rel",
"wizard_id",
"partner_id",
string="Bcc",
)
def _onchange_template_id(self, template_id, composition_mode, model, res_id):
if not template_id:
return {"value": {}}
ctx = {"is_from_composer": True}
ctx.update(self.env.context)
self_ctx = self.with_context(**ctx)
res = super(MailComposeMessage, self_ctx)._onchange_template_id(
template_id, composition_mode, model, res_id
)
res_ids = [res_id]
# tpl_partners_only need to be False for email_cc value
tmpl_ctx = self.env["mail.template"].with_context(tpl_partners_only=False)
mail_tmpl = tmpl_ctx.browse(template_id)
template_values = mail_tmpl.generate_email(res_ids, CC_BCC_FIELDS)
values = template_values[res_id]
for fname in CC_BCC_FIELDS:
value = values.get(fname, None)
if not value:
continue
self._set_partner_field(CC_BCC_FIELDS[fname], value)
return res
def _set_partner_field(self, field_name, email):
if field_name not in CC_BCC_FIELDS.values():
return
for_email = [("email", "in", tools.email_split(email))]
partner = self.env["res.partner"].search(for_email)
current_partners = getattr(self, field_name)
setattr(self, field_name, current_partners + partner)
def _action_send_mail(self, auto_commit=False):
# don't impact mass_mailing that also uses mail.compose.message
if self.composition_mode == "mass_mail":
return super()._action_send_mail(auto_commit)
context = {
"is_from_composer": True,
"partner_cc_ids": self.partner_cc_ids,
"partner_bcc_ids": self.partner_bcc_ids,
}
context.update(self.env.context)
self_super = super(MailComposeMessage, self.with_context(**context))
res = self_super._action_send_mail(auto_commit)
return res