Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix required_validate with allow_none fields #289

Merged
merged 3 commits into from
Jul 20, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions AUTHORS.rst
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,4 @@ Contributors
* Élysson MR `@elyssonmr <https://github.com/elyssonmr>`_
* Mandar Upadhye `@mandarup <https://github.com/mandarup>`_
* Pavel Kulyov `@pkulev <https://github.com/pkulev>`_
* Felix Sonntag `@fsonntag <https://github.com/fsonntag>`_
14 changes: 14 additions & 0 deletions tests/test_fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,20 @@ class MyDoc(Document):
doc.required_validate()


def test_required_nested_allow_none(self):
@self.instance.register
class MyEmbedded(EmbeddedDocument):
field = fields.IntField()

@self.instance.register
class MyDoc(Document):
embedded_list = fields.ListField(fields.EmbeddedField(MyEmbedded), allow_none=True)
embedded_dict = fields.DictField(values=fields.EmbeddedField(MyEmbedded), allow_none=True)
embedded = fields.EmbeddedField(MyEmbedded, allow_none=True)

MyDoc(embedded_list=None, embedded_dict=None, embedded=None).required_validate()


class TestFields(BaseTest):

def test_basefields(self):
Expand Down
2 changes: 2 additions & 0 deletions umongo/data_proxy.py
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,8 @@ def required_validate(self):
value = self._data[field.attribute or name]
if field.required and value is ma.missing:
errors[name] = [_("Missing data for required field.")]
elif value is ma.missing or value is None:
continue
elif hasattr(field, '_required_validate'):
try:
field._required_validate(value)
Expand Down
7 changes: 3 additions & 4 deletions umongo/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,7 @@ def as_marshmallow_field(self, mongo_world=False, **kwargs):
return ma.fields.Dict(self.key_field, inner_ma_schema, **field_kwargs)

def _required_validate(self, value):
if value is ma.missing or not hasattr(self.value_field, '_required_validate'):
if not hasattr(self.value_field, '_required_validate'):
return
required_validate = self.value_field._required_validate
errors = collections.defaultdict(dict)
Expand Down Expand Up @@ -291,7 +291,7 @@ def as_marshmallow_field(self, mongo_world=False, **kwargs):
return ma.fields.List(inner_ma_schema, **field_kwargs)

def _required_validate(self, value):
if value is ma.missing or not hasattr(self.inner, '_required_validate'):
if not hasattr(self.inner, '_required_validate'):
return
required_validate = self.inner._required_validate
errors = {}
Expand Down Expand Up @@ -561,5 +561,4 @@ def as_marshmallow_field(self, mongo_world=False, **kwargs):
return ma.fields.Nested(nested_ma_schema, **field_kwargs)

def _required_validate(self, value):
if value is not ma.missing:
value.required_validate()
value.required_validate()