diff --git a/addons/purchase/models/res_partner.py b/addons/purchase/models/res_partner.py index e323fe95658..56d79315966 100644 --- a/addons/purchase/models/res_partner.py +++ b/addons/purchase/models/res_partner.py @@ -53,3 +53,11 @@ class res_partner(models.Model): supplier_invoice_count = fields.Integer(compute='_compute_supplier_invoice_count', string='# Vendor Bills') purchase_warn = fields.Selection(WARNING_MESSAGE, 'Purchase Order', help=WARNING_HELP, default="no-message") purchase_warn_msg = fields.Text('Message for Purchase Order') + + def _get_name_search_join_clause(self): + res = super()._get_name_search_join_clause() + partner_search_mode = self.env.context.get('res_partner_search_mode') + if partner_search_mode == 'supplier': + join_clause = "LEFT JOIN {table} ON res_partner.id = {table}.partner_id".format(table=self.env['purchase.order']._table) + return '%s %s' % (res, join_clause) if res else join_clause + return res diff --git a/addons/sale/models/res_partner.py b/addons/sale/models/res_partner.py index fac5165f55f..fa9e296580f 100644 --- a/addons/sale/models/res_partner.py +++ b/addons/sale/models/res_partner.py @@ -40,3 +40,11 @@ class ResPartner(models.Model): ('state', 'in', ['sent', 'sale', 'done']) ], limit=1) return can_edit_vat and not bool(has_so) + + def _get_name_search_join_clause(self): + res = super()._get_name_search_join_clause() + partner_search_mode = self.env.context.get('res_partner_search_mode') + if partner_search_mode == 'customer': + join_clause = "LEFT JOIN {table} ON res_partner.id = {table}.partner_id".format(table=self.env['sale.order']._table) + return '%s %s' % (res, join_clause) if res else join_clause + return res diff --git a/odoo/addons/base/models/res_partner.py b/odoo/addons/base/models/res_partner.py index 3e84b921882..ce996272ac3 100644 --- a/odoo/addons/base/models/res_partner.py +++ b/odoo/addons/base/models/res_partner.py @@ -172,10 +172,6 @@ class Partner(models.Model): column2='category_id', string='Tags', default=_default_category) credit_limit = fields.Float(string='Credit Limit') active = fields.Boolean(default=True) - customer = fields.Boolean(string='Is a Customer', default=True, - help="Check this box if this contact is a customer. It can be selected in sales orders.") - supplier = fields.Boolean(string='Is a Vendor', - help="Check this box if this contact is a vendor. It can be selected in purchase orders.") employee = fields.Boolean(help="Check this box if this contact is an Employee.") function = fields.Char(string='Job Position') type = fields.Selection( @@ -760,6 +756,9 @@ class Partner(models.Model): return super(Partner, self)._search(args, offset=offset, limit=limit, order=order, count=count, access_rights_uid=access_rights_uid) + def _get_name_search_join_clause(self): + return '' + @api.model def _name_search(self, name, args=None, operator='ilike', limit=100, name_get_uid=None): self = self.with_user(name_get_uid or self.env.uid) @@ -782,16 +781,21 @@ class Partner(models.Model): unaccent = get_unaccent_wrapper(self.env.cr) + join_clause = self._get_name_search_join_clause() + query = """SELECT res_partner.id FROM {from_str} + {join} {where} ({email} {operator} {percent} OR {display_name} {operator} {percent} OR {reference} {operator} {percent} OR {vat} {operator} {percent}) -- don't panic, trust postgres bitmap - ORDER BY {display_name} {operator} {percent} desc, + GROUP BY res_partner.id + ORDER BY COUNT(*) DESC, {display_name} {operator} {percent} desc, {display_name} """.format(from_str=from_str, + join=join_clause, where=where_str, operator=operator, email=unaccent('res_partner.email'),