From a2f9f26c8576a3bc022d9c47b0ea4b159a2c6482 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Mon, 9 Jan 2023 09:16:22 +0000 Subject: [PATCH] [FIX] mail: better support private recipient in full composer Current behavior In the recruitment module, if you set an email template for the first step of a job recruitment process you cannot send any other email using the full composer. This happen because the partner type goes from 'contact' to 'private' and this type cannot be set as recipient in the full composer. Steps to reproduce - Go to any job recruitement and set an email template for the first step - Go on the website and apply for this job - Go back to the job application and send an email using the full composer, the email is not sent to the applicant. And the applicant is not added to the followers. Fix is to somehow improve support by adding asked partners from default in context. Note that this does not change anything from ACLs point of view, as trying to access private partners without the necessary group or ACLs will raise an access error anyway. Also note that private partners defined on a template are still stripped as they do not respect the new (nor the old) domain. That would be tricky to solve, better not use private partners in templates. opw-3010308 closes odoo/odoo#109451 X-original-commit: 12b25f21216b11511d5fed22fb3564d9dc297559 Signed-off-by: Thibault Delavallee (tde) Part-of: odoo/odoo#109522 Co-authored-by: Robin Engels --- addons/mail/tests/test_mail_composer.py | 11 +++-------- addons/mail/wizard/mail_compose_message.py | 9 ++++++++- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/addons/mail/tests/test_mail_composer.py b/addons/mail/tests/test_mail_composer.py index 846c98f8f84..c0ddca184b5 100644 --- a/addons/mail/tests/test_mail_composer.py +++ b/addons/mail/tests/test_mail_composer.py @@ -126,9 +126,8 @@ class TestMailComposerForm(TestMailComposer): ) saved_form = form.save() self.assertEqual( - # saved_form.partner_ids, partner_private + partner_classic, - saved_form.partner_ids, partner_classic, - 'Default value is kept at save (FIXME: loosing private partner)' + saved_form.partner_ids, partner_private + partner_classic, + 'Default value is kept at save' ) with self.mock_mail_gateway(): @@ -136,11 +135,7 @@ class TestMailComposerForm(TestMailComposer): message = self.test_record.message_ids[0] self.assertEqual(message.body, '

Hello

') - # self.assertEqual(message.partner_ids, partner_private + partner_classic) - self.assertEqual( - message.partner_ids, partner_classic, - 'FIXME: loosing private partner' - ) + self.assertEqual(message.partner_ids, partner_private + partner_classic) self.assertEqual(message.subject, f'{test_record.name}') @mute_logger('odoo.addons.base.models.ir_rule', 'odoo.addons.mail.models.mail_mail') diff --git a/addons/mail/wizard/mail_compose_message.py b/addons/mail/wizard/mail_compose_message.py index f766f2019c6..b6ae9990cc2 100644 --- a/addons/mail/wizard/mail_compose_message.py +++ b/addons/mail/wizard/mail_compose_message.py @@ -7,6 +7,7 @@ import re from odoo import _, api, fields, models, tools, Command from odoo.exceptions import UserError +from odoo.osv import expression from odoo.tools import email_re @@ -87,6 +88,12 @@ class MailComposer(models.TransientModel): filtered_result = dict((fname, result[fname]) for fname in result if fname in fields) return filtered_result + def _partner_ids_domain(self): + return expression.OR([ + [('type', '!=', 'private')], + [('id', 'in', self.env.context.get('default_partner_ids', []))], + ]) + # content subject = fields.Char('Subject', compute=False) body = fields.Html( @@ -142,7 +149,7 @@ class MailComposer(models.TransientModel): partner_ids = fields.Many2many( 'res.partner', 'mail_compose_message_res_partner_rel', 'wizard_id', 'partner_id', 'Additional Contacts', - domain=[('type', '!=', 'private')]) + domain=_partner_ids_domain) # sending auto_delete = fields.Boolean('Delete Emails', help='This option permanently removes any track of email after it\'s been sent, including from the Technical menu in the Settings, in order to preserve storage space of your Odoo database.')