From baa522eba1cb5eca9aadb439bf2fd61ce0037d59 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Mon, 19 Mar 2012 14:04:22 +0100 Subject: [PATCH 1/4] [FIX] res_partner_address: make name_search consistent with respect to name_get bzr revid: rco@openerp.com-20120319130422-wc6icri4v0o3z8wg --- openerp/addons/base/res/res_partner.py | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/openerp/addons/base/res/res_partner.py b/openerp/addons/base/res/res_partner.py index f4a36b46b77..05cfb0cade5 100644 --- a/openerp/addons/base/res/res_partner.py +++ b/openerp/addons/base/res/res_partner.py @@ -349,18 +349,14 @@ class res_partner_address(osv.osv): args=[] if not context: context={} - if context.get('contact_display', 'contact')=='partner ' or context.get('contact_display', 'contact')=='partner_address ' : - ids = self.search(cr, user, [('partner_id',operator,name)], limit=limit, context=context) + if context.get('contact_display', 'contact')=='partner': + fields = ['partner_id'] else: - if not name: - ids = self.search(cr, user, args, limit=limit, context=context) - else: - ids = self.search(cr, user, [('zip','=',name)] + args, limit=limit, context=context) - if not ids: - ids = self.search(cr, user, [('city',operator,name)] + args, limit=limit, context=context) - if name: - ids += self.search(cr, user, [('name',operator,name)] + args, limit=limit, context=context) - ids += self.search(cr, user, [('partner_id',operator,name)] + args, limit=limit, context=context) + fields = ['name', 'country_id', 'city', 'street'] + if context.get('contact_display', 'contact')=='partner_address': + fields.append('partner_id') + domain = ['|'] * (len(fields)-1) + map(lambda f: (f, operator, name), fields) + ids = self.search(cr, user, domain + args, limit=limit, context=context) return self.name_get(cr, user, ids, context=context) def get_city(self, cr, uid, id): From cb53795b4c6d68c2580aa1fee77ded16b3c6e9eb Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Wed, 21 Mar 2012 11:39:12 +0100 Subject: [PATCH 2/4] [IMP] res.partner.address: improve name_search() to avoid performance issues bzr revid: rco@openerp.com-20120321103912-9kg1sftuzrxrqgxq --- openerp/addons/base/res/res_partner.py | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/openerp/addons/base/res/res_partner.py b/openerp/addons/base/res/res_partner.py index 05cfb0cade5..e6f5fea4643 100644 --- a/openerp/addons/base/res/res_partner.py +++ b/openerp/addons/base/res/res_partner.py @@ -349,14 +349,29 @@ class res_partner_address(osv.osv): args=[] if not context: context={} + if context.get('contact_display', 'contact')=='partner': - fields = ['partner_id'] + ids = self.search(cr, user, [('partner_id', operator, name)] + args, limit=limit, context=context) else: - fields = ['name', 'country_id', 'city', 'street'] + # first lookup zip code, as it is a common and efficient way to search on these data + ids = self.search(cr, user, [('zip', '=', name)] + args, limit=limit, context=context) + # then search on other fields: if context.get('contact_display', 'contact')=='partner_address': - fields.append('partner_id') - domain = ['|'] * (len(fields)-1) + map(lambda f: (f, operator, name), fields) - ids = self.search(cr, user, domain + args, limit=limit, context=context) + fields = ['name', 'country_id', 'city', 'street', 'partner_id'] + else: + fields = ['name', 'country_id', 'city', 'street'] + # Here we have to search the records that satisfy the domain: + # OR([[(f, operator, name)] for f in fields])) + args + # Searching on such a domain can be dramatically inefficient, due to the expansion made + # for field translations, and the handling of the disjunction by the DB engine itself. + # So instead, we search field by field until the search limit is reached. + while len(ids) < limit and fields: + f = fields.pop(0) + new_ids = self.search(cr, user, [(f, operator, name)] + args, limit=limit, context=context) + # extend ids with the ones in new_ids that are not in ids yet (and keep order) + old_ids = set(ids) + ids.extend([id for id in new_ids if id not in old_ids]) + return self.name_get(cr, user, ids, context=context) def get_city(self, cr, uid, id): From f53b5f3df2458b752dd386b06ec13f2c6ab6acc1 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Wed, 21 Mar 2012 11:56:58 +0100 Subject: [PATCH 3/4] [IMP] res.partner.address: in name_search, add handle case where name is empty bzr revid: rco@openerp.com-20120321105658-cnjy77e0dz40425c --- openerp/addons/base/res/res_partner.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/openerp/addons/base/res/res_partner.py b/openerp/addons/base/res/res_partner.py index e6f5fea4643..afd77b02849 100644 --- a/openerp/addons/base/res/res_partner.py +++ b/openerp/addons/base/res/res_partner.py @@ -350,7 +350,9 @@ class res_partner_address(osv.osv): if not context: context={} - if context.get('contact_display', 'contact')=='partner': + if not name: + ids = self.search(cr, user, args, limit=limit, context=context) + elif context.get('contact_display', 'contact')=='partner': ids = self.search(cr, user, [('partner_id', operator, name)] + args, limit=limit, context=context) else: # first lookup zip code, as it is a common and efficient way to search on these data @@ -372,6 +374,8 @@ class res_partner_address(osv.osv): old_ids = set(ids) ids.extend([id for id in new_ids if id not in old_ids]) + if len(ids) > limit: + ids = ids[:limit] return self.name_get(cr, user, ids, context=context) def get_city(self, cr, uid, id): From 2e5554e6bc0f656f44ef41056b19ce0241c957a5 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Wed, 21 Mar 2012 14:21:39 +0100 Subject: [PATCH 4/4] [IMP] res.partner.address: in name_search, search on partner_id before other fields bzr revid: rco@openerp.com-20120321132139-5bx0mn6hod749itq --- openerp/addons/base/res/res_partner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerp/addons/base/res/res_partner.py b/openerp/addons/base/res/res_partner.py index afd77b02849..04cabedd25d 100644 --- a/openerp/addons/base/res/res_partner.py +++ b/openerp/addons/base/res/res_partner.py @@ -359,7 +359,7 @@ class res_partner_address(osv.osv): ids = self.search(cr, user, [('zip', '=', name)] + args, limit=limit, context=context) # then search on other fields: if context.get('contact_display', 'contact')=='partner_address': - fields = ['name', 'country_id', 'city', 'street', 'partner_id'] + fields = ['partner_id', 'name', 'country_id', 'city', 'street'] else: fields = ['name', 'country_id', 'city', 'street'] # Here we have to search the records that satisfy the domain: