From ce4c692c81ecbd01ffce4636857bbe173b7da918 Mon Sep 17 00:00:00 2001 From: Romain Derie Date: Fri, 11 Jun 2021 11:09:22 +0000 Subject: [PATCH] [IMP] website_sale: don't show product from another website to admin Before this commit, the alternatives products were not multi-website filtered to the admin. The suggested product were filtered by website thanks to the `website_published` filter. This only concern the admins, as for portal and public user, all of this is done automatically by the ACLs anyway, where we force_domain to `website_published` products, which also filter by website (see the mixin). This will also eases module inheritance as we use `sale_product_domain()`. Fixes #67501 Co-authored-by: Romain Derie Co-authored-by: Florent de Labarre --- addons/website_sale/models/product.py | 8 ++++++++ addons/website_sale/models/sale_order.py | 2 +- addons/website_sale/models/website_snippet_filter.py | 2 +- addons/website_sale/views/templates.xml | 5 +++-- .../views/website_sale_comparison_template.xml | 2 +- 5 files changed, 14 insertions(+), 5 deletions(-) diff --git a/addons/website_sale/models/product.py b/addons/website_sale/models/product.py index 2f41c8cb384..0a22c37f4f3 100644 --- a/addons/website_sale/models/product.py +++ b/addons/website_sale/models/product.py @@ -207,6 +207,14 @@ class ProductTemplate(models.Model): product_template_image_ids = fields.One2many('product.image', 'product_tmpl_id', string="Extra Product Media", copy=True) + def _get_website_accessory_product(self): + domain = self.env['website'].sale_product_domain() + return self.accessory_product_ids.filtered_domain(domain) + + def _get_website_alternative_product(self): + domain = self.env['website'].sale_product_domain() + return self.alternative_product_ids.filtered_domain(domain) + def _has_no_variant_attributes(self): """Return whether this `product.template` has at least one no_variant attribute. diff --git a/addons/website_sale/models/sale_order.py b/addons/website_sale/models/sale_order.py index afc2d08094c..ef3de0ae059 100644 --- a/addons/website_sale/models/sale_order.py +++ b/addons/website_sale/models/sale_order.py @@ -301,7 +301,7 @@ class SaleOrder(models.Model): accessory_products = self.env['product.product'] for line in order.website_order_line.filtered(lambda l: l.product_id): combination = line.product_id.product_template_attribute_value_ids + line.product_no_variant_attribute_value_ids - accessory_products |= line.product_id.accessory_product_ids.filtered(lambda product: + accessory_products |= line.product_id.product_tmpl_id._get_website_accessory_product().filtered(lambda product: product.website_published and product not in products and product._is_variant_possible(parent_combination=combination) and diff --git a/addons/website_sale/models/website_snippet_filter.py b/addons/website_sale/models/website_snippet_filter.py index 1f1648c0f9c..686f0fd187f 100644 --- a/addons/website_sale/models/website_snippet_filter.py +++ b/addons/website_sale/models/website_snippet_filter.py @@ -146,7 +146,7 @@ class WebsiteSnippetFilter(models.Model): if current_template.exists(): excluded_products = website.sale_get_order().order_line.product_id.ids excluded_products.extend(current_template.product_variant_ids.ids) - included_products = current_template.product_variant_ids.accessory_product_ids.filtered('website_published').ids + included_products = current_template._get_website_accessory_product().filtered('website_published').ids products_ids = list(set(included_products) - set(excluded_products)) if products_ids: domain = expression.AND([ diff --git a/addons/website_sale/views/templates.xml b/addons/website_sale/views/templates.xml index dd6723ee121..774baa957f0 100644 --- a/addons/website_sale/views/templates.xml +++ b/addons/website_sale/views/templates.xml @@ -682,10 +682,11 @@