Files
odoo_source/addons/mail/wizard/mail_wizard_invite.py
T
Yannick Tivisse b1f7e56f79 [IMP] base: Remove private res.partner type
- Improve performances, as the ir.rule restricting private partners
  visibility is also applied on res.users by inheritance, on each
  prefetch.
- Solve the issue of partners set as followers on records (eg: application
  form) and then made private, making them impossible to contact via the
  chatter.
- Solve the multiple access issues when trying to access the bank
  account, or the private address for non HR people like the accountants
  forcing the usage of sudo in the business code.

TaskID: 3101400
2023-07-05 14:21:28 +02:00

80 lines
3.4 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from lxml import etree
from lxml.html import builder as html
from odoo import _, api, fields, models
from odoo.exceptions import UserError
from odoo.tools import is_html_empty
class Invite(models.TransientModel):
""" Wizard to invite partners (or channels) and make them followers. """
_name = 'mail.wizard.invite'
_description = 'Invite wizard'
@api.model
def default_get(self, fields):
result = super(Invite, self).default_get(fields)
if 'message' not in fields:
return result
user_name = self.env.user.display_name
model = result.get('res_model')
res_id = result.get('res_id')
if model and res_id:
document = self.env['ir.model']._get(model).display_name
title = self.env[model].browse(res_id).display_name
msg_fmt = _('%(user_name)s invited you to follow %(document)s document: %(title)s')
else:
msg_fmt = _('%(user_name)s invited you to follow a new document.')
text = msg_fmt % locals()
message = html.DIV(
html.P(_('Hello,')),
html.P(text)
)
result['message'] = etree.tostring(message)
return result
res_model = fields.Char('Related Document Model', required=True, help='Model of the followed resource')
res_id = fields.Integer('Related Document ID', help='Id of the followed resource')
partner_ids = fields.Many2many('res.partner', string='Recipients')
message = fields.Html('Message')
notify = fields.Boolean('Send Notification', default=True)
def add_followers(self):
if not self.env.user.email:
raise UserError(_("Unable to post message, please configure the sender's email address."))
email_from = self.env.user.email_formatted
for wizard in self:
Model = self.env[wizard.res_model]
document = Model.browse(wizard.res_id)
# filter partner_ids to get the new followers, to avoid sending email to already following partners
new_partners = wizard.partner_ids - document.sudo().message_partner_ids
document.message_subscribe(partner_ids=new_partners.ids)
model_name = self.env['ir.model']._get(wizard.res_model).display_name
# send a notification if option checked and if a message exists (do not send void notifications)
if wizard.notify and wizard.message and not is_html_empty(wizard.message):
message_values = wizard._prepare_message_values(document, model_name, email_from)
message_values['partner_ids'] = new_partners.ids
document.message_notify(**message_values)
return {'type': 'ir.actions.act_window_close'}
def _prepare_message_values(self, document, model_name, email_from):
return {
'subject': _('Invitation to follow %(document_model)s: %(document_name)s', document_model=model_name,
document_name=document.display_name),
'body': self.message,
'record_name': document.display_name,
'email_from': email_from,
'reply_to': email_from,
'model': self.res_model,
'res_id': self.res_id,
'reply_to_force_new': True,
'email_add_signature': True,
}