diff options
| author | Romain Derie <rde@odoo.com> | 2019-07-04 13:49:59 +0000 |
|---|---|---|
| committer | Romain Derie <rde@odoo.com> | 2019-07-04 13:58:23 +0000 |
| commit | 789aa140b96226718bfecc52ec2fe33273e31d3f (patch) | |
| tree | f255579ecc4a9e574e2d3b81b93716a400dc3bd0 /addons | |
| parent | 1c57d5edcfe75b8b46b5453ba96e815235be68a8 (diff) | |
[FIX] website, website_sale: correctly set company_id on address
During checkout, the user can create a new billing (only for public user as it
will create a 'normal' `res.partner`), a new shipping, edit its billing (that
will edit himself) or edit its shipping address.
All those cases will go through the exact same methods, public user and logged
in user included.
This previously led to multiple issues and multiple fixes to correctly set
`company_id` and `website_id` on the address (res.partner).
See 44372471ef that fixed the `website_id` part.
See 3a0f05f33 that fixed the multi-company behavior, but needed 2ba71140 to not
modify the company of an already created partner, but was still incomplete as
after that fix a logged in user would still have the admin (sudo) company
instead of the website one as supposed.
This commit will fix that bug and add some tests for all mentionned issues.
Related to #28853 as we want to backport the mentionned commit but needed to be
fix first.
closes odoo/odoo#34596
Signed-off-by: Jérémy Kersten (jke) <jke@openerp.com>
Diffstat (limited to 'addons')
| -rw-r--r-- | addons/website/tools.py | 3 | ||||
| -rw-r--r-- | addons/website_sale/controllers/main.py | 3 | ||||
| -rw-r--r-- | addons/website_sale/tests/test_sale_process.py | 117 |
3 files changed, 106 insertions, 17 deletions
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] + + # 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") - 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.") + # 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.") |
