diff --git a/website_sale_hide_empty_category/models/product_public_category.py b/website_sale_hide_empty_category/models/product_public_category.py index 4fe72303da..aeaf1fef2a 100644 --- a/website_sale_hide_empty_category/models/product_public_category.py +++ b/website_sale_hide_empty_category/models/product_public_category.py @@ -16,12 +16,27 @@ class ProductPublicCategory(models.Model): @api.depends("product_tmpl_ids", "child_id.has_product_recursive") @api.depends_context("website_id") def _compute_has_product_recursive(self): - for category in self: - website = self.env["website"].get_current_website() - website_domain = website.sale_product_domain() - has_products = bool( - category.product_tmpl_ids.filtered_domain(website_domain) - ) - category.has_product_recursive = has_products or any( - child.has_product_recursive for child in category.child_id + website = self.env["website"].get_current_website() + website_domain = website.sale_product_domain() + data = self.env["product.template"]._read_group( + domain=website_domain, + groupby=["public_categ_ids"], + ) + used_category_ids = set() + for group in data: + category = group[0] + if not category or (category.website_id and category.website_id != website): + continue + used_category_ids.update( + int(category_id) + for category_id in category.parent_path.split("/") + if category_id ) + # TODO: Filter categories before split in c to avoid cache because compute is + # called with only one category + categories = self.search(website.website_domain()) | self + self.env.cache.update_raw( + categories, + self._fields["has_product_recursive"], + [category.id in used_category_ids for category in categories], + )