changeset 358eb1aba46a in trytond:5.0
details: https://hg.tryton.org/trytond?cmd=changeset&node=358eb1aba46a
description:
Negate the origin expression of Many2Many with 'not where' operator
issue11425
review403401002
(grafted from 9528c360ac5afd830b0be6260c0b089a4011715d)
diffstat:
trytond/model/fields/many2many.py | 6 ++++--
trytond/tests/test_field_many2many.py | 15 +++++++++++++++
trytond/tests/test_field_one2many.py | 15 +++++++++++++++
3 files changed, 34 insertions(+), 2 deletions(-)
diffs (72 lines):
diff -r 8cca1be334a3 -r 358eb1aba46a trytond/model/fields/many2many.py
--- a/trytond/model/fields/many2many.py Mon Apr 25 23:26:47 2022 +0200
+++ b/trytond/model/fields/many2many.py Wed Apr 27 17:51:52 2022 +0200
@@ -420,7 +420,7 @@
relation_domain.append(
(self.origin, 'like', Model.__name__ + ',%'))
else:
- relation_domain = [self.target, operator, value]
+ relation_domain = [self.target, 'where', value]
rule_domain = Rule.domain_get(Relation.__name__, mode='read')
if rule_domain:
relation_domain = [relation_domain, rule_domain]
@@ -437,6 +437,8 @@
query_table = convert_from(None, relation_tables)
query = query_table.select(origin, where=expression)
expression = table.id.in_(query)
- if operator.startswith('!') or operator.startswith('not '):
+ if operator == 'not where':
+ expression = ~expression
+ elif operator.startswith('!') or operator.startswith('not '):
expression |= ~table.id.in_(relation.select(origin))
return expression
diff -r 8cca1be334a3 -r 358eb1aba46a trytond/tests/test_field_many2many.py
--- a/trytond/tests/test_field_many2many.py Mon Apr 25 23:26:47 2022 +0200
+++ b/trytond/tests/test_field_many2many.py Wed Apr 27 17:51:52 2022 +0200
@@ -243,6 +243,21 @@
self.assertListEqual(many2manys, [])
@with_transaction()
+ def test_search_not_where_others(self):
+ "Test search many2many not where with others"
+ Many2Many = self.Many2Many()
+ many2many, = Many2Many.create([{
+ 'targets': [('create', [
+ {'name': "Target"}, {'name': "Foo"}])],
+ }])
+
+ many2manys = Many2Many.search([
+ ('targets', 'not where', [('name', '=', "Target")]),
+ ])
+
+ self.assertListEqual(many2manys, [])
+
+ @with_transaction()
def test_write_write(self):
"Test write many2many write"
Many2Many = self.Many2Many()
diff -r 8cca1be334a3 -r 358eb1aba46a trytond/tests/test_field_one2many.py
--- a/trytond/tests/test_field_one2many.py Mon Apr 25 23:26:47 2022 +0200
+++ b/trytond/tests/test_field_one2many.py Wed Apr 27 17:51:52 2022 +0200
@@ -243,6 +243,21 @@
self.assertListEqual(one2manys, [])
@with_transaction()
+ def test_search_not_where_others(self):
+ "Test search one2many not where with others"
+ One2Many = self.One2Many()
+ one2many, = One2Many.create([{
+ 'targets': [('create', [
+ {'name': "Target"}, {'name': "Foo"}])],
+ }])
+
+ one2manys = One2Many.search([
+ ('targets', 'not where', [('name', '=', "Target")]),
+ ])
+
+ self.assertListEqual(one2manys, [])
+
+ @with_transaction()
def test_write_write(self):
"Test write one2many write"
One2Many = self.One2Many()