When you try to create two users with the same login, the shown error message is the Postgresql integrity error instead of a nice (translated) validation error. This happens sincebf88f3ewhich changed the way error messages are translated. The reason is the manually created unique index `res_users_login_key_unique_website_index`. The error handling and translation mechanisms don't know it exists. The index was created for performance reasons in commitb5a12b4where the original python constraint was replaced with this custom SQL index. In this commit, the python constraint is re-introduced to remove the index hack, but the implementation now uses a single SQL query, which should be quite fast. closes odoo/odoo#38737 X-original-commit: 817a811ec98b0c313b12e6464b5e98ca432cb3fc Signed-off-by: Christophe Simonis <chs@odoo.com>
61 lines
2.4 KiB
Python
61 lines
2.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from psycopg2 import IntegrityError
|
|
|
|
from odoo.tests.common import TransactionCase, new_test_user
|
|
from odoo.exceptions import ValidationError
|
|
from odoo.service.model import check
|
|
from odoo.tools import mute_logger
|
|
|
|
|
|
class TestWebsiteResUsers(TransactionCase):
|
|
|
|
def setUp(self):
|
|
super().setUp()
|
|
websites = self.env['website'].create([
|
|
{'name': 'Test Website'},
|
|
{'name': 'Test Website 2'},
|
|
])
|
|
self.website_1, self.website_2 = websites
|
|
|
|
def test_no_website(self):
|
|
new_test_user(self.env, login='Pou', website_id=False)
|
|
with self.assertRaises(ValidationError):
|
|
new_test_user(self.env, login='Pou', website_id=False)
|
|
|
|
def test_websites_set_null(self):
|
|
user_1 = new_test_user(self.env, login='Pou', website_id=self.website_1.id)
|
|
user_2 = new_test_user(self.env, login='Pou', website_id=self.website_2.id)
|
|
with self.assertRaises(ValidationError):
|
|
(user_1 | user_2).write({'website_id': False})
|
|
|
|
def test_null_and_website(self):
|
|
new_test_user(self.env, login='Pou', website_id=self.website_1.id)
|
|
new_test_user(self.env, login='Pou', website_id=False)
|
|
|
|
def test_change_login(self):
|
|
new_test_user(self.env, login='Pou', website_id=self.website_1.id)
|
|
user_belle = new_test_user(self.env, login='Belle', website_id=self.website_1.id)
|
|
with self.assertRaises(IntegrityError), mute_logger('odoo.sql_db'):
|
|
user_belle.login = 'Pou'
|
|
|
|
def test_change_login_no_website(self):
|
|
new_test_user(self.env, login='Pou', website_id=False)
|
|
user_belle = new_test_user(self.env, login='Belle', website_id=False)
|
|
with self.assertRaises(ValidationError):
|
|
user_belle.login = 'Pou'
|
|
|
|
def test_same_website_message(self):
|
|
|
|
@check # Check decorator, otherwise translation is not applied
|
|
def check_new_test_user(dbname):
|
|
new_test_user(self.env(context={'land': 'en_US'}), login='Pou', website_id=self.website_1.id)
|
|
|
|
new_test_user(self.env, login='Pou', website_id=self.website_1.id)
|
|
|
|
# Should be a ValidationError (with a nice translated error message),
|
|
# not an IntegrityError
|
|
with self.assertRaises(ValidationError), mute_logger('odoo.sql_db'):
|
|
check_new_test_user(self.env.registry._db.dbname)
|