Skip to content

Commit

Permalink
Merge pull request #150 from Scille/fix_listfield_as_marshmallow_fiel…
Browse files Browse the repository at this point in the history
…d_params

Fix ListField.as_marshmallow_field: pass params to container
  • Loading branch information
lafrech committed Nov 28, 2018
2 parents 23e73e0 + 3383496 commit 0e90a83
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 2 deletions.
29 changes: 29 additions & 0 deletions tests/test_marshmallow.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
8 changes: 6 additions & 2 deletions umongo/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'):
Expand Down

0 comments on commit 0e90a83

Please sign in to comment.