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:
commit
d751c08e12
|
@ -642,12 +642,11 @@ class test_m2o(ImporterCase):
|
||||||
@mute_logger('openerp.sql_db')
|
@mute_logger('openerp.sql_db')
|
||||||
def test_fail_id_mistype(self):
|
def test_fail_id_mistype(self):
|
||||||
result = self.import_(['value/.id'], [["foo"]])
|
result = self.import_(['value/.id'], [["foo"]])
|
||||||
|
try:
|
||||||
self.assertEqual(result['messages'], [
|
int("foo")
|
||||||
message(u"Invalid database id 'foo' for the field 'unknown'",
|
except ValueError, exc:
|
||||||
moreinfo=moreaction(res_model='ir.model.data',
|
expected_message = unicode(exc)
|
||||||
domain=[('model','=','export.integer')]))
|
self.assertEqual(result['messages'], [message(expected_message)])
|
||||||
])
|
|
||||||
self.assertIs(result['ids'], False)
|
self.assertIs(result['ids'], False)
|
||||||
|
|
||||||
def test_sub_field(self):
|
def test_sub_field(self):
|
||||||
|
|
|
@ -1707,7 +1707,7 @@ class BaseModel(object):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@api.model
|
@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
|
""" name_search(name='', args=None, operator='ilike', limit=100) -> records
|
||||||
|
|
||||||
Search for records that have a display name matching the given
|
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)
|
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
|
# private implementation of name_search, allows passing a dedicated user
|
||||||
# for the name_get part to solve some access rights issues
|
# for the name_get part to solve some access rights issues
|
||||||
args = list(args or [])
|
args = list(args or [])
|
||||||
|
@ -1741,6 +1741,9 @@ class BaseModel(object):
|
||||||
if not self._rec_name:
|
if not self._rec_name:
|
||||||
_logger.warning("Cannot execute name_search, no _rec_name defined on %s", self._name)
|
_logger.warning("Cannot execute name_search, no _rec_name defined on %s", self._name)
|
||||||
elif not (name == '' and operator == 'ilike'):
|
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)]
|
args += [(self._rec_name, operator, name)]
|
||||||
access_rights_uid = name_get_uid or user
|
access_rights_uid = name_get_uid or user
|
||||||
ids = self._search(cr, user, args, limit=limit, context=context, access_rights_uid=access_rights_uid)
|
ids = self._search(cr, user, args, limit=limit, context=context, access_rights_uid=access_rights_uid)
|
||||||
|
|
|
@ -1195,10 +1195,6 @@ class expression(object):
|
||||||
query, params = self.__leaf_to_sql(
|
query, params = self.__leaf_to_sql(
|
||||||
create_substitution_leaf(eleaf, (left, '=', right), model))
|
create_substitution_leaf(eleaf, (left, '=', right), model))
|
||||||
|
|
||||||
elif left == 'id':
|
|
||||||
query = '%s.id %s %%s' % (table_alias, operator)
|
|
||||||
params = right
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
need_wildcard = operator in ('like', 'ilike', 'not like', 'not ilike')
|
need_wildcard = operator in ('like', 'ilike', 'not like', 'not ilike')
|
||||||
sql_operator = {'=like': 'like', '=ilike': 'ilike'}.get(operator, operator)
|
sql_operator = {'=like': 'like', '=ilike': 'ilike'}.get(operator, operator)
|
||||||
|
|
Loading…
Reference in New Issue