Skip to content

Commit 98cfee7

Browse files
author
Milan Topuzov
committed
[MIG] base_user_role: migrate to 19.0
- Replace groups_id with group_ids in views/actions - Bump version to 19.0.1.0.0; adjust manifests/assets - Use env attributes and Domain expressions - Adopt new Constraint/Index APIs where applicable Functional changes
1 parent e994830 commit 98cfee7

File tree

6 files changed

+84
-71
lines changed

6 files changed

+84
-71
lines changed

base_user_role/models/role.py

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
import datetime
44
import logging
55

6-
from odoo import SUPERUSER_ID, _, api, fields, models
6+
from odoo import api, fields, models
7+
from odoo.api import SUPERUSER_ID
78

89
_logger = logging.getLogger(__name__)
910

@@ -40,11 +41,10 @@ class ResUsersRole(models.Model):
4041
required=False,
4142
)
4243
model_access_count = fields.Integer(compute="_compute_model_access_ids")
43-
group_category_id = fields.Many2one(
44-
related="group_id.category_id",
45-
default=lambda cls: cls.env.ref("base_user_role.ir_module_category_role").id,
46-
string="Associated category",
47-
help="Associated group's category",
44+
group_privilege_id = fields.Many2one(
45+
related="group_id.privilege_id",
46+
string="Associated privilege",
47+
help="Privilege assigned to the associated group.",
4848
readonly=False,
4949
)
5050

@@ -105,7 +105,7 @@ def unlink(self):
105105

106106
def copy(self, default=None):
107107
self.ensure_one()
108-
default = dict(default or {}, name=_("%s (copy)", self.name))
108+
default = dict(default or {}, name=self.env._("%s (copy)", self.name))
109109
return super().copy(default)
110110

111111
def update_users(self):
@@ -117,7 +117,14 @@ def update_users(self):
117117
@api.model
118118
def cron_update_users(self):
119119
logging.info("Update user roles")
120-
self.search([]).update_users()
120+
offset = 0
121+
batch = 2000
122+
while True:
123+
roles = self.search([], offset=offset, limit=batch)
124+
if not roles:
125+
break
126+
roles.update_users()
127+
offset += batch
121128

122129
def show_rule_ids(self):
123130
action = self.env["ir.actions.actions"]._for_xml_id("base.action_rule")
@@ -148,13 +155,10 @@ class ResUsersRoleLine(models.Model):
148155
date_from = fields.Date("From")
149156
date_to = fields.Date("To")
150157
is_enabled = fields.Boolean("Enabled", compute="_compute_is_enabled")
151-
_sql_constraints = [
152-
(
153-
"user_role_uniq",
154-
"unique (user_id,role_id)",
155-
"User roles can be assigned to a user only once at a time",
156-
)
157-
]
158+
_user_role_uniq = models.Constraint(
159+
"UNIQUE (user_id, role_id)",
160+
"User roles can be assigned to a user only once at a time",
161+
)
158162

159163
@api.depends("date_from", "date_to")
160164
def _compute_is_enabled(self):

base_user_role/models/user.py

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,14 @@ def _compute_show_alert(self):
3131

3232
@api.model
3333
def _default_role_lines(self):
34-
default_user = self.env.ref("base.default_user", raise_if_not_found=False)
34+
template_user = self.env.ref(
35+
"base.template_portal_user_id", raise_if_not_found=False
36+
)
3537
default_values = []
36-
if default_user:
37-
for role_line in default_user.with_context(active_test=False).role_line_ids:
38+
if template_user:
39+
for role_line in template_user.with_context(
40+
active_test=False
41+
).role_line_ids:
3842
default_values.append(
3943
{
4044
"role_id": role_line.role_id.id,
@@ -73,13 +77,8 @@ def set_groups_from_roles(self, force=False):
7377
# We obtain all the groups associated to each role first, so that
7478
# it is faster to compare later with each user's groups.
7579
for role in self.mapped("role_line_ids.role_id"):
76-
role_groups[role] = list(
77-
set(
78-
role.group_id.ids
79-
+ role.implied_ids.ids
80-
+ role.trans_implied_ids.ids
81-
)
82-
)
80+
# v19: use transitive implied groups provided by ORM
81+
role_groups[role] = list(set(role.all_implied_ids.ids))
8382
for user in self:
8483
if not user.role_line_ids and not force:
8584
continue
@@ -88,12 +87,24 @@ def set_groups_from_roles(self, force=False):
8887
role = role_line.role_id
8988
group_ids += role_groups[role]
9089
group_ids = list(set(group_ids)) # Remove duplicates IDs
91-
groups_to_add = list(set(group_ids) - set(user.groups_id.ids))
92-
groups_to_remove = list(set(user.groups_id.ids) - set(group_ids))
90+
# Preserve admin only if dropping it would leave zero administrators
91+
admin_group = self.env.ref("base.group_system", raise_if_not_found=False)
92+
if (
93+
admin_group
94+
and admin_group.id in user.group_ids.ids
95+
and admin_group.id not in group_ids
96+
):
97+
other_admins = self.sudo().search_count(
98+
[("id", "!=", user.id), ("group_ids", "in", admin_group.id)]
99+
)
100+
if other_admins == 0:
101+
group_ids.append(admin_group.id)
102+
groups_to_add = list(set(group_ids) - set(user.group_ids.ids))
103+
groups_to_remove = list(set(user.group_ids.ids) - set(group_ids))
93104
to_add = [(4, gr) for gr in groups_to_add]
94105
to_remove = [(3, gr) for gr in groups_to_remove]
95106
groups = to_remove + to_add
96107
if groups:
97-
vals = {"groups_id": groups}
108+
vals = {"group_ids": groups}
98109
super(ResUsers, user).write(vals)
99110
return True

base_user_role/tests/test_user_role.py

Lines changed: 32 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def setUpClass(cls):
2020

2121
cls.company1 = cls.env.ref("base.main_company")
2222
cls.company2 = cls.env["res.company"].create({"name": "company2"})
23-
cls.default_user = cls.env.ref("base.default_user")
23+
cls.default_user = cls.env.ref("base.template_portal_user_id")
2424
cls.user_id = cls.user_model.create(
2525
{"name": "USER TEST (ROLES)", "login": "user_test_roles"}
2626
)
@@ -61,7 +61,7 @@ def setUpClass(cls):
6161
"name": "User 2",
6262
"company_id": cls.company1.id,
6363
"company_ids": [(6, 0, [cls.company1.id, cls.company2.id])],
64-
"groups_id": [(6, 0, cls.env.ref("base.group_erp_manager").ids)],
64+
"group_ids": [(6, 0, cls.env.ref("base.group_erp_manager").ids)],
6565
"login": "multicompany_user_1",
6666
}
6767
)
@@ -70,7 +70,7 @@ def setUpClass(cls):
7070
"name": "User 2",
7171
"company_id": cls.company2.id,
7272
"company_ids": [(6, 0, [cls.company2.id])],
73-
"groups_id": [(6, 0, cls.env.ref("base.group_user").ids)],
73+
"group_ids": [(6, 0, cls.env.ref("base.group_user").ids)],
7474
"login": "multicompany_user_2",
7575
}
7676
)
@@ -84,18 +84,14 @@ def setUpClass(cls):
8484

