changeset ba9156b0e87d in trytond:default
details: https://hg.tryton.org/trytond?cmd=changeset&node=ba9156b0e87d
description:
        Do not group PYSON domains of Reference field

        Each domain depend on the target so they can not be grouped into a 
single OR-ed
        domain.

        issue11544
        review437141003
diffstat:

 trytond/model/modelstorage.py         |   5 +++-
 trytond/tests/test_field_reference.py |  39 +++++++++++++++++++++++++++++++++++
 2 files changed, 43 insertions(+), 1 deletions(-)

diffs (79 lines):

diff -r 9907fbf058a6 -r ba9156b0e87d trytond/model/modelstorage.py
--- a/trytond/model/modelstorage.py     Tue May 31 23:47:56 2022 +0200
+++ b/trytond/model/modelstorage.py     Wed Jun 08 09:19:40 2022 +0200
@@ -1188,10 +1188,12 @@
                 encoder = PYSONEncoder()
                 pyson_domain = encoder.encode(field.domain)
                 pyson_context = encoder.encode(field.context)
+                dict_domain = False
                 for record in records:
                     domain = _record_eval_pyson(
                         record, pyson_domain, encoded=True)
                     if isinstance(domain, dict):
+                        dict_domain = True
                         relation = get_relation(record)
                         if relation:
                             domain = domain.get(relation.__name__, [])
@@ -1207,7 +1209,8 @@
                 in_max = Transaction().database.IN_MAX
                 count = in_max // 10
                 for context, ctx_domains in domains.items():
-                    if len(ctx_domains) > len(records) * 0.5:
+                    if (not dict_domain
+                            and len(ctx_domains) > len(records) * 0.5):
                         new_domains = {}
                         for sub_domains in grouped_slice(
                                 list(ctx_domains.keys()), count):
diff -r 9907fbf058a6 -r ba9156b0e87d trytond/tests/test_field_reference.py
--- a/trytond/tests/test_field_reference.py     Tue May 31 23:47:56 2022 +0200
+++ b/trytond/tests/test_field_reference.py     Wed Jun 08 09:19:40 2022 +0200
@@ -511,6 +511,25 @@
         self.assertEqual(reference.reference, None)
 
     @with_transaction()
+    def test_domain_different_targets(self):
+        "Test reference with domain and different targets"
+        pool = Pool()
+        Reference = pool.get('test.reference_domainvalidation')
+        Target1 = pool.get('test.reference.target')
+        target1 = Target1(name="Test")
+        target1.save()
+        Target2 = pool.get('test.reference_domainvalidation.target')
+        target2 = Target2(value=6)
+        target2.save()
+
+        references = Reference.create([{
+                    'reference': str(target1),
+                    }, {
+                    'reference': str(target2),
+                    }])
+        self.assertEqual(len(references), 2)
+
+    @with_transaction()
     def test_domain_pyson(self):
         "Test reference with pyson domain"
         pool = Pool()
@@ -524,3 +543,23 @@
                     'reference': str(target),
                     }])
         self.assertEqual(reference.reference, target)
+
+    @with_transaction()
+    def test_domain_pyson_different_targets(self):
+        "Test reference with pyson domain and different targets"
+        pool = Pool()
+        Reference = pool.get('test.reference_domainvalidation_pyson')
+        Target1 = pool.get('test.reference.target')
+        target1 = Target1(name="Test")
+        target1.save()
+        Target2 = pool.get('test.reference_domainvalidation.target')
+        target2 = Target2(value=42)
+        target2.save()
+
+        references = Reference.create([{
+                    'reference': str(target1),
+                    }, {
+                    'value': 1,
+                    'reference': str(target2),
+                    }])
+        self.assertEqual(len(references), 2)

Reply via email to