diff --git a/partner_pricelist_search/README.rst b/partner_pricelist_search/README.rst index 02ba38cb1fab..0ccf346f6aa2 100644 --- a/partner_pricelist_search/README.rst +++ b/partner_pricelist_search/README.rst @@ -7,7 +7,7 @@ Partner pricelist search !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:8d7baaa5390f3b784fc7e4931e37709178dfbb3fc819ff25f5ad37c1fab45b51 + !! source digest: sha256:8a03da2b856c7e8372bb9f5cde5c4d35d517ba154d08230490e3fe08e435d126 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png @@ -41,10 +41,11 @@ partners with that pricelist. Known issues / Roadmap ====================== -With many partner records the search can be slow because all partners are -computed. - -No grouping is allowed. +* With many partner records the search can be slow because all partners are computed. +* No grouping is allowed. +* We can't use negative operators on advanced searches as they won't throw the right + results. This seems to be due tu the subfield negative search where we end up having + an `=` operator and a ``Query`` object that is use to optimize this kind of searches. Bug Tracker =========== @@ -71,6 +72,7 @@ Contributors * Carlos Dauden * Víctor Martínez + * David Vidal Maintainers ~~~~~~~~~~~ diff --git a/partner_pricelist_search/models/res_partner.py b/partner_pricelist_search/models/res_partner.py index 052f66a65cb6..6cbb93e2ab06 100644 --- a/partner_pricelist_search/models/res_partner.py +++ b/partner_pricelist_search/models/res_partner.py @@ -16,7 +16,11 @@ def search(self, args, offset=0, limit=None, order=None, count=False): # Substitute pricelist tuple partner_domain = [ (1, "=", 1) - if (isinstance(x, (list, tuple)) and x[0] == "property_product_pricelist") + if ( + isinstance(x, (list, tuple)) + and (isinstance(x[0], str)) + and x[0].startswith("property_product_pricelist") + ) else x for x in args ] @@ -35,4 +39,12 @@ def _search_property_product_pricelist(self, operator, value): domain = self.env.context.get("search_partner_domain", []) partners = self.with_context(prefetch_fields=False).search(domain) key = "property_product_pricelist" - return [("id", "in", partners.filtered_domain([(key, operator, value)]).ids)] + pricelist_search_field = "name" if isinstance(value, str) else "id" + pricelist_ids = ( + self.env["product.pricelist"] + .search([(pricelist_search_field, operator, value)]) + .ids + ) + return [ + ("id", "in", partners.filtered_domain([(key, "in", pricelist_ids)]).ids) + ] diff --git a/partner_pricelist_search/readme/CONTRIBUTORS.rst b/partner_pricelist_search/readme/CONTRIBUTORS.rst index 0bd598fcf7d9..abc4061ee63f 100644 --- a/partner_pricelist_search/readme/CONTRIBUTORS.rst +++ b/partner_pricelist_search/readme/CONTRIBUTORS.rst @@ -2,3 +2,4 @@ * Carlos Dauden * Víctor Martínez + * David Vidal diff --git a/partner_pricelist_search/readme/ROADMAP.rst b/partner_pricelist_search/readme/ROADMAP.rst index 2568d59b2a14..b42451690f95 100644 --- a/partner_pricelist_search/readme/ROADMAP.rst +++ b/partner_pricelist_search/readme/ROADMAP.rst @@ -1,4 +1,5 @@ -With many partner records the search can be slow because all partners are -computed. - -No grouping is allowed. +* With many partner records the search can be slow because all partners are computed. +* No grouping is allowed. +* We can't use negative operators on advanced searches as they won't throw the right + results. This seems to be due tu the subfield negative search where we end up having + an `=` operator and a ``Query`` object that is use to optimize this kind of searches. diff --git a/partner_pricelist_search/static/description/index.html b/partner_pricelist_search/static/description/index.html index ce6dfacd91ce..093004a4e8e2 100644 --- a/partner_pricelist_search/static/description/index.html +++ b/partner_pricelist_search/static/description/index.html @@ -367,7 +367,7 @@

