From c1504fb4292f68fe5dbb92fea320dab853aecb42 Mon Sep 17 00:00:00 2001 From: "Didier (did)" Date: Tue, 9 Mar 2021 16:46:41 +0000 Subject: [PATCH] [FIX] mail, test_mail: ensure thread name is up to date on message MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When formatting a message, a message could be with an empty or obsolete record_name field. It's better to rely on the relation between the message and the thread and fetch the current thread name. task-2411715 closes odoo/odoo#63000 closes odoo/odoo#67549 X-original-commit: 51e962803d2048efeb0f7e96a9fe561ac49ee05a Signed-off-by: Sébastien Theys (seb) --- addons/mail/i18n/mail.pot | 8 +++++ addons/mail/models/mail_message.py | 17 ++++++++++ .../static/src/components/message/message.xml | 4 +-- addons/test_mail/tests/test_mail_message.py | 34 +++++++++++++++++++ addons/test_mail/tests/test_performance.py | 4 +-- 5 files changed, 63 insertions(+), 4 deletions(-) diff --git a/addons/mail/i18n/mail.pot b/addons/mail/i18n/mail.pot index 78982ff2abb..d3302287f19 100644 --- a/addons/mail/i18n/mail.pot +++ b/addons/mail/i18n/mail.pot @@ -6849,6 +6849,7 @@ msgstr "" #. module: mail #: code:addons/mail/models/mail_thread.py:0 +#: code:addons/mail/static/src/components/message/message.xml:0 #, python-format msgid "document" msgstr "" @@ -7076,3 +7077,10 @@ msgstr "" #: model:ir.model.fields.selection,name:mail.selection__mail_activity_type__delay_unit__weeks msgid "weeks" msgstr "" + +#. module: mail +#. openerp-web +#: code:addons/mail/static/src/components/message/message.xml:0 +#, python-format +msgid "channel" +msgstr "" diff --git a/addons/mail/models/mail_message.py b/addons/mail/models/mail_message.py index da31b2c2b76..b9dd993437a 100644 --- a/addons/mail/models/mail_message.py +++ b/addons/mail/models/mail_message.py @@ -3,6 +3,7 @@ import logging import re +from collections import defaultdict from binascii import Error as binascii_error from operator import itemgetter @@ -991,6 +992,12 @@ class Message(models.Model): self.check_access_rule('read') vals_list = self._read_format(fnames) safari = request and request.httprequest.user_agent.browser == 'safari' + + thread_ids_by_model_name = defaultdict(set) + for message in self: + if message.model and message.res_id: + thread_ids_by_model_name[message.model].add(message.res_id) + for vals in vals_list: message_sudo = self.browse(vals['id']).sudo().with_prefetch(self.ids) @@ -1031,11 +1038,21 @@ class Message(models.Model): 'currency_id': tracking.currency_id.id, }) + if message_sudo.model and message_sudo.res_id: + record_name = self.env[message_sudo.model] \ + .browse(message_sudo.res_id) \ + .sudo() \ + .with_prefetch(thread_ids_by_model_name[message_sudo.model]) \ + .display_name + else: + record_name = False + vals.update({ 'author_id': author, 'notifications': message_sudo.notification_ids._filtered_for_web_client()._notification_format(), 'attachment_ids': attachment_ids, 'tracking_value_ids': tracking_value_ids, + 'record_name': record_name, }) return vals_list diff --git a/addons/mail/static/src/components/message/message.xml b/addons/mail/static/src/components/message/message.xml index ffc376ee1e7..f67fb41673f 100644 --- a/addons/mail/static/src/components/message/message.xml +++ b/addons/mail/static/src/components/message/message.xml @@ -83,10 +83,10 @@
- (from #) + (from #channel) - on + on document
diff --git a/addons/test_mail/tests/test_mail_message.py b/addons/test_mail/tests/test_mail_message.py index b24c552f855..8cf04011b6b 100644 --- a/addons/test_mail/tests/test_mail_message.py +++ b/addons/test_mail/tests/test_mail_message.py @@ -26,6 +26,40 @@ class TestMessageValues(TestMailCommon): }) cls.Message = cls.env['mail.message'].with_user(cls.user_employee) + @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') + + @mute_logger('odoo.models.unlink') + def test_mail_message_format_access(self): + """ + User that doesn't have access to a record should still be able to fetch + the record_name inside message_format. + """ + company_2 = self.env['res.company'].create({'name': 'Second Test Company'}) + record1 = self.env['mail.test.multi.company'].create({ + 'name': 'Test1', + 'company_id': company_2.id, + }) + message = record1.message_post(body='', partner_ids=[self.user_employee.partner_id.id]) + # We need to flush and invalidate the ORM cache since the record_name + # is already cached from the creation. Otherwise it will leak inside + # message_format. + message.flush() + message.invalidate_cache() + res = message.with_user(self.user_employee).message_format() + self.assertEqual(res[0].get('record_name'), 'Test1') + @mute_logger('odoo.models.unlink') def test_mail_message_values_no_document_values(self): msg = self.Message.create({ diff --git a/addons/test_mail/tests/test_performance.py b/addons/test_mail/tests/test_performance.py index 64065b1ad3c..37095b8e79c 100644 --- a/addons/test_mail/tests/test_performance.py +++ b/addons/test_mail/tests/test_performance.py @@ -838,7 +838,7 @@ class TestMailComplexPerformance(BaseMailPerformance): def test_message_format_group_thread_name_by_model(self): """Ensures the fetch of multiple thread names is grouped by model.""" records = [] - for i in range(5): + for _i in range(5): records.append(self.env['mail.test.simple'].create({'name': 'Test'})) records.append(self.env['mail.test.track'].create({'name': 'Test'})) @@ -854,7 +854,7 @@ class TestMailComplexPerformance(BaseMailPerformance): messages.flush() messages.invalidate_cache() - with self.assertQueryCount(emp=13): + with self.assertQueryCount(emp=15): res = messages.message_format() self.assertEqual(len(res), 6)