1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import Command
from odoo.addons.website.tools import MockRequest
from odoo.exceptions import ValidationError
from odoo.service.model import retrying
from odoo.tests.common import TransactionCase, new_test_user
from odoo.tools import mute_logger
from unittest import TestCase
import psycopg2
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, groups='base.group_portal')
user_2 = new_test_user(self.env, login='Pou', website_id=self.website_2.id, groups='base.group_portal')
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, groups='base.group_portal')
new_test_user(self.env, login='Pou', website_id=False, groups='base.group_portal')
def test_change_login(self):
new_test_user(self.env, login='Pou', website_id=self.website_1.id, groups='base.group_portal')
user_belle = new_test_user(self.env, login='Belle', website_id=self.website_1.id, groups='base.group_portal')
with self.assertRaises(psycopg2.errors.UniqueViolation), 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):
# Use a test cursor because retrying() does commit.
self.env.registry.enter_test_mode(self.env.cr)
self.addCleanup(self.env.registry.leave_test_mode)
env = self.env(context={'lang': 'en_US'}, cr=self.env.registry.cursor())
def create_user_pou():
return new_test_user(env, login='Pou', website_id=self.website_1.id, groups='base.group_portal')
# First user creation works.
create_user_pou()
# Second user creation fails with ValidationError instead of
# IntegrityError. Do not use self.assertRaises as it would try
# to create and rollback to a savepoint that is removed by the
# rollback in retrying().
with TestCase.assertRaises(self, ValidationError), mute_logger('odoo.sql_db'):
retrying(create_user_pou, env)
def _create_user_via_website(self, website, login):
# We need a fake request to _signup_create_user.
with MockRequest(self.env, website=website):
return self.env['res.users'].with_context(website_id=website.id)._signup_create_user({
'name': login,
'login': login,
})
def _create_and_check_portal_user(self, website_specific, company_1, company_2, website_1, website_2):
# Disable/Enable cross-website for portal users.
website_1.specific_user_account = website_specific
website_2.specific_user_account = website_specific
user_1 = self._create_user_via_website(website_1, 'user1')
user_2 = self._create_user_via_website(website_2, 'user2')
self.assertEqual(user_1.company_id, company_1)
self.assertEqual(user_2.company_id, company_2)
if website_specific:
self.assertEqual(user_1.website_id, website_1)
self.assertEqual(user_2.website_id, website_2)
else:
self.assertEqual(user_1.website_id.id, False)
self.assertEqual(user_2.website_id.id, False)
def test_multi_website_multi_company(self):
company_1 = self.env['res.company'].create({'name': "Company 1"})
company_2 = self.env['res.company'].create({'name': "Company 2"})
website_1 = self.env['website'].create({'name': "Website 1", 'company_id': company_1.id})
website_2 = self.env['website'].create({'name': "Website 2", 'company_id': company_2.id})
# Permit uninvited signup.
website_1.auth_signup_uninvited = 'b2c'
website_2.auth_signup_uninvited = 'b2c'
self._create_and_check_portal_user(False, company_1, company_2, website_1, website_2)
self._create_and_check_portal_user(True, company_1, company_2, website_1, website_2)
def test_archive_company_linked_to_website(self):
company = self.env['res.company'].create({'name': 'Company'})
self.env['website'].create({'name': "Website 1", 'company_id': company.id})
# The company cannot be archived because it has a website linked to it
with self.assertRaises(ValidationError):
company.action_archive()
def test_user_become_internal(self):
# This tests if the website_id is correctly removed when a user becomes
# an internal user.
website = self.env['website'].create({'name': "Awesome Website"})
website.write({
# Permit uninvited signup for portal users.
'auth_signup_uninvited': 'b2c',
# Disable cross-website for portal users.
'specific_user_account': True,
})
user = self._create_user_via_website(website, 'Portal_User')
self.assertEqual(user.website_id, website)
self.assertTrue(user._is_portal())
with self.assertRaises(ValidationError):
user.groups_id = [
Command.link(self.env.ref('base.group_user').id),
Command.unlink(self.env.ref('base.group_portal').id),
]
|