Commit 1ace7047 authored by Serge S. Koval's avatar Serge S. Koval

Merge pull request #1127 from pawl/issue_1094_attempt_2

Fix regex validators when using form_args
parents 4e42651f be488d2a
from copy import deepcopy
from mongoengine import ReferenceField, ListField
from mongoengine.base import BaseDocument, DocumentMetaclass, get_document
......@@ -70,8 +68,11 @@ class CustomModelConverter(orm.ModelConverter):
}
if field_args:
# prevent modification of self.form_args
kwargs.update(deepcopy(field_args))
kwargs.update(field_args)
if kwargs['validators']:
# Create a copy of the list since we will be modifying it.
kwargs['validators'] = list(kwargs['validators'])
if field.required:
kwargs['validators'].append(validators.InputRequired())
......
import warnings
from copy import deepcopy
from wtforms import fields, validators
from sqlalchemy import Boolean, Column
......@@ -143,8 +141,11 @@ class AdminModelConverter(ModelConverterBase):
}
if field_args:
# prevent modification of self.form_args
kwargs.update(deepcopy(field_args))
kwargs.update(field_args)
if kwargs['validators']:
# Create a copy of the list since we will be modifying it.
kwargs['validators'] = list(kwargs['validators'])
# Check if it is relation or property
if hasattr(prop, 'direction'):
......
......@@ -6,7 +6,7 @@ from flask_admin._compat import PY2, as_unicode
if not PY2:
raise SkipTest('MongoEngine is not Python 3 compatible')
from wtforms import fields
from wtforms import fields, validators
from flask_admin import form
from flask_admin.contrib.mongoengine import ModelView
......@@ -1040,6 +1040,25 @@ def test_form_flat_choices():
eq_(form.name.choices, [('a', 'a'), ('b', 'b'), ('c', 'c')])
def test_form_args():
app, db, admin = setup()
class Model(db.Document):
test = db.StringField(required=True)
shared_form_args = {'test': {'validators': [validators.Regexp('test')]}}
view = CustomModelView(Model, form_args=shared_form_args)
admin.add_view(view)
# ensure shared field_args don't create duplicate validators
create_form = view.create_form()
eq_(len(create_form.test.validators), 2)
edit_form = view.edit_form()
eq_(len(edit_form.test.validators), 2)
def test_form_args_embeddeddoc():
app, db, admin = setup()
......
......@@ -8,7 +8,7 @@ if not PY2:
import peewee
from wtforms import fields
from wtforms import fields, validators
from flask_admin import form
from flask_admin._compat import iteritems
......@@ -910,6 +910,31 @@ def test_custom_form_base():
ok_(isinstance(create_form, TestForm))
def test_form_args():
app, db, admin = setup()
class BaseModel(peewee.Model):
class Meta:
database = db
class Model(BaseModel):
test = peewee.CharField(null=False)
Model.create_table()
shared_form_args = {'test': {'validators': [validators.Regexp('test')]}}
view = CustomModelView(Model, form_args=shared_form_args)
admin.add_view(view)
# ensure shared field_args don't create duplicate validators
create_form = view.create_form()
eq_(len(create_form.test.validators), 2)
edit_form = view.edit_form()
eq_(len(edit_form.test.validators), 2)
def test_ajax_fk():
app, db, admin = setup()
......
from nose.tools import eq_, ok_, raises, assert_true
from wtforms import fields
from wtforms import fields, validators
from flask_admin import form
from flask_admin._compat import as_unicode
......@@ -1441,7 +1441,27 @@ def test_form_columns():
ok_(type(form3.model).__name__ == 'QuerySelectField')
# TODO: form_args
def test_form_args():
app, db, admin = setup()
class Model(db.Model):
id = db.Column(db.String, primary_key=True)
test = db.Column(db.String, nullable=False)
db.create_all()
shared_form_args = {'test': {'validators': [validators.Regexp('test')]}}
view = CustomModelView(Model, db.session, form_args=shared_form_args)
admin.add_view(view)
create_form = view.create_form()
eq_(len(create_form.test.validators), 2)
# ensure shared field_args don't create duplicate validators
edit_form = view.edit_form()
eq_(len(edit_form.test.validators), 2)
def test_form_override():
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment