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={}):
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: