From 548c3e9b642c3518b2d0f823a2dc89ca9aa4be78 Mon Sep 17 00:00:00 2001 From: david Date: Mon, 3 Oct 2022 08:53:20 +0200 Subject: [PATCH] [FIX] partner_pricelist_search: speedup search TT39742 --- .../models/res_partner.py | 53 +++++++++---------- .../tests/test_partner_pricelist_search.py | 14 ++--- 2 files changed, 31 insertions(+), 36 deletions(-) diff --git a/partner_pricelist_search/models/res_partner.py b/partner_pricelist_search/models/res_partner.py index aa5066030..713421fbe 100644 --- a/partner_pricelist_search/models/res_partner.py +++ b/partner_pricelist_search/models/res_partner.py @@ -1,8 +1,7 @@ # Copyright 2021 Tecnativa - Carlos Dauden # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import _, api, fields, models -from odoo.exceptions import UserError +from odoo import api, fields, models class Pricelist(models.Model): @@ -13,31 +12,27 @@ class Pricelist(models.Model): ) @api.model - def _search_property_product_pricelist(self, operator, value): - if operator == "=": - - def filter_func(partner): - return partner.property_product_pricelist.id == value - - elif operator == "!=": - - def filter_func(partner): - return partner.property_product_pricelist.id != value - - elif operator == "in": + def search(self, args, offset=0, limit=None, order=None, count=False): + # Substitute pricelist tuple + partner_domain = [ + (1, "=", 1) + if (isinstance(x, tuple) and x[0] == "property_product_pricelist") + else x + for x in args + ] + return super( + Pricelist, self.with_context(search_partner_domain=partner_domain) + ).search( + args, + offset=offset, + limit=limit, + order=order, + count=count, + ) - def filter_func(partner): - return partner.property_product_pricelist.id in value - - elif operator == "not in": - - def filter_func(partner): - return partner.property_product_pricelist.id not in value - - else: - raise UserError( - _("Pricelist field do not support search with the operator '%s'.") - % operator - ) - partners = self.with_context(prefetch_fields=False).search([]) - return [("id", "in", partners.filtered(filter_func).ids)] + @api.model + 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)] diff --git a/partner_pricelist_search/tests/test_partner_pricelist_search.py b/partner_pricelist_search/tests/test_partner_pricelist_search.py index ac7b95a55..051ae10c4 100644 --- a/partner_pricelist_search/tests/test_partner_pricelist_search.py +++ b/partner_pricelist_search/tests/test_partner_pricelist_search.py @@ -1,7 +1,6 @@ # Copyright 2021 Tecnativa - Carlos Dauden # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) -from odoo.exceptions import UserError from odoo.tests import common @@ -66,12 +65,13 @@ class TestPartnerPricelistSearch(common.SavepointCase): self.assertNotIn(self.customer_1, partners) self.assertNotIn(self.customer_2, partners) - def test_partner_pricelist_search_not_implemented(self): - """Test search not implemented""" - with self.assertRaises(UserError): - self.partner_obj.search( - [("property_product_pricelist", "ilike", "pricelist xx")] - ) + def test_partner_pricelist_search_ilike(self): + """Test search 'ilike'""" + partners = self.partner_obj.search( + [("property_product_pricelist", "ilike", "Test pricelist 1")] + ) + self.assertIn(self.customer_1, partners) + self.assertNotIn(self.customer_2, partners) def test_show_pricelist_partners(self): res = self.pricelist_1.show_pricelist_partners()