8585
def test_role_1(self):
8686
self.user_id.write({"role_line_ids": [(0, 0, {"role_id": self.role1_id.id})]})
87-
user_group_ids = sorted({group.id for group in self.user_id.groups_id})
88-
role_group_ids = self.role1_id.trans_implied_ids.ids
89-
role_group_ids.append(self.role1_id.group_id.id)
90-
role_group_ids = sorted(set(role_group_ids))
87+
user_group_ids = sorted({group.id for group in self.user_id.group_ids})
88+
role_group_ids = sorted(set(self.role1_id.all_implied_ids.ids))
9189
self.assertEqual(user_group_ids, role_group_ids)
9290

9391
def test_role_2(self):
9492
self.user_id.write({"role_line_ids": [(0, 0, {"role_id": self.role2_id.id})]})
95-
user_group_ids = sorted({group.id for group in self.user_id.groups_id})
96-
role_group_ids = self.role2_id.trans_implied_ids.ids
97-
role_group_ids.append(self.role2_id.group_id.id)
98-
role_group_ids = sorted(set(role_group_ids))
93+
user_group_ids = sorted({group.id for group in self.user_id.group_ids})
94+
role_group_ids = sorted(set(self.role2_id.all_implied_ids.ids))
9995
self.assertEqual(user_group_ids, role_group_ids)
10096

