From 5ad9686b2fd0e3d065c93162c6bcddb1cc0e3bf0 Mon Sep 17 00:00:00 2001 From: Mahamadasif Ansari Date: Thu, 30 Mar 2023 10:10:23 +0000 Subject: [PATCH] [FIX] mail: composer non-thread _compute_subject When using the composer on a non-thread model a notification is sent instead of posting a message, as the model does not support the posting process. However there is currently a crash due to the default subject computation which is solved in this commit. Task-3254379 Part-of: odoo/odoo#117763 --- addons/mail/wizard/mail_compose_message.py | 11 +++--- addons/test_mail/tests/test_mail_composer.py | 37 ++++++++++++-------- 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/addons/mail/wizard/mail_compose_message.py b/addons/mail/wizard/mail_compose_message.py index cbd83e193ae..c9213eb02e5 100644 --- a/addons/mail/wizard/mail_compose_message.py +++ b/addons/mail/wizard/mail_compose_message.py @@ -195,8 +195,8 @@ class MailComposer(models.TransientModel): for composer in self: composer._evaluate_res_domain() - @api.depends('composition_mode', 'model', 'parent_id', 'res_domain', - 'res_ids', 'template_id') + @api.depends('composition_mode', 'model', 'parent_id', 'record_name', + 'res_domain', 'res_ids', 'template_id') def _compute_subject(self): """ Computation is coming either form template, either from context. When having a template with a value set, copy it (in batch mode) or @@ -212,8 +212,11 @@ class MailComposer(models.TransientModel): if (not subject and composer.model and composer.composition_mode == 'comment' and not composer.composition_batch): - res_ids = composer._evaluate_res_ids() - subject = self.env[composer.model].browse(res_ids)._message_compute_subject() + if composer.model_is_thread: + res_ids = composer._evaluate_res_ids() + subject = self.env[composer.model].browse(res_ids)._message_compute_subject() + else: + subject = composer.record_name composer.subject = subject @api.depends('composition_mode', 'model', 'res_domain', 'res_ids', diff --git a/addons/test_mail/tests/test_mail_composer.py b/addons/test_mail/tests/test_mail_composer.py index aa46c1aa3f6..b74993a726b 100644 --- a/addons/test_mail/tests/test_mail_composer.py +++ b/addons/test_mail/tests/test_mail_composer.py @@ -1201,34 +1201,41 @@ class TestComposerResultsComment(TestMailComposer, CronMixinCase): @users('employee') def test_mail_composer_default_subject(self): """ Make sure the default subject is applied in the composer. """ - simple_record = self.env['mail.test.simple'].create({'name': 'TestSimple'}) - ticket_record = self.env['mail.test.ticket'].create({'name': 'TestTicket'}) + simple_record = self.env['mail.test.simple'].create({'name': 'TestA'}) + ticket_record = self.env['mail.test.ticket'].create({'name': 'Test1'}) + nonthread_record = self.env['mail.test.nothread'].create({'name': 'TestNoThread'}) - # default behavior: use record name - _, message = self.env['mail.compose.message'].with_context( - self._get_web_context(simple_record, add_web=False, composition_mode='comment') - ).create({ + # default behavior: use the record name + ctx = self._get_web_context(simple_record, add_web=False, default_composition_mode='comment') + _, message = self.env['mail.compose.message'].with_context(ctx).create({ 'body': '

Test Body

', })._action_send_mail() self.assertEqual(message.subject, simple_record.name) - # overridden in model - _, message = self.env['mail.compose.message'].with_context( - self._get_web_context(ticket_record, add_web=False, composition_mode='comment') - ).create({ + # default behavior without thread: use record name + ctx = self._get_web_context(nonthread_record, add_web=False, default_composition_mode='comment') + _, message = self.env['mail.compose.message'].with_context(ctx).create({ + 'body': '

Test Body

', + 'partner_ids': self.env.user.partner_id.ids, + })._action_send_mail() + self.assertEqual(message.record_name, nonthread_record.name) + self.assertEqual(message.subject, nonthread_record.name) + + # custom subject + ctx = self._get_web_context(ticket_record, add_web=False, default_composition_mode='comment') + _, message = self.env['mail.compose.message'].with_context(ctx).create({ 'body': '

Test Body

', })._action_send_mail() self.assertEqual(message.subject, ticket_record._message_compute_subject()) - self.assertIn(f'Ticket for {ticket_record.name}', message.subject) + self.assertEqual(message.subject, f'Ticket for {ticket_record.name} on {ticket_record.datetime.strftime("%m/%d/%Y, %H:%M:%S")}') # forced value - _, message = self.env['mail.compose.message'].with_context( - self._get_web_context(ticket_record, add_web=False, composition_mode='comment') - ).create({ + ctx = self._get_web_context(ticket_record, add_web=False, default_composition_mode='comment') + _, message = self.env['mail.compose.message'].with_context(ctx).create({ 'body': '

Test Body

', 'subject': 'Forced Subject', })._action_send_mail() - self.assertEqual(message.subject, 'Forced Subject',) + self.assertEqual(message.subject, 'Forced Subject') @users('employee') @mute_logger('odoo.tests', 'odoo.addons.mail.models.mail_mail', 'odoo.models.unlink')