From 120b8768bb5d5f61a66ca539ac49ca8cfe1f37a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Lef=C3=A8vre?= Date: Mon, 25 Feb 2019 09:27:08 +0000 Subject: [PATCH] [FIX] mail: Check field exists when computing groups Steps to reproduce: 1. install `hr_contract_salary` 2. create a contract 3. set or update `hr_responsible_id` on the contract (it creates a `mail.tracking.value`) 4. uninstall `hr_contract_salary` 5. go to the contract form view => traceback `hr_responsible_id` does not exist Before displaying a `mail.tracking.value`, `groups` of the fields are checked to fitler tracking values according to access rights of the user. However if the module that added the field has been uninstalled, the field does not exists anymore. Fix: check if field exists before getting fields groups. If the field does not exists: set groups to `base.group_system` closes odoo/odoo#31398 Signed-off-by: "Yannick Tivisse (yti)" --- addons/mail/models/mail_tracking_value.py | 4 +++- addons/test_mail/tests/test_message_track.py | 6 ++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/addons/mail/models/mail_tracking_value.py b/addons/mail/models/mail_tracking_value.py index 707f3f6bd75..570757a6534 100644 --- a/addons/mail/models/mail_tracking_value.py +++ b/addons/mail/models/mail_tracking_value.py @@ -40,7 +40,9 @@ class MailTracking(models.Model): def _compute_groups(self): for tracking in self: model = self.env[tracking.mail_message_id.model] - tracking.groups = model._fields[tracking.field].groups + field = model._fields.get(tracking.field) + # field may not exist anymore if module has been uninstalled + tracking.groups = field.groups if field else 'base.group_system' @api.model def create_tracking_values(self, initial_value, new_value, col_name, col_info, tracking_sequence): diff --git a/addons/test_mail/tests/test_message_track.py b/addons/test_mail/tests/test_message_track.py index 5906e7c0543..7055fe69bc9 100644 --- a/addons/test_mail/tests/test_message_track.py +++ b/addons/test_mail/tests/test_message_track.py @@ -149,3 +149,9 @@ class TestTracking(common.BaseFunctionalTest, common.MockEmails): msg_admin = self.partner_admin.sudo(self.user_admin)._notify_prepare_template_context(self.record.message_ids, self.record) self.assertFalse(msg_emp.get('tracking_values'), "should not have protected tracking values") self.assertTrue(msg_admin.get('tracking_values'), "should have protected tracking values") + + def test_unknown_field(self): + self.record.sudo().write({'email_from': 'X'}) # create a tracking value + tracking = self.record.sudo().mapped('message_ids.tracking_value_ids')[0] + tracking.field = 'I do not exist' + self.assertEqual(tracking.groups, 'base.group_system')