10197
def test_role_1_2(self):
@@ -107,11 +103,9 @@ def test_role_1_2(self):
107103
]
108104
}
109105
)
110-
user_group_ids = sorted({group.id for group in self.user_id.groups_id})
111-
role1_group_ids = self.role1_id.trans_implied_ids.ids
112-
role1_group_ids.append(self.role1_id.group_id.id)
113-
role2_group_ids = self.role2_id.trans_implied_ids.ids
114-
role2_group_ids.append(self.role2_id.group_id.id)
106+
user_group_ids = sorted({group.id for group in self.user_id.group_ids})
107+
role1_group_ids = self.role1_id.all_implied_ids.ids
108+
role2_group_ids = self.role2_id.all_implied_ids.ids
115109
role_group_ids = sorted(set(role1_group_ids + role2_group_ids))
116110
self.assertEqual(user_group_ids, role_group_ids)
117111

@@ -130,16 +124,14 @@ def test_role_1_2_with_dates(self):
130124
]
131125
}
132126
)
133-
user_group_ids = sorted({group.id for group in self.user_id.groups_id})
134-
role1_group_ids = self.role1_id.trans_implied_ids.ids
135-
role1_group_ids.append(self.role1_id.group_id.id)
136-
role_group_ids = sorted(set(role1_group_ids))
127+
user_group_ids = sorted({group.id for group in self.user_id.group_ids})
128+
role_group_ids = sorted(set(self.role1_id.all_implied_ids.ids))
137129
self.assertEqual(user_group_ids, role_group_ids)
138130

139131
def test_role_unlink(self):
140132
# Get role1 and role2 groups
141-
role1_groups = self.role1_id.trans_implied_ids | self.role1_id.group_id
142-
role2_groups = self.role2_id.trans_implied_ids | self.role2_id.group_id
133+
role1_groups = self.role1_id.all_implied_ids
134+
role2_groups = self.role2_id.all_implied_ids
143135

144136
# Configure the user with role1 and role2
145137
self.user_id.write(
@@ -151,23 +143,23 @@ def test_role_unlink(self):
151143
}
152144
)
153145
# Check user has groups from role1 and role2
154-
self.assertLessEqual(role1_groups, self.user_id.groups_id)
155-
self.assertLessEqual(role2_groups, self.user_id.groups_id)
146+
self.assertLessEqual(role1_groups, self.user_id.group_ids)
147+
self.assertLessEqual(role2_groups, self.user_id.group_ids)
156148
# Remove role2
157149
self.role2_id.unlink()
158150
# Check user has groups from only role1
159-
self.assertLessEqual(role1_groups, self.user_id.groups_id)
160-
self.assertFalse(role2_groups <= self.user_id.groups_id)
151+
self.assertLessEqual(role1_groups, self.user_id.group_ids)
152+
self.assertFalse(role2_groups <= self.user_id.group_ids)
161153
# Remove role1
162154
self.role1_id.unlink()
163155
# Check user has no groups from role1 and role2
164-
self.assertFalse(role1_groups <= self.user_id.groups_id)
165-
self.assertFalse(role2_groups <= self.user_id.groups_id)
156+
self.assertFalse(role1_groups <= self.user_id.group_ids)
157+
self.assertFalse(role2_groups <= self.user_id.group_ids)
166158

167159
def test_role_line_unlink(self):
168160
# Get role1 and role2 groups
169-
role1_groups = self.role1_id.trans_implied_ids | self.role1_id.group_id
170-
role2_groups = self.role2_id.trans_implied_ids | self.role2_id.group_id
161+
role1_groups = self.role1_id.all_implied_ids
162+
role2_groups = self.role2_id.all_implied_ids
171163

