This is a followup onb6c688caa2, which has introduced a new bug. Consider two groups A and B in a given category, where B implies A and also A.id > B.id. For the sake of simplicity, assume that A.id=2 and B.id=1. Following the commit above, the name of the group selection field will be 'sel_groups_1_2'. Consider a user in group B. Because B implies A, this means that the user now belongs to both A and B. A call to read() on that user returns field 'sel_groups_1_2' with value 2, which on the form view appears as the user belonging to A only. The error is in read(), which assumes that the group ids in the field name correspond to the implication order of the groups, which is no longer the case sinceb6c688caa2. closes odoo/odoo#78662 X-original-commit: e73c406671a51e9c1c4872a9e85eebe5656ea38e Signed-off-by: Raphael Collet (rco) <rco@openerp.com>
174 lines
6.4 KiB
Python
174 lines
6.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo.addons.base.models.res_users import is_selection_groups, get_selection_groups
|
|
from odoo.tests.common import TransactionCase, Form, tagged
|
|
|
|
|
|
class TestUsers(TransactionCase):
|
|
|
|
def test_name_search(self):
|
|
""" Check name_search on user. """
|
|
User = self.env['res.users']
|
|
|
|
test_user = User.create({'name': 'Flad the Impaler', 'login': 'vlad'})
|
|
like_user = User.create({'name': 'Wlad the Impaler', 'login': 'vladi'})
|
|
other_user = User.create({'name': 'Nothing similar', 'login': 'nothing similar'})
|
|
all_users = test_user | like_user | other_user
|
|
|
|
res = User.name_search('vlad', operator='ilike')
|
|
self.assertEqual(User.browse(i[0] for i in res) & all_users, test_user)
|
|
|
|
res = User.name_search('vlad', operator='not ilike')
|
|
self.assertEqual(User.browse(i[0] for i in res) & all_users, all_users)
|
|
|
|
res = User.name_search('', operator='ilike')
|
|
self.assertEqual(User.browse(i[0] for i in res) & all_users, all_users)
|
|
|
|
res = User.name_search('', operator='not ilike')
|
|
self.assertEqual(User.browse(i[0] for i in res) & all_users, User)
|
|
|
|
res = User.name_search('lad', operator='ilike')
|
|
self.assertEqual(User.browse(i[0] for i in res) & all_users, test_user | like_user)
|
|
|
|
res = User.name_search('lad', operator='not ilike')
|
|
self.assertEqual(User.browse(i[0] for i in res) & all_users, other_user)
|
|
|
|
def test_user_partner(self):
|
|
""" Check that the user partner is well created """
|
|
|
|
User = self.env['res.users']
|
|
Partner = self.env['res.partner']
|
|
Company = self.env['res.company']
|
|
|
|
company_1 = Company.create({'name': 'company_1'})
|
|
company_2 = Company.create({'name': 'company_2'})
|
|
|
|
partner = Partner.create({
|
|
'name': 'Bob Partner',
|
|
'company_id': company_2.id
|
|
})
|
|
|
|
# case 1 : the user has no partner
|
|
test_user = User.create({
|
|
'name': 'John Smith',
|
|
'login': 'jsmith',
|
|
'company_ids': [company_1.id],
|
|
'company_id': company_1.id
|
|
})
|
|
|
|
self.assertFalse(
|
|
test_user.partner_id.company_id,
|
|
"The partner_id linked to a user should be created without any company_id")
|
|
|
|
# case 2 : the user has a partner
|
|
test_user = User.create({
|
|
'name': 'Bob Smith',
|
|
'login': 'bsmith',
|
|
'company_ids': [company_1.id],
|
|
'company_id': company_1.id,
|
|
'partner_id': partner.id
|
|
})
|
|
|
|
self.assertEqual(
|
|
test_user.partner_id.company_id,
|
|
company_1,
|
|
"If the partner_id of a user has already a company, it is replaced by the user company"
|
|
)
|
|
|
|
|
|
def test_change_user_company(self):
|
|
""" Check the partner company update when the user company is changed """
|
|
|
|
User = self.env['res.users']
|
|
Company = self.env['res.company']
|
|
|
|
test_user = User.create({'name': 'John Smith', 'login': 'jsmith'})
|
|
company_1 = Company.create({'name': 'company_1'})
|
|
company_2 = Company.create({'name': 'company_2'})
|
|
|
|
test_user.company_ids += company_1
|
|
test_user.company_ids += company_2
|
|
|
|
# 1: the partner has no company_id, no modification
|
|
test_user.write({
|
|
'company_id': company_1.id
|
|
})
|
|
|
|
self.assertFalse(
|
|
test_user.partner_id.company_id,
|
|
"On user company change, if its partner_id has no company_id,"
|
|
"the company_id of the partner_id shall NOT be updated")
|
|
|
|
# 2: the partner has a company_id different from the new one, update it
|
|
test_user.partner_id.write({
|
|
'company_id': company_1.id
|
|
})
|
|
|
|
test_user.write({
|
|
'company_id': company_2.id
|
|
})
|
|
|
|
self.assertEqual(
|
|
test_user.partner_id.company_id,
|
|
company_2,
|
|
"On user company change, if its partner_id has already a company_id,"
|
|
"the company_id of the partner_id shall be updated"
|
|
)
|
|
|
|
@tagged('post_install', '-at_install')
|
|
class TestUsers2(TransactionCase):
|
|
def test_reified_groups(self):
|
|
""" The groups handler doesn't use the "real" view with pseudo-fields
|
|
during installation, so it always works (because it uses the normal
|
|
groups_id field).
|
|
"""
|
|
# use the specific views which has the pseudo-fields
|
|
f = Form(self.env['res.users'], view='base.view_users_form')
|
|
f.name = "bob"
|
|
f.login = "bob"
|
|
user = f.save()
|
|
|
|
self.assertIn(self.env.ref('base.group_user'), user.groups_id)
|
|
|
|
def test_selection_groups(self):
|
|
# create 3 groups that should be in a selection
|
|
app = self.env['ir.module.category'].create({'name': 'Foo'})
|
|
group1, group2, group0 = self.env['res.groups'].create([
|
|
{'name': name, 'category_id': app.id}
|
|
for name in ('User', 'Manager', 'Visitor')
|
|
])
|
|
# THIS PART IS NECESSARY TO REPRODUCE AN ISSUE: group1.id < group2.id < group0.id
|
|
self.assertLess(group1.id, group2.id)
|
|
self.assertLess(group2.id, group0.id)
|
|
# implication order is group0 < group1 < group2
|
|
group2.implied_ids = group1
|
|
group1.implied_ids = group0
|
|
groups = group0 + group1 + group2
|
|
|
|
# determine the name of the field corresponding to groups
|
|
fname = next(
|
|
name
|
|
for name in self.env['res.users'].fields_get()
|
|
if is_selection_groups(name) and group0.id in get_selection_groups(name)
|
|
)
|
|
self.assertCountEqual(get_selection_groups(fname), groups.ids)
|
|
|
|
# create a user
|
|
user = self.env['res.users'].create({'name': 'foo', 'login': 'foo'})
|
|
|
|
# put user in group0, and check field value
|
|
user.write({fname: group0.id})
|
|
self.assertEqual(user.groups_id & groups, group0)
|
|
self.assertEqual(user.read([fname])[0][fname], group0.id)
|
|
|
|
# put user in group1, and check field value
|
|
user.write({fname: group1.id})
|
|
self.assertEqual(user.groups_id & groups, group0 + group1)
|
|
self.assertEqual(user.read([fname])[0][fname], group1.id)
|
|
|
|
# put user in group2, and check field value
|
|
user.write({fname: group2.id})
|
|
self.assertEqual(user.groups_id & groups, groups)
|
|
self.assertEqual(user.read([fname])[0][fname], group2.id)
|