diff --git a/trytond/model/multivalue.py b/trytond/model/multivalue.py index f71112b866..f0d1734e1c 100644 --- a/trytond/model/multivalue.py +++ b/trytond/model/multivalue.py @@ -2,6 +2,7 @@ # repository contains the full copyright notices and license terms. from trytond.pool import Pool +from .fields import MultiValue from .match import MatchMixin from .model import Model @@ -33,7 +34,15 @@ class MultiValueMixin(object): pattern = pattern.copy() pattern[fname] = self break - return Value(**pattern) + record = Value(**pattern) + for oname, ofield in self._fields.items(): + if (oname != field + and isinstance(ofield, MultiValue) + and self.multivalue_model(oname) == Value): + func = getattr(self, 'default_%s' % oname, None) + if func: + setattr(record, oname, func(**pattern)) + return record def __values(self, field, pattern, match_none=True): Value = self.multivalue_model(field) diff --git a/trytond/tests/multivalue.py b/trytond/tests/multivalue.py index 45fb386309..f303a0195e 100644 --- a/trytond/tests/multivalue.py +++ b/trytond/tests/multivalue.py @@ -8,13 +8,25 @@ class ModelMultiValue(ModelSQL, MultiValueMixin): "Model MultiValue" __name__ = 'test.model_multivalue' value = fields.MultiValue(fields.Char("Value")) + value_default = fields.MultiValue(fields.Char("Value Default")) values = fields.One2Many( 'test.model_multivalue.value', 'record', "Values") + @classmethod + def multivalue_model(cls, field): + pool = Pool() + if field == 'value_default': + return pool.get('test.model_multivalue.value') + return super().multivalue_model(field) + @classmethod def default_value(cls, **pattern): return "default" + @classmethod + def default_value_default(cls, **pattern): + return "other default" + class ModelValue(ModelSQL, ValueMixin): "Model Value" @@ -23,6 +35,7 @@ class ModelValue(ModelSQL, ValueMixin): 'test.model_multivalue', "Record") condition = fields.Char("Condition") value = fields.Char("Value") + value_default = fields.Char("Value Default") def register(module): diff --git a/trytond/tests/test_multivalue.py b/trytond/tests/test_multivalue.py index fc31bcad47..7554bbdda8 100644 --- a/trytond/tests/test_multivalue.py +++ b/trytond/tests/test_multivalue.py @@ -119,6 +119,20 @@ class MultiValueTestCase(unittest.TestCase): self.assertEqual(len(ModelValue.search([])), 2) + @with_transaction() + def test_set_multivalue_other_default(self): + "Test set_multivalue with other default" + pool = Pool() + ModelMultiValue = pool.get('test.model_multivalue') + ModelValue = pool.get('test.model_multivalue.value') + + record = ModelMultiValue() + record.save() + record.set_multivalue('value', "test") + + value, = ModelValue.search([]) + self.assertEqual(value.value_default, "other default") + @with_transaction() def test_mutlivalue_setter(self): "Test multivalue setter"