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