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) --HG-- branch : 8.0
This commit is contained in:
@@ -284,7 +284,10 @@ class Many2One(Field):
|
||||
if use_subquery:
|
||||
expression = column.in_(query)
|
||||
else:
|
||||
query.where &= target_id == column
|
||||
if query.where is None:
|
||||
query.where = target_id == column
|
||||
else:
|
||||
query.where &= target_id == column
|
||||
expression = Exists(query)
|
||||
if operator.startswith('not'):
|
||||
return ~expression
|
||||
|
||||
@@ -332,6 +332,27 @@ class SearchTestCaseMixin:
|
||||
], query=True)
|
||||
self.assertIn(self._strategy, str(query))
|
||||
|
||||
@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 FieldMany2OneTestCase(
|
||||
TestCase, CommonTestCaseMixin, SearchTestCaseMixin):
|
||||
|
||||
Reference in New Issue
Block a user