From 27457d1c57938b7c147885bcdf4acc7fcba6a0d8 Mon Sep 17 00:00:00 2001 From: Konsta Vesterinen Date: Tue, 14 Oct 2014 15:34:20 +0300 Subject: [PATCH] Add support for validator disabling, fixes #75 --- docs/validators.rst | 13 +++++++++++++ tests/test_validators.py | 16 +++++++++++++++- wtforms_alchemy/generator.py | 3 +++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/docs/validators.rst b/docs/validators.rst index 559b323..ac4f19f 100644 --- a/docs/validators.rst +++ b/docs/validators.rst @@ -13,6 +13,7 @@ By default WTForms-Alchemy ModelForm assigns the following validators: * TimeRange validator if column is of type Time and info parameter has min or max arguments defined * Unique validator if column has a unique index * Length validator for String/Unicode columns with max length + * Optional validator for all nullable columns Unique validator @@ -215,3 +216,15 @@ Here is the full list of configuration options you can use to override default v * time_range_validator * optional_validator + + +Disabling validators +-------------------- + +You can disable certain validators by assigning them as `None`. Let's say you want to disable nullable columns having `Optional` validator. This can be achieved as follows:: + + + class UserForm(ModelForm): + class Meta: + model = User + optional_validator = None diff --git a/tests/test_validators.py b/tests/test_validators.py index adfba8c..4f42dbe 100644 --- a/tests/test_validators.py +++ b/tests/test_validators.py @@ -114,7 +114,7 @@ def test_not_nullable_fields_with_defaults_are_not_required(self): self.init(nullable=False, default=u'default') self.assert_not_required('test_column') - def test_assigns_not_nullable_integers_as_optional(self): + def test_assigns_nullable_integers_as_optional(self): self.init(sa.Integer, nullable=True) self.assert_optional('test_column') @@ -226,6 +226,20 @@ class Meta: form = ModelTestForm() assert form.test_column.validators[1].message == 'Wrong length' + def test_override_optional_validator_as_none(self): + class ModelTest(self.base): + __tablename__ = 'model_test' + id = sa.Column(sa.Integer, primary_key=True) + test_column = sa.Column(sa.Boolean, nullable=True) + + class ModelTestForm(ModelForm): + class Meta: + model = ModelTest + optional_validator = None + + form = ModelTestForm() + assert form.test_column.validators == [] + def test_override_unique_validator(self): class ModelTest(self.base): __tablename__ = 'model_test' diff --git a/wtforms_alchemy/generator.py b/wtforms_alchemy/generator.py index f921121..ffd605b 100644 --- a/wtforms_alchemy/generator.py +++ b/wtforms_alchemy/generator.py @@ -519,6 +519,9 @@ def required_validator(self, column): def get_validator(self, name, **kwargs): attr_name = '%s_validator' % name attr = getattr(self.meta, attr_name) + if attr is None: + return attr + if inspect.ismethod(attr): return six.get_unbound_function(attr)(**kwargs) else: