details:   https://code.tryton.org/tryton/commit/9979633cedb5
branch:    7.0
user:      Cédric Krier <[email protected]>
date:      Thu Jun 11 14:29:17 2026 +0200
description:
        Support query without where clause when searching on Many2One with 
where operator

        When not using subquery but EXISTS and having a target domain converted 
into
        UNION, the query result does not have a 'where' clause.

        Closes #14889
        (grafted from 96982406e129d1e063c1a332289376f45e586ecc)
diffstat:

 trytond/trytond/model/fields/many2one.py     |   5 ++++-
 trytond/trytond/tests/test_field_many2one.py |  21 +++++++++++++++++++++
 2 files changed, 25 insertions(+), 1 deletions(-)

diffs (46 lines):

diff -r 3acc31c8c8f5 -r 9979633cedb5 trytond/trytond/model/fields/many2one.py
--- a/trytond/trytond/model/fields/many2one.py  Sun May 10 11:44:04 2026 +0200
+++ b/trytond/trytond/model/fields/many2one.py  Thu Jun 11 14:29:17 2026 +0200
@@ -250,7 +250,10 @@
                 target_id, = query.columns
                 if isinstance(target_id, As):
                     target_id = target_id.expression
-                query.where &= target_id == column
+                if query.where is None:
+                    query.where = target_id == column
+                else:
+                    query.where &= target_id == column
                 expression = column.in_(query)
                 if operator.startswith('not'):
                     return ~expression
diff -r 3acc31c8c8f5 -r 9979633cedb5 
trytond/trytond/tests/test_field_many2one.py
--- a/trytond/trytond/tests/test_field_many2one.py      Sun May 10 11:44:04 
2026 +0200
+++ b/trytond/trytond/tests/test_field_many2one.py      Thu Jun 11 14:29:17 
2026 +0200
@@ -274,6 +274,27 @@
 
         self.assertEqual(record.target.context, 'foo')
 
+    @with_transaction()
+    def test_search_where_target_union(self):
+        "Test search on Many2One using where and UNION-ed query on target"
+        pool = Pool()
+        Target = pool.get('test.many2one_target')
+        Many2One = pool.get('test.many2one')
+        target1, target2 = Target.create([
+                {'value': 1},
+                {'value': 2},
+                ])
+        many2one1, many2one2 = Many2One.create([
+                {'many2one': target1},
+                {'many2one': target2},
+                ])
+
+        many2ones = Many2One.search([
+                ('many2one', 'where',
+                    ['OR', ('value', '=', 1), ('write_uid.id', '=', -1)]),
+                ])
+        self.assertListEqual(many2ones, [many2one1])
+
 
 class FieldMany2OneTreeTestCase(unittest.TestCase):
     "Test Field Many2One Tree"

Reply via email to