Partner pricelist search

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:8d7baaa5390f3b784fc7e4931e37709178dfbb3fc819ff25f5ad37c1fab45b51 +!! source digest: sha256:8a03da2b856c7e8372bb9f5cde5c4d35d517ba154d08230490e3fe08e435d126 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Beta License: AGPL-3 OCA/partner-contact Translate me on Weblate Try me on Runboat

This module adds search by pricelist field option in partners.

@@ -388,9 +388,13 @@

Partner pricelist search

Known issues / Roadmap

-

With many partner records the search can be slow because all partners are -computed.

-

No grouping is allowed.

+

Bug Tracker

@@ -414,6 +418,7 @@

Contributors

  • Tecnativa:
  • diff --git a/partner_pricelist_search/tests/test_partner_pricelist_search.py b/partner_pricelist_search/tests/test_partner_pricelist_search.py index 7762fa52e352..165a2916ddd4 100644 --- a/partner_pricelist_search/tests/test_partner_pricelist_search.py +++ b/partner_pricelist_search/tests/test_partner_pricelist_search.py @@ -15,12 +15,32 @@ def setUpClass(cls): cls.pricelist_2 = cls.env["product.pricelist"].create( {"name": "Test pricelist 2"} ) + cls.pricelist_3 = cls.env["product.pricelist"].create( + { + "name": "Test pricelist 3", + "item_ids": [ + ( + 0, + 0, + { + "base": "pricelist", + "base_pricelist_id": cls.pricelist_2.id, + "compute_price": "percentage", + "percent_price": 15, + }, + ) + ], + } + ) cls.customer_1 = cls.env["res.partner"].create( {"name": "Test customer 1", "property_product_pricelist": cls.pricelist_1} ) cls.customer_2 = cls.env["res.partner"].create( {"name": "Test customer 2", "property_product_pricelist": cls.pricelist_2} ) + cls.customer_3 = cls.env["res.partner"].create( + {"name": "Test customer 3", "property_product_pricelist": cls.pricelist_3} + ) cls.partner_obj = cls.env["res.partner"] def test_partner_pricelist_search_equal(self): @@ -30,6 +50,19 @@ def test_partner_pricelist_search_equal(self): ) self.assertEqual(partners, self.customer_1) + def test_partner_pricelist_advanced_search_equal(self): + """Test search '='""" + partners = self.partner_obj.search( + [ + ( + "property_product_pricelist.item_ids.base_pricelist_id", + "=", + self.pricelist_2.id, + ) + ] + ) + self.assertEqual(partners, self.customer_3) + def test_partner_pricelist_search_in(self): """Test search 'in'""" partners = self.partner_obj.search( @@ -44,6 +77,19 @@ def test_partner_pricelist_search_in(self): self.assertIn(self.customer_1, partners) self.assertIn(self.customer_2, partners) + def test_partner_pricelist_advanced_search_in(self): + """Test advanced search 'in'""" + partners = self.partner_obj.search( + [ + ( + "property_product_pricelist.item_ids.base_pricelist_id", + "in", + (self.pricelist_1 | self.pricelist_2).ids, + ) + ] + ) + self.assertEqual(partners, self.customer_3) + def test_partner_pricelist_search_not_equal(self): """Test search 'not equal'""" partners = self.partner_obj.search( @@ -74,6 +120,19 @@ def test_partner_pricelist_search_ilike(self): self.assertIn(self.customer_1, partners) self.assertNotIn(self.customer_2, partners) + def test_partner_pricelist_advanced_search_ilike(self): + """Test advanced search 'ilike'""" + partners = self.partner_obj.search( + [ + ( + "property_product_pricelist.item_ids.base_pricelist_id", + "ilike", + "Test pricelist 2", + ) + ] + ) + self.assertEqual(partners, self.customer_3) + def test_show_pricelist_partners(self): res = self.pricelist_1.show_pricelist_partners() self.assertEqual(self.partner_obj.search(res["domain"]), self.customer_1)