From cd4e9655307194b544b679701443d2d8d2d2f6ff Mon Sep 17 00:00:00 2001 From: Lucas Vogelsang Date: Thu, 23 Aug 2012 12:46:08 -0700 Subject: [PATCH] Fixing a bug in mongorest with optional email fields i If you have an email field in a document that is optional but are using a wtform for the Resource validation, mongoengine will raise an error because wtforms returns '' instead of None for an empty email field. This doesn't pass validation of mongoengine. --- flask_mongorest/resources.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/flask_mongorest/resources.py b/flask_mongorest/resources.py index fc3d2b0b..7f581ae9 100644 --- a/flask_mongorest/resources.py +++ b/flask_mongorest/resources.py @@ -5,6 +5,7 @@ from mongoengine.fields import EmbeddedDocumentField, ListField, ReferenceField, DateTimeField from flask.ext.mongorest.exceptions import ValidationError import dateutil.parser +from flask.ext.wtf import validators class ResourceMeta(type): def __init__(cls, name, bases, classdict): @@ -161,9 +162,21 @@ def json_to_form_data(prefix, json_data): data = MultiDict(json_data) form = self.form(data, csrf_enabled=False) + # We have to dynamically remove fields from the form, if the POST object does not contain these keys and the Optional validator + delfields = [] + for key, value in form._fields.iteritems(): + required = True + for validator in form._fields[key].validators: + if validator.__class__ == validators.optional().__class__: + required = False + if not key in data and key != 'csrf_token' and required == False: + delfields.append(key) + + for d in delfields: + del form[d] + if not form.validate(): raise ValidationError({'field-errors': form.errors}) - self.data = form.data def get_queryset(self):