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