diff --git a/tests/test_marshmallow.py b/tests/test_marshmallow.py index aeb4a086..c5ba081d 100644 --- a/tests/test_marshmallow.py +++ b/tests/test_marshmallow.py @@ -75,6 +75,35 @@ def test_customize_params(self): assert not ret.errors assert ret.data == {'birthday': datetime(1990, 10, 23)} + def test_customize_nested_and_container_params(self): + @self.instance.register + class Accessory(EmbeddedDocument): + brief = fields.StrField(attribute='id', required=True) + value = fields.IntField() + + @self.instance.register + class Bag(Document): + id = fields.EmbeddedField(Accessory, attribute='_id', required=True) + names = fields.ListField(fields.StringField()) + content = fields.ListField(fields.EmbeddedField(Accessory)) + + ma_field = Bag.schema.fields['id'].as_marshmallow_field(params={ + 'load_only': True, + 'params': {'value': {'dump_only': True}}}) + assert ma_field.load_only is True + assert ma_field.nested._declared_fields['value'].dump_only + ma_field = Bag.schema.fields['names'].as_marshmallow_field(params={ + 'load_only': True, + 'params': {'dump_only': True}}) + assert ma_field.load_only is True + assert ma_field.container.dump_only is True + ma_field = Bag.schema.fields['content'].as_marshmallow_field(params={ + 'load_only': True, + 'params': {'required': True, 'params': {'value': {'dump_only': True}}}}) + assert ma_field.load_only is True + assert ma_field.container.required is True + assert ma_field.container.nested._declared_fields['value'].dump_only + def test_keep_attributes(self): @self.instance.register class Vehicle(Document): diff --git a/umongo/fields.py b/umongo/fields.py index 9587a03c..dc2b82cc 100644 --- a/umongo/fields.py +++ b/umongo/fields.py @@ -113,9 +113,13 @@ def as_marshmallow_field(self, params=None, mongo_world=False, **kwargs): # difference (`_id` vs `id`) field_kwargs = self._extract_marshmallow_field_params(mongo_world) if params: + container_params = params.pop('params', None) field_kwargs.update(params) - return ma_fields.List(self.container.as_marshmallow_field( - mongo_world=mongo_world, **kwargs), **field_kwargs) + else: + container_params = None + container_ma_schema = self.container.as_marshmallow_field( + mongo_world=mongo_world, params=container_params, **kwargs) + return ma_fields.List(container_ma_schema, **field_kwargs) def _required_validate(self, value): if value is missing or not hasattr(self.container, '_required_validate'):