172164
# Configure the user with role1 and role2
173165
self.user_id.write(
@@ -179,22 +171,22 @@ def test_role_line_unlink(self):
179171
}
180172
)
181173
# Check user has groups from role1 and role2
182-
self.assertLessEqual(role1_groups, self.user_id.groups_id)
183-
self.assertLessEqual(role2_groups, self.user_id.groups_id)
174+
self.assertLessEqual(role1_groups, self.user_id.group_ids)
175+
self.assertLessEqual(role2_groups, self.user_id.group_ids)
184176
# Remove role2 from the user
185177
self.user_id.role_line_ids.filtered(
186178
lambda rl: rl.role_id.id == self.role2_id.id
187179
).unlink()
188180
# Check user has groups from only role1
189-
self.assertLessEqual(role1_groups, self.user_id.groups_id)
190-
self.assertFalse(role2_groups <= self.user_id.groups_id)
181+
self.assertLessEqual(role1_groups, self.user_id.group_ids)
182+
self.assertFalse(role2_groups <= self.user_id.group_ids)
191183
# Remove role1 from the user
192184
self.user_id.role_line_ids.filtered(
193185
lambda rl: rl.role_id.id == self.role1_id.id
194186
).unlink()
195187
# Check user has no groups from role1 and role2
196-
self.assertFalse(role1_groups <= self.user_id.groups_id)
197-
self.assertFalse(role2_groups <= self.user_id.groups_id)
188+
self.assertFalse(role1_groups <= self.user_id.group_ids)
189+
self.assertFalse(role2_groups <= self.user_id.group_ids)
198190

199191
def test_default_user_roles(self):
200192
self.default_user.write(
@@ -222,7 +214,7 @@ def test_role_multicompany(self):
222214
role.with_context(allowed_company_ids=self.company1.ids).read()
223215
# Downgrade multicompany user 1 to common user
224216
self.multicompany_user_1.write(
225-
{"groups_id": [(6, 0, self.env.ref("base.group_user").ids)]}
217+
{"group_ids": [(6, 0, self.env.ref("base.group_user").ids)]}
226218
)
227219
# Check that the user cannot read multicompany data again since it lost
228220
# its admin privileges
@@ -247,8 +239,8 @@ def test_create_role_from_user(self):
247239
# Check that the role has the same groups as the user
248240
role_id = result["res_id"]
249241
role = self.role_model.browse([role_id])
250-
user_group_ids = sorted(set(self.user_id.groups_id.ids))
251-
role_group_ids = sorted(set(role.trans_implied_ids.ids))
242+
user_group_ids = sorted(set(self.user_id.group_ids.ids))
243+
role_group_ids = sorted(set(role.implied_ids.ids))
252244
self.assertEqual(user_group_ids, role_group_ids)
253245

254246
def test_show_alert_computation(self):
@@ -261,7 +253,7 @@ def test_show_alert_computation(self):
261253
self.assertFalse(self.user_id.show_alert)
262254

263255
def test_group_groups_into_role(self):
264-
user_group_ids = self.user_id.groups_id.ids
256+
user_group_ids = self.user_id.group_ids.ids
265257
# Check that there is not a role with name: Test Role
266258
self.assertFalse(self.role_model.search([("name", "=", "Test Role")]))
267259
# Call create_role function to group groups into a role

base_user_role/views/role.xml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,13 @@
4141
</group>
4242
<notebook>
4343
<page string="Groups">
44-
<field name="implied_ids" nolabel="1" />
44+
<field
45+
name="implied_ids"
46+
nolabel="1"
47+
widget="many2many_tags"
48+
class="w-100"
49+
options="{'no_create': True}"
50+
/>
4551
</page>
4652
<page string="Users">
4753
<field name="line_ids" nolabel="1">

base_user_role/views/user.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@
6262
<field name="model">res.users</field>
6363
<field name="inherit_id" ref="base.view_users_tree" />
6464
<field name="arch" type="xml">
65-
<field name="company_id" position="before">
65+
<field name="role" position="after">
6666
<field name="role_ids" widget="many2many_tags" />
6767
</field>
6868
</field>

base_user_role/wizards/create_from_user.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def create_from_user(self):
2828
}
2929
)
3030

31-
role.implied_ids = [(6, 0, user.groups_id.ids)]
31+
role.implied_ids = [(6, 0, user.group_ids.ids)]
3232

3333
if self.assign_to_user:
3434
role_line_obj.create(

0 commit comments

Comments
 (0)