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()

Reply via email to