diff --git a/addons/website/models/res_users.py b/addons/website/models/res_users.py index 96d41d65f3393eeac0ab760e1216d825101ed1c4..10ebc1499e87d5df0c6cc7842e62ea1b1953352c 100644 --- a/addons/website/models/res_users.py +++ b/addons/website/models/res_users.py @@ -2,7 +2,7 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. import logging -from odoo import api, fields, models, _ +from odoo import api, fields, models, _, Command from odoo.exceptions import ValidationError from odoo.http import request @@ -48,9 +48,12 @@ class ResUsers(models.Model): @api.model def _signup_create_user(self, values): current_website = self.env['website'].get_current_website() + # Note that for the moment, portal users can connect to all websites of + # all companies as long as the specific_user_account setting is not + # activated. + values['company_id'] = current_website.company_id.id + values['company_ids'] = [Command.link(current_website.company_id.id)] if request and current_website.specific_user_account: - values['company_id'] = current_website.company_id.id - values['company_ids'] = [(4, current_website.company_id.id)] values['website_id'] = current_website.id new_user = super(ResUsers, self)._signup_create_user(values) return new_user diff --git a/addons/website/tests/test_res_users.py b/addons/website/tests/test_res_users.py index 8aca623bec3300f4fa07c445482a2c42e310bba5..87814cbda839f11b9bd889beed4cf6f3da53e899 100644 --- a/addons/website/tests/test_res_users.py +++ b/addons/website/tests/test_res_users.py @@ -7,6 +7,7 @@ from odoo.tests.common import TransactionCase, new_test_user from odoo.exceptions import ValidationError from odoo.tools import mute_logger from odoo.service.model import retrying +from odoo.addons.website.tools import MockRequest class TestWebsiteResUsers(TransactionCase): @@ -64,3 +65,40 @@ class TestWebsiteResUsers(TransactionCase): # 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)