changeset e2026d80eced in trytond:default
details: https://hg.tryton.org/trytond?cmd=changeset;node=e2026d80eced
description:
        Order by target name and context hash

        None can not be compared to a class so we always use strings to order 
before
        grouping. Also dictionary can not be compared neither.

        issue8265
        review253351002
diffstat:

 trytond/model/modelsql.py             |  10 ++++++++--
 trytond/tests/field_one2many.py       |   2 +-
 trytond/tests/field_reference.py      |   1 +
 trytond/tests/test_field_one2many.py  |  22 +++++++++++++++++++---
 trytond/tests/test_field_reference.py |  18 ++++++++++++++++++
 5 files changed, 47 insertions(+), 6 deletions(-)

diffs (125 lines):

diff -r 952bd62fc1b7 -r e2026d80eced trytond/model/modelsql.py
--- a/trytond/model/modelsql.py Mon Apr 22 15:46:45 2019 +0200
+++ b/trytond/model/modelsql.py Wed Apr 24 23:40:46 2019 +0200
@@ -883,7 +883,7 @@
             field = cls._fields[fname]
             datetime_field = getattr(field, 'datetime_field', None)
 
-            def keyfunc(row):
+            def groupfunc(row):
                 ctx = {}
                 if field.context:
                     pyson_context = PYSONEncoder().encode(field.context)
@@ -901,8 +901,14 @@
                     Target = field.get_target()
                 return Target, ctx
 
+            def orderfunc(row):
+                Target, ctx = groupfunc(row)
+                return (
+                    Target.__name__ if Target else '',
+                    hash(tuple(ctx.items())))
+
             for (Target, ctx), rows in groupby(
-                    sorted(result, key=keyfunc), key=keyfunc):
+                    sorted(result, key=orderfunc), key=groupfunc):
                 rows = list(rows)
                 with Transaction().set_context(ctx):
                     if Target:
diff -r 952bd62fc1b7 -r e2026d80eced trytond/tests/field_one2many.py
--- a/trytond/tests/field_one2many.py   Mon Apr 22 15:46:45 2019 +0200
+++ b/trytond/tests/field_one2many.py   Wed Apr 24 23:40:46 2019 +0200
@@ -116,7 +116,7 @@
     __name__ = 'test.one2many_context'
     targets = fields.One2Many(
         'test.one2many_context.target', 'origin', "Targets",
-        context={'test': 'foo'})
+        context={'test': Eval('id')})
 
 
 class One2ManyContextTarget(ModelSQL):
diff -r 952bd62fc1b7 -r e2026d80eced trytond/tests/field_reference.py
--- a/trytond/tests/field_reference.py  Mon Apr 22 15:46:45 2019 +0200
+++ b/trytond/tests/field_reference.py  Wed Apr 24 23:40:46 2019 +0200
@@ -34,6 +34,7 @@
     "Reference Context"
     __name__ = 'test.reference_context'
     target = fields.Reference("Reference", selection=[
+            (None, ''),
             ('test.reference_context.target', "Target"),
             ], context={'test': 'foo'})
 
diff -r 952bd62fc1b7 -r e2026d80eced trytond/tests/test_field_one2many.py
--- a/trytond/tests/test_field_one2many.py      Mon Apr 22 15:46:45 2019 +0200
+++ b/trytond/tests/test_field_one2many.py      Wed Apr 24 23:40:46 2019 +0200
@@ -465,7 +465,7 @@
                     'targets': [('create', [{}])],
                     }])
 
-        self.assertEqual(record.targets[0].context, 'foo')
+        self.assertEqual(record.targets[0].context, record.id)
 
     @with_transaction()
     def test_context_read(self):
@@ -478,7 +478,23 @@
                     }])
         data, = Many2One.read([record.id], ['targets.context'])
 
-        self.assertEqual(data['targets.'][0]['context'], 'foo')
+        self.assertEqual(data['targets.'][0]['context'], record.id)
+
+    @with_transaction()
+    def test_context_read_multi(self):
+        "Test context on one2many read multiple records"
+        pool = Pool()
+        Many2One = pool.get('test.one2many_context')
+
+        records = Many2One.create([{
+                    'targets': [('create', [{}])],
+                    }, {
+                    'targets': [('create', [{}])],
+                    }])
+        data = Many2One.read([r.id for r in records], ['targets.context'])
+
+        self.assertEqual(data[0]['targets.'][0]['context'], records[0].id)
+        self.assertEqual(data[1]['targets.'][0]['context'], records[1].id)
 
     @with_transaction()
     def test_context_set(self):
@@ -490,7 +506,7 @@
         target, = Target.create([{}])
         record = Many2One(targets=[target.id])
 
-        self.assertEqual(record.targets[0].context, 'foo')
+        self.assertEqual(record.targets[0].context, record.id)
 
 
 class FieldOne2ManyReferenceTestCase(unittest.TestCase, CommonTestCaseMixin):
diff -r 952bd62fc1b7 -r e2026d80eced trytond/tests/test_field_reference.py
--- a/trytond/tests/test_field_reference.py     Mon Apr 22 15:46:45 2019 +0200
+++ b/trytond/tests/test_field_reference.py     Wed Apr 24 23:40:46 2019 +0200
@@ -428,6 +428,24 @@
         self.assertEqual(data['target.']['context'], 'foo')
 
     @with_transaction()
+    def test_context_read_multi(self):
+        "Test context on reference read with value and None"
+        pool = Pool()
+        Reference = pool.get('test.reference_context')
+        Target = pool.get('test.reference_context.target')
+
+        target, = Target.create([{}])
+        records = Reference.create([{
+                    'target': str(target),
+                    }, {
+                    'target': None,
+                    }])
+        data = Reference.read([r.id for r in records], ['target.context'])
+
+        self.assertEqual(data[0]['target.']['context'], 'foo')
+        self.assertEqual(data[1]['target.'], None)
+
+    @with_transaction()
     def test_context_set(self):
         "Test context on reference set"
         pool = Pool()

Reply via email to