These revs. introduced an API change in the _name_search method.

Indeed, the 'operator' attribute used to have 'ilike' as default value.
This cannot be changed, as every modules overriding this method
overrided it using the signature with operator='ilike'

For instance, _name_search method of addons/base/ir/ir_model.py
expects having 'ilike' as operator.
As it was not anymore the case,
it leaded to a crash when performing a name_search call on the model ir.model,
like when adding a new custom field to a model, from the web client.

opw-626161
This commit is contained in:
Denis Ledoux 2015-01-21 18:26:28 +01:00
parent 2c99ddc612
commit dcfd94cbf5
3 changed files with 12 additions and 10 deletions

View File

@ -642,11 +642,12 @@ class test_m2o(ImporterCase):
@mute_logger('openerp.sql_db')
def test_fail_id_mistype(self):
result = self.import_(['value/.id'], [["foo"]])
try:
int("foo")
except ValueError, exc:
expected_message = unicode(exc)
self.assertEqual(result['messages'], [message(expected_message)])
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')]))
])
self.assertIs(result['ids'], False)
def test_sub_field(self):

View File

@ -1691,7 +1691,7 @@ class BaseModel(object):
return False
@api.model
def name_search(self, name='', args=None, operator=None, limit=100):
def name_search(self, name='', args=None, operator='ilike', limit=100):
""" name_search(name='', args=None, operator='ilike', limit=100) -> records
Search for records that have a display name matching the given
@ -1717,7 +1717,7 @@ class BaseModel(object):
"""
return self._name_search(name, args, operator, limit=limit)
def _name_search(self, cr, user, name='', args=None, operator=None, context=None, limit=100, name_get_uid=None):
def _name_search(self, cr, user, name='', args=None, operator='ilike', 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 [])
@ -1725,9 +1725,6 @@ 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,6 +1195,10 @@ 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)