[FIX] website_sale: archive pricelist if website have another available

Steps to reproduce:

  - Install eCommerce module
  - Select company A and set only one pricelist with:
    - company = company A
    - website = website of company A
  - Select company B and set multiple pricelist.
  - Switch to company B
  - Archive a pricelist

Issue:

  Error: "With this action, "Website of company A" website would not
  have any pricelist available".

Solution:

  Use sudo() when searching websites to don't use multi-company
  compliant ir.rule `product_pricelist_comp_rule` (in website_sale) when
  getting pricelist_ids (and therefore allow checking all pricelists for
  all websites in all companies).

opw-2759069

closes odoo/odoo#88703

X-original-commit: 4b3404087f4541cf52b84ef668da4055da5ad9e2
Signed-off-by: Romain Derie (rde) <rde@odoo.com>
Signed-off-by: Nasreddin Boulif (bon) <bon@odoo.com>
Co-authored-by: Romain Derie <rde@odoo.com>
This commit is contained in:
Nasreddin Boulif (bon)
2022-04-13 22:13:09 +02:00
co-authored by Romain Derie
parent 84d8bf8167
commit a50465bb3c
2 changed files with 39 additions and 2 deletions
@@ -66,7 +66,8 @@ class ProductPricelist(models.Model):
def _check_website_pricelist(self):
for website in self.env['website'].search([]):
if not website.pricelist_ids:
# sudo() to be able to read pricelists/website from another company
if not website.sudo().pricelist_ids:
raise UserError(_("With this action, '%s' website would not have any pricelist available.") % (website.name))
def _is_available_on_website(self, website):
@@ -495,13 +495,23 @@ class TestWebsitePriceListMultiCompany(TransactionCaseWithUserDemo):
self.company2 = self.env['res.company'].create({'name': 'Test Company'})
self.demo_user.company_ids += self.company2
# Set company2 as current company for demo user
Website = self.env['website']
self.website = self.env.ref('website.default_website')
self.website.company_id = self.company2
# Delete unused website, it will make PL manipulation easier, avoiding
# UserError being thrown when a website wouldn't have any PL left.
Website.search([('id', '!=', self.website.id)]).unlink()
self.website2 = Website.create({
'name': 'Website 2',
'company_id': self.company1.id,
})
# Create a company pricelist for each company and set it to demo user
self.c1_pl = self.env['product.pricelist'].create({
'name': 'Company 1 Pricelist',
'company_id': self.company1.id,
# The `website_id` field will default to the company's website,
# in this case `self.website2`.
})
self.c2_pl = self.env['product.pricelist'].create({
'name': 'Company 2 Pricelist',
@@ -517,7 +527,6 @@ class TestWebsitePriceListMultiCompany(TransactionCaseWithUserDemo):
irp1 = self.env['ir.property'].with_company(self.company1)._get("property_product_pricelist", "res.partner", self.demo_user.partner_id.id)
irp2 = self.env['ir.property'].with_company(self.company2)._get("property_product_pricelist", "res.partner", self.demo_user.partner_id.id)
self.assertEqual((irp1, irp2), (self.c1_pl, self.c2_pl), "Ensure there is an `ir.property` for demo partner for every company, and that the pricelist is the company specific one.")
simulate_frontend_context(self)
# ---------------------------------- IR.PROPERTY -------------------------------------
# id | name | res_id | company_id | value_reference
# ------------------------------------------------------------------------------------
@@ -537,6 +546,8 @@ class TestWebsitePriceListMultiCompany(TransactionCaseWithUserDemo):
for the company1 as we should get the website's company pricelist
and not the demo user's current company pricelist.
'''
simulate_frontend_context(self, self.website.id)
# First check: It should return ir.property,4 as company_id is
# website.company_id and not env.user.company_id
company_id = self.website.company_id.id
@@ -549,3 +560,28 @@ class TestWebsitePriceListMultiCompany(TransactionCaseWithUserDemo):
# also read a pricelist from another company if that company is the one
# from the currently visited website.
self.env(user=self.user_demo)['product.pricelist'].browse(demo_pl.id).name
def test_archive_pricelist_1(self):
''' Test that when a pricelist is archived, the check that verify that
all website have at least one pricelist have access to all
pricelists (considering all companies).
'''
self.c2_pl.website_id = self.website
c2_pl2 = self.c2_pl.copy({'name': 'Copy of c2_pl'})
self.env['product.pricelist'].search([
('id', 'not in', (self.c2_pl + self.c1_pl + c2_pl2).ids)
]).write({'active': False})
# ---------------- PRICELISTS ----------------
# name | website_id | company_id |
# --------------------------------------------
# self.c1_pl | self.website2 | self.company1 |
# self.c2_pl | self.website | self.company2 |
# c2_pl2 | self.website | self.company2 |
self.demo_user.groups_id += self.env.ref('sales_team.group_sale_manager')
# The test is here: while having access only to self.company2 records,
# archive should not raise an error
self.c2_pl.with_user(self.demo_user).with_context(allowed_company_ids=self.company2.ids).write({'active': False})