From 442467ceb83c377d80e37a3918ab7d47821f4f9e Mon Sep 17 00:00:00 2001 From: Renaud Thiry Date: Tue, 28 Feb 2023 20:13:45 +0000 Subject: [PATCH] [FIX] mail: handle non-thread model in _message_format Calling _message_format on a anything but a thread could throw a traceback. Task-3254379 Part-of: odoo/odoo#117763 --- addons/mail/models/mail_message.py | 3 ++- addons/test_mail/tests/test_mail_message.py | 22 ++++++++++-------- .../tests/test_mail_thread_internals.py | 23 +++++++++++++++++++ 3 files changed, 37 insertions(+), 11 deletions(-) diff --git a/addons/mail/models/mail_message.py b/addons/mail/models/mail_message.py index 1ced8572620..b6df0852c87 100644 --- a/addons/mail/models/mail_message.py +++ b/addons/mail/models/mail_message.py @@ -884,7 +884,8 @@ class Message(models.Model): if message_sudo.model and message_sudo.res_id: record_sudo = self.env[message_sudo.model].browse(message_sudo.res_id).sudo() record_name = record_sudo.with_prefetch(thread_ids_by_model_name[message_sudo.model]).display_name - default_subject = record_sudo._message_compute_subject() + # if not a thread, display_name is the default subject + default_subject = record_sudo._message_compute_subject() if hasattr(record_sudo, '_message_compute_subject') else record_name else: record_name = False default_subject = False diff --git a/addons/test_mail/tests/test_mail_message.py b/addons/test_mail/tests/test_mail_message.py index 8530d41111d..d04e3aec4f6 100644 --- a/addons/test_mail/tests/test_mail_message.py +++ b/addons/test_mail/tests/test_mail_message.py @@ -97,16 +97,18 @@ class TestMessageValues(MailCommon): @mute_logger('odoo.models.unlink') def test_mail_message_format(self): record1 = self.env['mail.test.simple'].create({'name': 'Test1'}) - message = self.env['mail.message'].create([{ - 'model': 'mail.test.simple', - 'res_id': record1.id, - }]) - res = message.message_format() - self.assertEqual(res[0].get('record_name'), 'Test1') - - record1.write({"name": "Test2"}) - res = message.message_format() - self.assertEqual(res[0].get('record_name'), 'Test2') + record2 = self.env['mail.test.nothread'].create({'name': 'Test2'}) + messages = self.env['mail.message'].create([{ + 'model': record._name, + 'res_id': record.id, + } for record in [record1, record2]]) + for message, record in zip(messages, [record1, record2]): + with self.subTest(record=record): + formatted = message.message_format()[0] + self.assertEqual(formatted['record_name'], record.name) + record.write({'name': 'Just Test'}) + formatted = message.message_format()[0] + self.assertEqual(formatted['record_name'], 'Just Test') @mute_logger('odoo.models.unlink') def test_mail_message_format_access(self): diff --git a/addons/test_mail/tests/test_mail_thread_internals.py b/addons/test_mail/tests/test_mail_thread_internals.py index 26b1b9b7166..4bafa0458c5 100644 --- a/addons/test_mail/tests/test_mail_thread_internals.py +++ b/addons/test_mail/tests/test_mail_thread_internals.py @@ -403,6 +403,29 @@ class TestDiscuss(MailCommon, TestRecipients): class TestNoThread(MailCommon, TestRecipients): """ Specific tests for cross models thread features """ + @users('employee') + def test_message_format(self): + """ Test formatting of messages when linked to non-thread models. + Format could be asked notably if an inbox notification due to a + 'message_notify' happens. """ + test_record = self.env['mail.test.nothread'].create({ + 'customer_id': self.partner_1.id, + 'name': 'Not A Thread', + }) + message = self.env['mail.message'].create({ + 'model': test_record._name, + 'record_name': 'Not used in message_format', + 'res_id': test_record.id, + }) + formatted = message.message_format()[0] + self.assertEqual(formatted['default_subject'], test_record.name) + self.assertEqual(formatted['record_name'], test_record.name) + + test_record.write({'name': 'Just Test'}) + formatted = message.message_format()[0] + self.assertEqual(formatted['default_subject'], 'Just Test') + self.assertEqual(formatted['record_name'], 'Just Test') + @users('employee') def test_message_notify(self): """ Test notifying on non-thread models, using MailThread as an abstract