Fill the reverse field in the One2Many setter
issue8742 review262301002
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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 []))
|
||||
|
||||
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user