Skip to content

Commit 5a5542f

Browse files
fix(spp_user_roles): remove _default_role_lines override that copies roles from arbitrary users
The override tried base.default_user (removed in Odoo 19) then fell back to copying roles from the first user with any role lines — silently giving every new user an arbitrary set of roles. The upstream base_user_role OCA module already handles this correctly via an is_default boolean on res.users.role. Remove the dead overrides from spp_user_roles and spp_area, rewrite the test to verify the is_default mechanism, and fix tuple syntax to use Command.create() per Odoo 19 conventions. Closes #156
1 parent 5a7544e commit 5a5542f

3 files changed

Lines changed: 20 additions & 53 deletions

File tree

spp_area/models/user.py

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,3 @@ def _compute_center_area_ids(self):
2525
center_area_ids.append(Command.link(area.id))
2626
if center_area_ids:
2727
user.update({"center_area_ids": center_area_ids})
28-
29-
@api.model
30-
def _default_role_lines(self):
31-
default_values = super()._default_role_lines()
32-
33-
default_user = self.env.ref("base.default_user", raise_if_not_found=False)
34-
if default_user:
35-
for default_value in default_values:
36-
for role_line in default_user.with_context(active_test=False).role_line_ids:
37-
if role_line.role_id.id == default_value["role_id"]:
38-
default_value["local_area_ids"] = [Command.set(role_line.local_area_ids.ids)]
39-
break
40-
return default_values

spp_user_roles/models/user.py

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -21,33 +21,6 @@ def _compute_role_ids_stored(self):
2121
for user in self:
2222
user.role_ids_stored = user.role_line_ids.filtered(lambda r: r.is_enabled).mapped("role_id")
2323

24-
@api.model
25-
def _default_role_lines(self):
26-
"""Build default role lines from a template user when available.
27-
28-
``base.default_user`` disappeared in Odoo 19.0, so we gracefully fall
29-
back to the first user that already has role lines defined. This keeps
30-
the feature working while remaining backward compatible when the XMLID
31-
is present.
32-
"""
33-
34-
default_user = self.env.ref("base.default_user", raise_if_not_found=False)
35-
if not default_user:
36-
default_user = self.env["res.users"].search([("role_line_ids", "!=", False)], limit=1)
37-
38-
default_values = []
39-
if default_user:
40-
for role_line in default_user.with_context(active_test=False).role_line_ids:
41-
default_values.append(
42-
{
43-
"role_id": role_line.role_id.id,
44-
"date_from": role_line.date_from,
45-
"date_to": role_line.date_to,
46-
"is_enabled": role_line.is_enabled,
47-
}
48-
)
49-
return default_values
50-
5124
def set_groups_from_roles(self, force=False):
5225
"""Override the original method to exclude some groups in removing."""
5326
DO_NOT_REMOVE_GROUPS = [

spp_user_roles/tests/test_user.py

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ def setUpClass(cls):
2727
"name": "Test User",
2828
"login": "test_user",
2929
"role_line_ids": [
30-
(0, 0, {"role_id": cls.role_user.id}),
31-
(0, 0, {"role_id": cls.role_no_one.id}),
30+
Command.create({"role_id": cls.role_user.id}),
31+
Command.create({"role_id": cls.role_no_one.id}),
3232
],
3333
}
3434
)
@@ -44,19 +44,26 @@ def test_set_groups_from_roles(self):
4444
self.assertIn(self.env.ref("base.group_user").id, self.user.group_ids.ids)
4545
self.assertIn(self.env.ref("base.group_no_one").id, self.user.group_ids.ids)
4646

47-
def test_default_role_lines(self):
47+
def test_default_role_lines_uses_is_default(self):
48+
"""Default role lines come from roles with is_default=True, not from arbitrary users."""
49+
# Neither role is marked as default, so no defaults should be returned
4850
default_values = self.env["res.users"]._default_role_lines()
51+
default_role_ids = [v["role_id"] for v in default_values]
52+
self.assertNotIn(self.role_user.id, default_role_ids)
53+
self.assertNotIn(self.role_no_one.id, default_role_ids)
4954

50-
self.assertTrue(bool(default_values))
51-
self.assertEqual(len(default_values), 2)
52-
self.assertEqual(default_values[0]["role_id"], self.role_user.id)
53-
self.assertEqual(default_values[1]["role_id"], self.role_no_one.id)
54-
self.assertTrue(default_values[0]["is_enabled"])
55-
self.assertTrue(default_values[1]["is_enabled"])
56-
self.assertFalse(default_values[0]["date_from"])
57-
self.assertFalse(default_values[1]["date_from"])
58-
self.assertFalse(default_values[0]["date_to"])
59-
self.assertFalse(default_values[1]["date_to"])
55+
# Mark one role as default
56+
self.role_user.is_default = True
57+
default_values = self.env["res.users"]._default_role_lines()
58+
default_role_ids = [v["role_id"] for v in default_values]
59+
self.assertIn(self.role_user.id, default_role_ids)
60+
self.assertNotIn(self.role_no_one.id, default_role_ids)
61+
62+
# New user without explicit role_line_ids gets the default role
63+
new_user = self.env["res.users"].create({"name": "New User", "login": "new_test_user"})
64+
new_user_role_ids = new_user.role_line_ids.mapped("role_id").ids
65+
self.assertIn(self.role_user.id, new_user_role_ids)
66+
self.assertNotIn(self.role_no_one.id, new_user_role_ids)
6067

6168
@unittest.skip("center_area_ids computation not available in Odoo 19 build")
6269
def test_compute_center_area_ids(self):

0 commit comments

Comments
 (0)