[MERGE] forward port of branch 7.0 up to revid 5274 chs@openerp.com-20140404141611...
authorChristophe Simonis <chs@openerp.com>
Fri, 4 Apr 2014 15:58:58 +0000 (17:58 +0200)
committerChristophe Simonis <chs@openerp.com>
Fri, 4 Apr 2014 15:58:58 +0000 (17:58 +0200)
bzr revid: chs@openerp.com-20140404155858-mvupqmuvi8ime2tl

1  2 
openerp/addons/base/res/res_partner.py
openerp/osv/expression.py

@@@ -26,9 -26,12 +26,10 @@@ import pyt
  
  import openerp
  from openerp import SUPERUSER_ID
 -from openerp import pooler, tools
 +from openerp import tools
  from openerp.osv import osv, fields
+ from openerp.osv.expression import get_unaccent_wrapper
  from openerp.tools.translate import _
 -from openerp.tools.yaml_import import is_comment
  
  class format_address(object):
      def fields_view_get_address(self, cr, uid, arch, context={}):
@@@ -205,34 -209,16 +206,34 @@@ class res_partner(osv.osv, format_addre
              result[partner.id] = current_partner.id
          return result
  
 -    # indirection to avoid passing a copy of the overridable method when declaring the function field
 +    def _display_name_compute(self, cr, uid, ids, name, args, context=None):
 +        context = dict(context or {})
 +        context.pop('show_address', None)
 +        context.pop('show_address_only', None)
 +        context.pop('show_email', None)
 +        return dict(self.name_get(cr, uid, ids, context=context))
 +
 +    # indirections to avoid passing a copy of the overridable method when declaring the function field
      _commercial_partner_id = lambda self, *args, **kwargs: self._commercial_partner_compute(*args, **kwargs)
 +    _display_name = lambda self, *args, **kwargs: self._display_name_compute(*args, **kwargs)
 +
 +    _commercial_partner_store_triggers = {
 +        'res.partner': (lambda self,cr,uid,ids,context=None: self.search(cr, uid, [('id','child_of',ids)], context=dict(active_test=False)),
 +                        ['parent_id', 'is_company'], 10)
 +    }
 +    _display_name_store_triggers = {
 +        'res.partner': (lambda self,cr,uid,ids,context=None: self.search(cr, uid, [('id','child_of',ids)], context=dict(active_test=False)),
 +                        ['parent_id', 'is_company', 'name'], 10)
 +    }
  
 -    _order = "name"
 +    _order = "display_name"
      _columns = {
          'name': fields.char('Name', size=128, required=True, select=True),
 +        'display_name': fields.function(_display_name, type='char', string='Name', store=_display_name_store_triggers, select=True),
          'date': fields.date('Date', select=1),
          'title': fields.many2one('res.partner.title', 'Title'),
-         'parent_id': fields.many2one('res.partner', 'Related Company'),
+         'parent_id': fields.many2one('res.partner', 'Related Company', select=True),
 -        'child_ids': fields.one2many('res.partner', 'parent_id', 'Contacts', domain=[('active','=',True)]), # force "active_test" domain to bypass _search() override    
 +        'child_ids': fields.one2many('res.partner', 'parent_id', 'Contacts', domain=[('active','=',True)]), # force "active_test" domain to bypass _search() override
          'ref': fields.char('Reference', size=64, select=1),
          'lang': fields.selection(_lang_get, 'Language',
              help="If the selected language is loaded in the system, all documents related to this contact will be printed in this language. If not, it will be English."),
              if operator in ('=ilike', '=like'):
                  operator = operator[1:]
  
-             query = ('SELECT id FROM res_partner ' +
-                      where_str +  '(email ' + operator + ''' %s
-                           OR display_name ''' + operator + ''' %s)
-                     ORDER BY display_name''')
+             unaccent = get_unaccent_wrapper(cr)
 -            # TODO: simplify this in trunk with `display_name`, once it is stored
 -            # Perf note: a CTE expression (WITH ...) seems to have an even higher cost
 -            #            than this query with duplicated CASE expressions. The bulk of
 -            #            the cost is the ORDER BY, and it is inevitable if we want
 -            #            relevant results for the next step, otherwise we'd return
 -            #            a random selection of `limit` results.
 -
 -            display_name = """CASE WHEN company.id IS NULL OR res_partner.is_company
 -                                   THEN {partner_name}
 -                                   ELSE {company_name} || ', ' || {partner_name}
 -                               END""".format(partner_name=unaccent('res_partner.name'),
 -                                             company_name=unaccent('company.name'))
 -
 -            query = """SELECT res_partner.id
++            query = """SELECT id
+                          FROM res_partner
 -                    LEFT JOIN res_partner company
 -                           ON res_partner.parent_id = company.id
+                       {where} ({email} {operator} {percent}
+                            OR {display_name} {operator} {percent})
+                      ORDER BY {display_name}
+                     """.format(where=where_str, operator=operator,
 -                               email=unaccent('res_partner.email'),
 -                               percent=unaccent('%s'),
 -                               display_name=display_name)
++                               email=unaccent('email'),
++                               display_name=unaccent('display_name'),
++                               percent=unaccent('%s'))
  
              where_clause_params += [search_name, search_name]
              if limit:
Simple merge