From dae58c178f81450840c66dfb956411bc9f9ecfac Mon Sep 17 00:00:00 2001 From: Pierre Pizzetta Date: Thu, 15 Oct 2026 14:21:13 +0800 Subject: [PATCH] [FIX] base_user_role: preserve role sequence and write values Route only inherited fields to the delegated group so updates to the role-owned sequence field apply to the role. Copy write values before separating delegated fields to preserve the caller dictionary. Add regressions for independent role ordering and input preservation. --- base_user_role/models/role.py | 7 ++++--- base_user_role/tests/test_user_role.py | 12 ++++++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/base_user_role/models/role.py b/base_user_role/models/role.py index 85de4f3c7..94451ec8f 100644 --- a/base_user_role/models/role.py +++ b/base_user_role/models/role.py @@ -85,12 +85,13 @@ def read(self, fields=None, load="_classic_read"): def write(self, vals): recs = self.sudo() if self._bypass_rules() else self + vals = dict(vals) # Workaround to solve issue with broken code in odoo that clear the # cache during the write: see odoo/addons/base/models/res_users.py#L226 groups_vals = {} - for field in recs.group_id._fields: - if field in vals: - groups_vals[field] = vals.pop(field) + for name, field in recs._fields.items(): + if field.inherited and name in vals: + groups_vals[name] = vals.pop(name) if groups_vals: recs.group_id.write(groups_vals) res = super(ResUsersRole, recs).write(vals) diff --git a/base_user_role/tests/test_user_role.py b/base_user_role/tests/test_user_role.py index 4235edb35..f13472a8f 100644 --- a/base_user_role/tests/test_user_role.py +++ b/base_user_role/tests/test_user_role.py @@ -89,6 +89,18 @@ def setUpClass(cls): class TestUserRole(TestUserRoleCommon): + def test_role_sequence(self): + group_sequence = self.role1_id.group_id.sequence + self.role1_id.write({"sequence": 42}) + self.assertEqual(self.role1_id.sequence, 42) + self.assertEqual(self.role1_id.group_id.sequence, group_sequence) + + def test_role_write_preserves_values(self): + values = {"name": "Renamed role"} + self.role1_id.write(values) + self.assertEqual(self.role1_id.name, "Renamed role") + self.assertEqual(values, {"name": "Renamed role"}) + def test_role_1(self): self.user_id.write( {"role_line_ids": [fields.Command.create({"role_id": self.role1_id.id})]}