From c50225d7c5f86842dc63480a26d4604e5a886171 Mon Sep 17 00:00:00 2001 From: David Date: Tue, 19 Nov 2024 11:34:15 +0100 Subject: [PATCH] [FIX] product_multi_company: search in False product.product has a delageted inheritance from product.template so we are getting the fields logic but not the ORM logic. We need some of that logic in the search method to be able to get the right results with domains like [("company_id", "in", [1, False]) to include records which are shared between companies. TT51779 --- product_multi_company/models/__init__.py | 1 + .../models/product_product.py | 13 +++++++++++ .../static/description/index.html | 12 ++++++---- .../tests/test_product_multi_company.py | 23 +++++++++++++++++++ 4 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 product_multi_company/models/product_product.py diff --git a/product_multi_company/models/__init__.py b/product_multi_company/models/__init__.py index 8e4939c9bfd..e9cce9df06b 100644 --- a/product_multi_company/models/__init__.py +++ b/product_multi_company/models/__init__.py @@ -3,3 +3,4 @@ from . import product_template from . import product_category +from . import product_product diff --git a/product_multi_company/models/product_product.py b/product_multi_company/models/product_product.py new file mode 100644 index 00000000000..2da6722165d --- /dev/null +++ b/product_multi_company/models/product_product.py @@ -0,0 +1,13 @@ +# Copyright 2024 Tecnativa - David Vidal +# License AGPL-3 - See https://www.gnu.org/licenses/agpl-3.0.html + +from odoo import api, models + + +class ProductProduct(models.Model): + _inherit = "product.product" + + @api.model + def search(self, args, offset=0, limit=None, order=None, count=False): + dom = self.env["multi.company.abstract"]._patch_company_domain(args) + return super().search(dom, offset=offset, limit=limit, order=order, count=count) diff --git a/product_multi_company/static/description/index.html b/product_multi_company/static/description/index.html index 79141dc2770..efbd78d0141 100644 --- a/product_multi_company/static/description/index.html +++ b/product_multi_company/static/description/index.html @@ -1,4 +1,3 @@ - @@ -9,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -275,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -301,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { @@ -429,7 +429,9 @@

Contributors

Maintainers

This module is maintained by the OCA.

-Odoo Community Association + +Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

diff --git a/product_multi_company/tests/test_product_multi_company.py b/product_multi_company/tests/test_product_multi_company.py index 55cb3de883b..6f1ffe78da7 100644 --- a/product_multi_company/tests/test_product_multi_company.py +++ b/product_multi_company/tests/test_product_multi_company.py @@ -60,6 +60,29 @@ def test_company_2(self): self.user_company_2 ).description_sale = "Test 3" + def test_search_product(self): + """Products with no company are shared across companies but we need to convert + those queries with an or operator""" + expected_products = ( + self.product_company_both + + self.product_company_1 + + self.product_company_none + ) + searched_templates = self.env["product.template"].search( + [ + ("company_id", "in", [self.company_1.id, False]), + ("id", "in", expected_products.product_tmpl_id.ids), + ] + ) + self.assertEqual(searched_templates, expected_products.product_tmpl_id) + searched_products = self.product_obj.search( + [ + ("company_id", "in", [self.company_1.id, False]), + ("id", "in", expected_products.ids), + ] + ) + self.assertEqual(searched_products, expected_products) + def test_uninstall(self): from ..hooks import uninstall_hook