Source code for marshmallow_validators.wtforms
# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals
import functools
from wtforms import i18n
from wtforms.validators import ValidationError as WTFValidationError
from .core import BaseConverter, ValidationError
class DummyField(object):
def __init__(self, data, errors=(), raw_data=None, _translations=None):
self.data = data
self.errors = list(errors)
self.raw_data = raw_data
self._translations = _translations
def gettext(self, string):
return self._translations.gettext(string)
def ngettext(self, singular, plural, n):
return self._translations.ngettext(singular, plural, n)
dummy_form = dict()
[docs]class from_wtforms(BaseConverter):
"""Convert a WTForms validator from `wtforms.validators` to a marshmallow validator.
Example: ::
from marshmallow import fields
from marshmallow_validators.wtforms import from_wtforms
from wtforms.validators import Length
password = fields.Str(
validate=from_wtforms([Length(min=8, max=100)])
)
:param list validators: WTForms validators.
:param list locales: List of locales for error messages, in order. If `None`, will
try to use locale information from the environment.
"""
def __init__(self, validators, locales=None):
BaseConverter.__init__(self, validators)
self._translations = i18n.get_translations(locales)
def make_validator(self, wtf_validator):
def marshmallow_validator(value):
field = DummyField(value, _translations=self._translations)
try:
wtf_validator(dummy_form, field)
except WTFValidationError as err:
raise ValidationError(err.args[0])
return marshmallow_validator
[docs]def make_converter(locales=None):
"""Return a WTForms validator converter that uses the
given locales.
Example: ::
from marshmallow import fields
from marshmallow_validators.wtforms import make_converter
from wtforms.validators import Length
from_wtf = make_converter(['de_DE', 'de'])
field = fields.Str(from_wtf([Length(max=3)]))
:param list locales: List of locales for error messages.
"""
return functools.partial(from_wtforms, locales=locales)