# -*- coding: utf-8 -*-
"""
eve_mongoengine.validation
~~~~~~~~~~~~~~~~~~~~~~~~~~
This module implements custom validator based on
:class:`eve.io.mongo.validation`, which is cerberus-validator extension.
The purpose of this module is to enable validation for special mongoengine
fields.
:copyright: (c) 2014 by Stanislav Heller.
:license: BSD, see LICENSE for more details.
"""
from flask import current_app as app
from mongoengine import ValidationError, FileField
from eve.io.mongo.validation import Validator
from eve_mongoengine._compat import iteritems
[docs]class EveMongoengineValidator(Validator):
"""
Helper validator which adapts mongoengine special-purpose fields
to cerberus validator API.
"""
[docs] def validate(self, document, schema=None, update=False, context=None):
"""
Main validation method which simply tries to validate against cerberus
schema and if it does not fail, repeats the same against mongoengine
validation machinery.
"""
# call default eve's validator
if not Validator.validate(self, document, schema, update, context):
return False
# validate using mongoengine field validators
if self.resource:
model_cls = app.data.models[self.resource]
doc = model_cls(**document)
# rewind all file-like's
for attr, field in iteritems(model_cls._fields):
if isinstance(field, FileField) and attr in document:
document[attr].stream.seek(0)
try:
doc.validate()
except ValidationError as e:
for field_name, error in e.errors.items():
self._error(field_name, str(e))
return False
return True
def _validate_type_dynamic(self, field, value):
"""
Dummy validation method just to convince cerberus not to validate that
value.
"""
pass