From 80b4ae5b5ac26827bf47c3efa5090a30cf8a9483 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Mart=C3=ADnez?= Date: Mon, 7 Oct 2024 16:47:27 +0200 Subject: [PATCH] [FIX] tracking_manager: Avoid error when accessing the value of a field that we do not have access Example use case: - Install hr_fleet - Set the employee_ids field of hr.employee as a tracking field - Modify the user to not have permissions in Fleet - Modify the name of an employee TT51160 [FIX] tracking_manager: Test compatibility Related to https://github.com/OCA/server-tools/pull/3051/commits/b41e7ae2c77bf1c157087cc41893e134fab247f9 Do not set the child_ids field as tracking in the setup to avoid incorrect data in some cases TT51160 --- tracking_manager/models/models.py | 7 ++++++- tracking_manager/tests/test_tracking_manager.py | 9 +++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/tracking_manager/models/models.py b/tracking_manager/models/models.py index 1a168f348..de69fae87 100644 --- a/tracking_manager/models/models.py +++ b/tracking_manager/models/models.py @@ -6,6 +6,7 @@ from collections import defaultdict from odoo import api, models, tools +from odoo.exceptions import AccessError from ..tools import format_m2m @@ -120,7 +121,11 @@ class Base(models.AbstractModel): values = initial_values.setdefault(record.id, {}) if values is not None: for fname in fnames: - values.setdefault(fname, record[fname]) + try: + values.setdefault(fname, record[fname]) + except AccessError: + # User does not have access to the field (example with groups) + continue def _tm_finalize_o2m_tracking(self): initial_values = self.env.cr.precommit.data.pop( diff --git a/tracking_manager/tests/test_tracking_manager.py b/tracking_manager/tests/test_tracking_manager.py index 1e1243c65..59f02bbe1 100644 --- a/tracking_manager/tests/test_tracking_manager.py +++ b/tracking_manager/tests/test_tracking_manager.py @@ -1,4 +1,5 @@ # Copyright 2022 Akretion (https://www.akretion.com). +# Copyright 2024 Tecnativa - Víctor Martínez # @author Kévin Roche # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo import Command @@ -270,3 +271,11 @@ class TestTrackingManager(TransactionCase): self.assertEqual(len(self.messages), 1) self.assertEqual(self.messages.body.count("Change"), 0) self.assertEqual(self.messages.body.count("Delete"), 1) + + def test_o2m_update_record(self): + self.env.ref("base.field_res_partner__child_ids").custom_tracking = True + child = self.env["res.partner"].create( + {"name": "Test child", "parent_id": self.partner.id} + ) + child.write({"parent_id": False}) + self.assertEqual(len(self.messages), 1)