Do not include record with NULL field in nested negative clause on None
Since 87456218dcc9, record with NULL field is include in nested negative clause but this should not applied if the operand is or contains None. Closes #13911 (grafted from 993d890dd786424c2cd00009045ad95a09075e72) --HG-- branch : 6.0
This commit is contained in:
1 parent
3d65696554
commit
896ccf9075
5 files changed
+43
-2
No files matched your search
@@ -40,6 +40,7 @@ by this pattern::
|
||||
.. note::
|
||||
Negative operators match records for which any of the field before the
|
||||
last dot is empty.
|
||||
Except if the operand is or contains ``None``.
|
||||
|
||||
.. warning::
|
||||
For :class:`trytond.model.fields.Reference`, an extra ending clause is
|
||||
|
||||
@@ -236,7 +236,10 @@ class Many2One(Field):
|
||||
target_domain = [target_domain, rule_domain]
|
||||
_, expression = Target.search_domain(
|
||||
target_domain, tables=target_tables)
|
||||
if operator.startswith('not') or operator == '!=':
|
||||
if ((operator.startswith('not') and not (
|
||||
operator == 'not in'
|
||||
and None in value))
|
||||
or (operator == '!=' and value is not None)):
|
||||
expression |= column == Null
|
||||
return expression
|
||||
|
||||
|
||||
@@ -189,7 +189,10 @@ class Reference(SelectionMixin, Field):
|
||||
Position(',', column) + Literal(1)),
|
||||
Model.id.sql_type().base).in_(query)
|
||||
& column.ilike(target + ',%'))
|
||||
if operator.startswith('not') or operator == '!=':
|
||||
if ((operator.startswith('not') and not (
|
||||
operator == 'not in'
|
||||
and None in value))
|
||||
or (operator == '!=' and value is not None)):
|
||||
expression |= column == Null
|
||||
return expression
|
||||
|
||||
|
||||
@@ -485,6 +485,21 @@ class FieldMany2OneTestCase(unittest.TestCase):
|
||||
])
|
||||
self.assertListEqual(result, [record])
|
||||
|
||||
result = Many2One.search([
|
||||
('many2one.value', '!=', None),
|
||||
])
|
||||
self.assertListEqual(result, [])
|
||||
|
||||
result = Many2One.search([
|
||||
('many2one.value', 'not in', [1]),
|
||||
])
|
||||
self.assertListEqual(result, [record])
|
||||
|
||||
result = Many2One.search([
|
||||
('many2one.value', 'not in', [1, None]),
|
||||
])
|
||||
self.assertListEqual(result, [])
|
||||
|
||||
@with_transaction()
|
||||
def test_context_attribute(self):
|
||||
"Test context on many2one attribute"
|
||||
|
||||
@@ -373,6 +373,25 @@ class FieldReferenceTestCase(unittest.TestCase):
|
||||
|
||||
self.assertListEqual(result, [reference])
|
||||
|
||||
result = Reference.search([
|
||||
('reference.name', '!=', None, Target.__name__),
|
||||
])
|
||||
|
||||
self.assertListEqual(result, [])
|
||||
|
||||
result = Reference.search([
|
||||
('reference.name', 'not in', ["Target"], Target.__name__),
|
||||
])
|
||||
|
||||
self.assertListEqual(result, [reference])
|
||||
|
||||
result = Reference.search([
|
||||
('reference.name', 'not in', ["Target", None],
|
||||
Target.__name__),
|
||||
])
|
||||
|
||||
self.assertListEqual(result, [])
|
||||
|
||||
@with_transaction()
|
||||
def test_write_string(self):
|
||||
"Test write reference string"
|
||||
|
||||
Reference in new issue
Block a user