From dcfd94cbf526e0168f51087259434cedb2c4c061 Mon Sep 17 00:00:00 2001 From: Denis Ledoux Date: Wed, 21 Jan 2015 18:26:28 +0100 Subject: [PATCH] [FIX] orm: Revert 332154444df450489ea01522bf1360c0446f91fb && acd7d84da474eae3d64e0c5c6369c0dfb1deb395 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 --- openerp/addons/test_impex/tests/test_load.py | 11 ++++++----- openerp/models.py | 7 ++----- openerp/osv/expression.py | 4 ++++ 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/openerp/addons/test_impex/tests/test_load.py b/openerp/addons/test_impex/tests/test_load.py index 2fcf6dc2ad6..d9cbd5b100a 100644 --- a/openerp/addons/test_impex/tests/test_load.py +++ b/openerp/addons/test_impex/tests/test_load.py @@ -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): diff --git a/openerp/models.py b/openerp/models.py index 9561d3dde40..9c3febfdaa7 100644 --- a/openerp/models.py +++ b/openerp/models.py @@ -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) diff --git a/openerp/osv/expression.py b/openerp/osv/expression.py index 53ba5a2e8ae..0298bd3a90a 100644 --- a/openerp/osv/expression.py +++ b/openerp/osv/expression.py @@ -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)