diff --git a/CHANGELOG b/CHANGELOG index c51baa9e29..d78739e40b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -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 diff --git a/trytond/model/fields/field.py b/trytond/model/fields/field.py index 841a4a730a..9bd44604d7 100644 --- a/trytond/model/fields/field.py +++ b/trytond/model/fields/field.py @@ -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 [])) diff --git a/trytond/model/fields/one2many.py b/trytond/model/fields/one2many.py index 24d67e0923..660c391547 100644 --- a/trytond/model/fields/one2many.py +++ b/trytond/model/fields/one2many.py @@ -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): diff --git a/trytond/tests/modelview.py b/trytond/tests/modelview.py index 0b23c1f189..b633d15bab 100644 --- a/trytond/tests/modelview.py +++ b/trytond/tests/modelview.py @@ -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') diff --git a/trytond/tests/test_field_one2many.py b/trytond/tests/test_field_one2many.py index 76a911b307..6f799431d4 100644 --- a/trytond/tests/test_field_one2many.py +++ b/trytond/tests/test_field_one2many.py @@ -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"