Merge pull request #3520 from odoo-dev/8.0-fix-name_search-cto

[FIX] name_search() using ilike on field id or any integer field
This commit is contained in:
Raphael Collet 2015-01-20 09:56:04 +01:00
commit d751c08e12
3 changed files with 10 additions and 12 deletions

View File

@ -642,12 +642,11 @@ class test_m2o(ImporterCase):
@mute_logger('openerp.sql_db')
def test_fail_id_mistype(self):
result = self.import_(['value/.id'], [["foo"]])
self.assertEqual(result['messages'], [
message(u"Invalid database id 'foo' for the field 'unknown'",
moreinfo=moreaction(res_model='ir.model.data',
domain=[('model','=','export.integer')]))
])
try:
int("foo")
except ValueError, exc:
expected_message = unicode(exc)
self.assertEqual(result['messages'], [message(expected_message)])
self.assertIs(result['ids'], False)
def test_sub_field(self):

View File

@ -1707,7 +1707,7 @@ class BaseModel(object):
return False
@api.model
def name_search(self, name='', args=None, operator='ilike', limit=100):
def name_search(self, name='', args=None, operator=None, limit=100):
""" name_search(name='', args=None, operator='ilike', limit=100) -> records
Search for records that have a display name matching the given
@ -1733,7 +1733,7 @@ class BaseModel(object):
"""
return self._name_search(name, args, operator, limit=limit)
def _name_search(self, cr, user, name='', args=None, operator='ilike', context=None, limit=100, name_get_uid=None):
def _name_search(self, cr, user, name='', args=None, operator=None, context=None, limit=100, name_get_uid=None):
# private implementation of name_search, allows passing a dedicated user
# for the name_get part to solve some access rights issues
args = list(args or [])
@ -1741,6 +1741,9 @@ class BaseModel(object):
if not self._rec_name:
_logger.warning("Cannot execute name_search, no _rec_name defined on %s", self._name)
elif not (name == '' and operator == 'ilike'):
if operator is None:
field = self._fields[self._rec_name]
operator = ('=' if field.type == 'integer' else 'ilike')
args += [(self._rec_name, operator, name)]
access_rights_uid = name_get_uid or user
ids = self._search(cr, user, args, limit=limit, context=context, access_rights_uid=access_rights_uid)

View File

@ -1195,10 +1195,6 @@ class expression(object):
query, params = self.__leaf_to_sql(
create_substitution_leaf(eleaf, (left, '=', right), model))
elif left == 'id':
query = '%s.id %s %%s' % (table_alias, operator)
params = right
else:
need_wildcard = operator in ('like', 'ilike', 'not like', 'not ilike')
sql_operator = {'=like': 'like', '=ilike': 'ilike'}.get(operator, operator)