diff --git a/odoo/addons/test_new_api/tests/test_new_fields.py b/odoo/addons/test_new_api/tests/test_new_fields.py index 34839dd517c..3fb741f98b9 100644 --- a/odoo/addons/test_new_api/tests/test_new_fields.py +++ b/odoo/addons/test_new_api/tests/test_new_fields.py @@ -747,6 +747,20 @@ class TestFields(TransactionCaseWithUserDemo): }) check(1.0) + def test_20_like(self): + """ test filtered_domain() on char fields. """ + record = self.env['test_new_api.multi.tag'].create({'name': 'Foo'}) + self.assertTrue(record.filtered_domain([('name', 'like', 'F')])) + self.assertTrue(record.filtered_domain([('name', 'ilike', 'f')])) + + record.name = 'Bar' + self.assertFalse(record.filtered_domain([('name', 'like', 'F')])) + self.assertFalse(record.filtered_domain([('name', 'ilike', 'f')])) + + record.name = False + self.assertFalse(record.filtered_domain([('name', 'like', 'F')])) + self.assertFalse(record.filtered_domain([('name', 'ilike', 'f')])) + def test_21_date(self): """ test date fields """ record = self.env['test_new_api.mixed'].create({}) diff --git a/odoo/models.py b/odoo/models.py index 9e141670b3f..45e853486e3 100644 --- a/odoo/models.py +++ b/odoo/models.py @@ -5273,20 +5273,24 @@ Fields: elif comparator == 'not in': ok = all(map(lambda x: x not in data, value)) elif comparator == 'not ilike': + data = [(x or "") for x in data] ok = all(map(lambda x: value.lower() not in x.lower(), data)) elif comparator == 'ilike': - data = [x.lower() for x in data] + data = [(x or "").lower() for x in data] ok = bool(fnmatch.filter(data, '*'+(value_esc or '').lower()+'*')) elif comparator == 'not like': + data = [(x or "") for x in data] ok = all(map(lambda x: value not in x, data)) elif comparator == 'like': + data = [(x or "") for x in data] ok = bool(fnmatch.filter(data, value and '*'+value_esc+'*')) elif comparator == '=?': ok = (value in data) or not value elif comparator in ('=like'): + data = [(x or "") for x in data] ok = bool(fnmatch.filter(data, value_esc)) elif comparator in ('=ilike'): - data = [x.lower() for x in data] + data = [(x or "").lower() for x in data] ok = bool(fnmatch.filter(data, value and value_esc.lower())) else: raise ValueError