diff --git a/addons/website/tools.py b/addons/website/tools.py index fde1e94651d..e634db9d603 100644 --- a/addons/website/tools.py +++ b/addons/website/tools.py @@ -47,6 +47,9 @@ class MockRequest(object): }, 'redirect': werkzeug.utils.redirect, 'session': { + 'geoip': { + 'country_code': kw.get('country_code'), + }, 'sale_order_id': kw.get('sale_order_id'), }, 'website': kw.get('website'), diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py index 8b37915e6be..725c0423afb 100644 --- a/addons/website_sale/controllers/main.py +++ b/addons/website_sale/controllers/main.py @@ -609,8 +609,7 @@ class WebsiteSale(ProductConfiguratorController): if request.website.specific_user_account: new_values['website_id'] = request.website.id - if order.partner_id.id == request.website.user_id.sudo().partner_id.id: - # If the partner is public, we assign the company of the website + if mode[0] == 'new': new_values['company_id'] = request.website.company_id.id lang = request.lang if request.lang in request.website.mapped('language_ids.code') else None diff --git a/addons/website_sale/tests/test_sale_process.py b/addons/website_sale/tests/test_sale_process.py index 6609b4e4d9c..a0fc55c4106 100644 --- a/addons/website_sale/tests/test_sale_process.py +++ b/addons/website_sale/tests/test_sale_process.py @@ -3,6 +3,7 @@ import odoo.tests +from odoo import api from odoo.addons.website_sale.controllers.main import WebsiteSale from odoo.addons.website.tools import MockRequest @@ -21,25 +22,111 @@ class TestUi(odoo.tests.HttpCase): @odoo.tests.tagged('post_install', '-at_install') class TestWebsiteSaleCheckoutAddress(odoo.tests.TransactionCase): - def test_01_edit_billing_address(self): - website = self.env['website'].browse(1) - p = self.env.user.partner_id - so = self.env['sale.order'].create({ - 'partner_id': p.id, - 'website_id': website.id, + ''' The goal of this method class is to test the address management on + the checkout (new/edit billing/shipping, company_id, website_id..). + ''' + def setUp(self): + super(TestWebsiteSaleCheckoutAddress, self).setUp() + self.website = self.env['website'].browse(1) + self.country_id = self.env['res.country'].search([], limit=1).id + self.WebsiteSaleController = WebsiteSale() + self.default_address_values = { + 'name': 'a res.partner address', 'email': 'email@email.email', 'street': 'ooo', + 'city': 'ooo', 'country_id': self.country_id, 'submitted': 1, + } + + def _create_so(self, partner_id=None): + return self.env['sale.order'].create({ + 'partner_id': partner_id, + 'website_id': self.website.id, 'order_line': [(0, 0, { 'product_id': self.env['product.product'].create({'name': 'Product A', 'list_price': 100}).id, 'name': 'Product A', })] }) - country_id = self.env['res.country'].search([], limit=1).id - WebsiteSaleController = WebsiteSale() - with MockRequest(self.env, website=website, sale_order_id=so.id): - WebsiteSaleController.address(name='website_sale test user', email='email@email.email', street='ooo', city='ooo', country_id=country_id, submitted=1, partner_id=p.id) - self.assertFalse(p.website_id, "Partner should not have a website set on him after editing billing.") + def _get_last_address(self, partner): + ''' Useful to retrieve the last created shipping address ''' + return partner.child_ids.sorted('id', reverse=True)[0] - website.specific_user_account = True - with MockRequest(self.env, website=website, sale_order_id=so.id): - WebsiteSaleController.address(name='website_sale test user', email='email@email.email', street='ooo', city='ooo', country_id=country_id, submitted=1, partner_id=p.id) - self.assertEqual(p.website_id, website, "Partner should have a website set on him after editing billing.") + # TEST WEBSITE + def test_01_create_shipping_address_specific_user_account(self): + ''' Ensure `website_id` is correctly set (specific_user_account) ''' + p = self.env.user.partner_id + so = self._create_so(p.id) + + with MockRequest(self.env, website=self.website, sale_order_id=so.id): + self.WebsiteSaleController.address(**self.default_address_values) + self.assertFalse(self._get_last_address(p).website_id, "New shipping address should not have a website set on it (no specific_user_account).") + + self.website.specific_user_account = True + + self.WebsiteSaleController.address(**self.default_address_values) + self.assertEqual(self._get_last_address(p).website_id, self.website, "New shipping address should have a website set on it (specific_user_account).") + + # TEST COMPANY + def _setUp_multicompany_env(self): + ''' Have 2 companies A & B. + Have 1 website 1 which company is B + Have admin on company A + ''' + self.company_a = self.env['res.company'].create({ + 'name': 'Company A', + }) + self.company_b = self.env['res.company'].create({ + 'name': 'Company B', + }) + self.company_c = self.env['res.company'].create({ + 'name': 'Company C', + }) + self.website.company_id = self.company_b + self.env.user.company_id = self.company_a + + self.demo_user = self.env.ref('base.user_demo') + self.demo_user.company_ids += self.company_c + self.demo_user.company_id = self.company_c + self.demo_partner = self.demo_user.partner_id + + def test_02_demo_address_and_company(self): + ''' This test ensure that the company_id of the address (partner) is + correctly set and also, is not wrongly changed. + eg: new shipping should use the company of the website and not the + one from the admin, and editing a billing should not change its + company. + ''' + self._setUp_multicompany_env() + so = self._create_so(self.demo_partner.id) + + env = api.Environment(self.env.cr, self.demo_user.id, {}) + # change also website env for `sale_get_order` to not change order partner_id + with MockRequest(env, website=self.website.with_env(env), sale_order_id=so.id): + # 1. Logged in user, new shipping + self.WebsiteSaleController.address(**self.default_address_values) + new_shipping = self._get_last_address(self.demo_partner) + self.assertTrue(new_shipping.company_id != self.env.user.company_id, "Logged in user new shipping should not get the company of the sudo() neither the one from it's partner..") + self.assertEqual(new_shipping.company_id, self.website.company_id, ".. but the one from the website.") + + # 2. Logged in user, edit billing + self.default_address_values['partner_id'] = self.demo_partner.id + self.WebsiteSaleController.address(**self.default_address_values) + self.assertEqual(self.demo_partner.company_id, self.company_c, "Logged in user edited billing (the partner itself) should not get its company modified.") + + def test_03_public_user_address_and_company(self): + ''' Same as test_02 but with public user ''' + self._setUp_multicompany_env() + so = self._create_so(self.website.user_id.partner_id.id) + + env = api.Environment(self.env.cr, self.website.user_id.id, {}) + # change also website env for `sale_get_order` to not change order partner_id + with MockRequest(env, website=self.website.with_env(env), sale_order_id=so.id): + # 1. Public user, new billing + self.default_address_values['partner_id'] = -1 + self.WebsiteSaleController.address(**self.default_address_values) + new_partner = so.partner_id + self.assertNotEqual(new_partner, self.website.user_id.partner_id, "New billing should have created a new partner and assign it on the SO") + self.assertEqual(new_partner.company_id, self.website.company_id, "The new partner should get the company of the website") + + # 2. Public user, edit billing + self.default_address_values['partner_id'] = new_partner.id + self.WebsiteSaleController.address(**self.default_address_values) + self.assertEqual(new_partner.company_id, self.website.company_id, "Public user edited billing (the partner itself) should not get its company modified.")