diff --git a/openerp/addons/base/test/test_osv_expression.yml b/openerp/addons/base/test/test_osv_expression.yml index e0061135d85..7edea16d7d8 100644 --- a/openerp/addons/base/test/test_osv_expression.yml +++ b/openerp/addons/base/test/test_osv_expression.yml @@ -423,11 +423,19 @@ u1b = res_users.create(cr, uid, {'login': 'dbo2', 'partner_id': p1}) u2 = res_users.create(cr, uid, {'login': 'rpo', 'partner_id': p2}) assert [p1] == res_partner.search(cr, uid, [('user_ids', 'in', u1a)]), "o2m IN accept single int on right side" + assert [p1] == res_partner.search(cr, uid, [('user_ids', '=', 'Dédé Boitaclou')]), "o2m NOT IN matches none on the right side" + assert [] == res_partner.search(cr, uid, [('user_ids', 'in', [10000])]), "o2m NOT IN matches none on the right side" assert [p1,p2] == res_partner.search(cr, uid, [('user_ids', 'in', [u1a,u2])]), "o2m IN matches any on the right side" all_partners = res_partner.search(cr, uid, []) assert (set(all_partners) - set([p1])) == set(res_partner.search(cr, uid, [('user_ids', 'not in', u1a)])), "o2m NOT IN matches none on the right side" + # For 8.0: assert (set(all_partners) - set([p1])) == set(res_partner.search(cr, uid, [('user_ids', '!=', 'Dédé Boitaclou')])), "o2m NOT IN matches none on the right side" assert (set(all_partners) - set([p1,p2])) == set(res_partner.search(cr, uid, [('user_ids', 'not in', [u1b, u2])])), "o2m NOT IN matches none on the right side" + + + + + # child_of x returns x and its children (direct or not). company = self.browse(cr, uid, ref('ymltest_company3')) expected = [ref('ymltest_company3'), ref('ymltest_company4')] diff --git a/openerp/osv/expression.py b/openerp/osv/expression.py index 722937fb438..5fcba0b8217 100644 --- a/openerp/osv/expression.py +++ b/openerp/osv/expression.py @@ -930,6 +930,10 @@ class expression(object): call_null = False o2m_op = 'not in' if operator in NEGATIVE_TERM_OPERATORS else 'in' push(create_substitution_leaf(leaf, ('id', o2m_op, ids2), working_model)) + elif operator in ('like', 'ilike', 'in', '='): + # no match found with positive search operator => no result (FALSE_LEAF) + call_null = False + push(create_substitution_leaf(leaf, FALSE_LEAF, working_model)) if call_null: o2m_op = 'in' if operator in NEGATIVE_TERM_OPERATORS else 'not in'