Fill the reverse field in the One2Many setter

issue8742
review262301002
This commit is contained in:
Cédric Krier
2019-11-16 14:34:29 +01:00
parent bc0c6f13f9
commit ec24fc7727
5 changed files with 48 additions and 4 deletions
+1
View File
@@ -1,3 +1,4 @@
* Fill the reverse field in the One2Many setter
* Drop support for skiptest attribute on xml files
* Remove implicit field names in ModelStorage.search_read
+5 -2
View File
@@ -138,7 +138,7 @@ def get_eval_fields(value):
return encoder.fields
def instanciate_values(Target, value):
def instanciate_values(Target, value, **extra):
from ..modelstorage import ModelStorage, cache_size
kwargs = {}
ids = []
@@ -148,6 +148,8 @@ def instanciate_values(Target, value):
def instance(data):
if isinstance(data, Target):
for k, v in extra.items():
setattr(data, k, v)
return data
elif isinstance(data, dict):
if data.get('id', -1) >= 0:
@@ -157,10 +159,11 @@ def instanciate_values(Target, value):
ids.append(data['id'])
else:
values = data
values.update(extra)
return Target(**values)
else:
ids.append(data)
return Target(data, **kwargs)
return Target(data, **extra, **kwargs)
return tuple(instance(x) for x in (value or []))
+4 -1
View File
@@ -254,8 +254,11 @@ class One2Many(Field):
def __set__(self, inst, value):
Target = self.get_target()
ctx = instantiate_context(self, inst)
extra = {}
if self.field:
extra[self.field] = inst
with Transaction().set_context(ctx):
records = instanciate_values(Target, value)
records = instanciate_values(Target, value, **extra)
super(One2Many, self).__set__(inst, records)
def convert_domain(self, domain, tables, Model):
+1 -1
View File
@@ -15,7 +15,7 @@ class ModelViewChangedValues(ModelView):
ref_target = fields.Reference('Target Reference', [
('test.modelview.changed_values.target', 'Target'),
])
targets = fields.One2Many('test.modelview.changed_values.target', 'model',
targets = fields.One2Many('test.modelview.changed_values.target', 'parent',
'Targets')
m2m_targets = fields.Many2Many('test.modelview.changed_values.target',
None, None, 'Targets')
+37
View File
@@ -10,6 +10,43 @@ from trytond.tests.test_tryton import activate_module, with_transaction
class CommonTestCaseMixin:
@with_transaction()
def test_set_reverse_field_instance(self):
"Test reverse field is set on instance"
One2Many = self.One2Many()
Target = self.One2ManyTarget()
record = One2Many()
target = Target()
record.targets = [target]
self.assertEqual(target.origin, record)
@with_transaction()
def test_set_reverse_field_dict(self):
"Test reverse field is set on dict"
One2Many = self.One2Many()
record = One2Many()
record.targets = [{}]
target, = record.targets
self.assertEqual(target.origin, record)
@with_transaction()
def test_set_reverse_field_id(self):
"Test reverse field is set on id"
One2Many = self.One2Many()
Target = self.One2ManyTarget()
record = One2Many()
target = Target()
target.save()
record.targets = [target.id]
target, = record.targets
self.assertEqual(target.origin, record)
@with_transaction()
def test_create(self):
"Test create one2many"