changeset 2e696b998711 in trytond:6.0
details: https://hg.tryton.org/trytond?cmd=changeset&node=2e696b998711
description:
Evaluate invalid domain if there are many fields
We must find the field that is invalid instead of using the first one
with a
domain constraint.
issue10418
review360371002
(grafted from b64005c6aaa91dbb07b06b1269f35be937747cf0)
diffstat:
trytond/model/modelstorage.py | 9 ++++++---
trytond/tests/modelstorage.py | 20 ++++++++++++++++++++
trytond/tests/test_modelstorage.py | 35 +++++++++++++++++++++++++++++++++++
3 files changed, 61 insertions(+), 3 deletions(-)
diffs (111 lines):
diff -r f5fd5cdc43dc -r 2e696b998711 trytond/model/modelstorage.py
--- a/trytond/model/modelstorage.py Mon Jul 05 09:52:19 2021 +0200
+++ b/trytond/model/modelstorage.py Sat Oct 30 02:20:23 2021 +0200
@@ -16,7 +16,7 @@
from trytond.model import fields
from trytond.tools import reduce_domain, is_instance_method, grouped_slice
from trytond.tools.domain_inversion import (
- domain_inversion, parse as domain_parse)
+ domain_inversion, eval_domain, parse as domain_parse)
from trytond.pyson import PYSONEncoder, PYSONDecoder, PYSON
from trytond.const import OPERATORS
from trytond.config import config
@@ -1189,11 +1189,14 @@
else:
fields.add(field.name)
for field_name in sorted(fields):
+ env = EvalEnvironment(invalid_record, Relation)
invalid_domain = domain_inversion(
- domain, field_name,
- EvalEnvironment(invalid_record, Relation))
+ domain, field_name, env)
if isinstance(invalid_domain, bool):
continue
+ if (len(fields) > 1 # no need to evaluate
+ and eval_domain(invalid_domain, env)):
+ continue
field_def = Relation.fields_get(
[field_name], level=level)
raise DomainValidationError(
diff -r f5fd5cdc43dc -r 2e696b998711 trytond/tests/modelstorage.py
--- a/trytond/tests/modelstorage.py Mon Jul 05 09:52:19 2021 +0200
+++ b/trytond/tests/modelstorage.py Sat Oct 30 02:20:23 2021 +0200
@@ -86,6 +86,24 @@
value = fields.Char("Value")
+class ModelStorageRelationMultiDomain(ModelSQL):
+ "Model stored containing a relation fields with multi domain"
+ __name__ = 'test.modelstorage.relation_multi_domain'
+ relation = fields.Many2One(
+ 'test.modelstorage.relation_multi_domain.target', "Value",
+ domain=[
+ ('test1', '=', True),
+ ('test2', '=', True),
+ ])
+
+
+class ModelStorageRelationMultiDomainTarget(ModelSQL):
+ "Target of Model stored containing a relation field with multi domain"
+ __name__ = 'test.modelstorage.relation_multi_domain.target'
+ test1 = fields.Boolean("Test 1")
+ test2 = fields.Boolean("Test 2")
+
+
class ModelStorageRelationDomain2(ModelSQL):
"Model stored containing a relation field with a domain with 2 level"
__name__ = 'test.modelstorage.relation_domain2'
@@ -132,6 +150,8 @@
ModelStoragePYSONDomain,
ModelStorageRelationDomain,
ModelStorageRelationDomainTarget,
+ ModelStorageRelationMultiDomain,
+ ModelStorageRelationMultiDomainTarget,
ModelStorageRelationDomain2,
ModelStorageRelationDomain2Target,
ModelStorageEvalEnvironment,
diff -r f5fd5cdc43dc -r 2e696b998711 trytond/tests/test_modelstorage.py
--- a/trytond/tests/test_modelstorage.py Mon Jul 05 09:52:19 2021 +0200
+++ b/trytond/tests/test_modelstorage.py Sat Oct 30 02:20:23 2021 +0200
@@ -362,6 +362,41 @@
self.assertTrue(cm.exception.domain[1]['value'])
@with_transaction()
+ def test_relation_domain_multi(self):
+ "Test relation multi domain"
+ pool = Pool()
+ Model = pool.get('test.modelstorage.relation_multi_domain')
+ Target = pool.get('test.modelstorage.relation_multi_domain.target')
+
+ target, = Target.create([{'test1': True, 'test2': True}])
+
+ record, = Model.create([{'relation': target.id}])
+
+ @with_transaction()
+ def test_relation_domain_multi_invalid(self):
+ "Test invalid relation multi domain"
+ pool = Pool()
+ Model = pool.get('test.modelstorage.relation_multi_domain')
+ Target = pool.get('test.modelstorage.relation_multi_domain.target')
+
+ target1, target2 = Target.create(
+ [{'test1': False, 'test2': True}, {'test1': True, 'test2': False}])
+
+ with self.assertRaises(DomainValidationError) as cm:
+ Model.create([{
+ 'relation': target1.id,
+ }])
+ self.assertEqual(cm.exception.domain[0], [('test1', '=', True)])
+ self.assertEqual(cm.exception.domain[1].keys(), {'test1'})
+
+ with self.assertRaises(DomainValidationError) as cm:
+ Model.create([{
+ 'relation': target2.id,
+ }])
+ self.assertEqual(cm.exception.domain[0], [('test2', '=', True)])
+ self.assertEqual(cm.exception.domain[1].keys(), {'test2'})
+
+ @with_transaction()
def test_relation_pyson_domain(self):
"Test valid relation with PYSON"
pool = Pool()