diff --git a/addons/mail/models/mail_template.py b/addons/mail/models/mail_template.py index 4f3689ba99b15..e66ea1ba96d03 100644 --- a/addons/mail/models/mail_template.py +++ b/addons/mail/models/mail_template.py @@ -385,12 +385,20 @@ def generate_recipients(self, results, res_ids): results[res_id].pop('partner_to', None) results[res_id].update(recipients) + records_company = None + if self._context.get('tpl_partners_only') and self.model and results and 'company_id' in self.env[self.model]._fields: + records = self.env[self.model].browse(results.keys()).read(['company_id']) + records_company = {rec['id']: rec['company_id'][0] for rec in records} + for res_id, values in results.items(): partner_ids = values.get('partner_ids', list()) if self._context.get('tpl_partners_only'): mails = tools.email_split(values.pop('email_to', '')) + tools.email_split(values.pop('email_cc', '')) + Partner = self.env['res.partner'] + if records_company: + Partner = Partner.with_context(default_company_id=records_company[res_id]) for mail in mails: - partner_id = self.env['res.partner'].find_or_create(mail) + partner_id = Partner.find_or_create(mail) partner_ids.append(partner_id) partner_to = values.pop('partner_to', '') if partner_to: diff --git a/addons/test_mail/models/test_mail_models.py b/addons/test_mail/models/test_mail_models.py index 8ada6ed86c88c..3347744987f9c 100644 --- a/addons/test_mail/models/test_mail_models.py +++ b/addons/test_mail/models/test_mail_models.py @@ -26,6 +26,7 @@ class MailTestStandard(models.Model): email_from = fields.Char() user_id = fields.Many2one('res.users', 'Responsible', track_visibility='onchange') umbrella_id = fields.Many2one('mail.test', track_visibility='onchange') + company_id = fields.Many2one('res.company') class MailTestActivity(models.Model): diff --git a/addons/test_mail/tests/test_mail_template.py b/addons/test_mail/tests/test_mail_template.py index 49a05c4405556..e1b14d57a205c 100644 --- a/addons/test_mail/tests/test_mail_template.py +++ b/addons/test_mail/tests/test_mail_template.py @@ -3,6 +3,7 @@ import base64 from datetime import datetime, timedelta +from unittest.mock import patch from odoo.addons.test_mail.tests.common import BaseFunctionalTest, MockEmails, TestRecipients from odoo.addons.test_mail.tests.common import mail_new_test_user @@ -202,3 +203,36 @@ def test_template_add_context_action(self): # self.env['mail.mail'].process_email_queue(ids=[mail_in_2_days.id]) # self.assertEqual(mail_in_2_days.state, 'outgoing') # self.assertEqual(mail_now.exists() | mail_in_2_days.exists(), mail_in_2_days) + + def test_create_partner_from_tracking_multicompany(self): + company1 = self.env['res.company'].create({'name': 'company1'}) + self.env.user.write({'company_ids': [(4, company1.id, False)]}) + self.assertNotEqual(self.env.user.company_id, company1) + + email_new_partner = "diamonds@rust.com" + Partner = self.env['res.partner'] + self.assertFalse(Partner.search([('email', '=', email_new_partner)])) + + template = self.env['mail.template'].create({ + 'model_id': self.env['ir.model']._get('mail.test.track').id, + 'name': 'AutoTemplate', + 'subject': 'autoresponse', + 'email_from': self.env.user.email_formatted, + 'email_to': "${object.email_from}", + 'body_html': "
A nice body
", + }) + + def patched_message_track_post_template(*args, **kwargs): + args[0].message_post_with_template(template.id) + return True + + with patch('odoo.addons.mail.models.mail_thread.MailThread._message_track_post_template', patched_message_track_post_template): + self.env['mail.test.track'].create({ + 'email_from': email_new_partner, + 'company_id': company1.id, + 'user_id': self.env.user.id, # trigger tracking, + }) + + new_partner = Partner.search([('email', '=', email_new_partner)]) + self.assertTrue(new_partner) + self.assertEqual(new_partner.company_id, company1)