Commit c7a57c02 authored by Serge S. Koval's avatar Serge S. Koval

Merge pull request #676 from arsgeografica/wtf2

WTForms 2 compatibility
parents beb637fa f836bf46
...@@ -23,3 +23,5 @@ examples/forms/files ...@@ -23,3 +23,5 @@ examples/forms/files
.idea/ .idea/
*.sqlite *.sqlite
env env
*.egg
.eggs
...@@ -24,7 +24,7 @@ class NameForm(form.BaseForm): ...@@ -24,7 +24,7 @@ class NameForm(form.BaseForm):
Validates if provided name is valid for *nix and Windows systems. Validates if provided name is valid for *nix and Windows systems.
""" """
name = fields.TextField() name = fields.StringField()
regexp = re.compile(r'^(?!^(PRN|AUX|CLOCK\$|NUL|CON|COM\d|LPT\d|\..*)(\..+)?$)[^\x00-\x1f\\?*:\";|/]+$') regexp = re.compile(r'^(?!^(PRN|AUX|CLOCK\$|NUL|CON|COM\d|LPT\d|\..*)(\..+)?$)[^\x00-\x1f\\?*:\";|/]+$')
......
from wtforms import fields from wtforms import fields
from peewee import (DateTimeField, DateField, TimeField, from peewee import (CharField, DateTimeField, DateField, TimeField,
PrimaryKeyField, ForeignKeyField, BaseModel) PrimaryKeyField, ForeignKeyField, BaseModel)
from wtfpeewee.orm import ModelConverter, model_form from wtfpeewee.orm import ModelConverter, model_form
...@@ -85,6 +85,9 @@ class CustomModelConverter(ModelConverter): ...@@ -85,6 +85,9 @@ class CustomModelConverter(ModelConverter):
super(CustomModelConverter, self).__init__(additional) super(CustomModelConverter, self).__init__(additional)
self.view = view self.view = view
# @todo: This really should be done within wtfpeewee
self.defaults[CharField] = fields.StringField
self.converters[PrimaryKeyField] = self.handle_pk self.converters[PrimaryKeyField] = self.handle_pk
self.converters[DateTimeField] = self.handle_datetime self.converters[DateTimeField] = self.handle_datetime
self.converters[DateField] = self.handle_date self.converters[DateField] = self.handle_date
......
...@@ -274,7 +274,7 @@ class AdminModelConverter(ModelConverterBase): ...@@ -274,7 +274,7 @@ class AdminModelConverter(ModelConverterBase):
field_args['filters'] = filters field_args['filters'] = filters
self._string_common(column=column, field_args=field_args, **extra) self._string_common(column=column, field_args=field_args, **extra)
return fields.TextField(**field_args) return fields.StringField(**field_args)
@converts('Text', 'UnicodeText', @converts('Text', 'UnicodeText',
'sqlalchemy.types.LargeBinary', 'sqlalchemy.types.Binary') 'sqlalchemy.types.LargeBinary', 'sqlalchemy.types.Binary')
...@@ -316,25 +316,25 @@ class AdminModelConverter(ModelConverterBase): ...@@ -316,25 +316,25 @@ class AdminModelConverter(ModelConverterBase):
@converts('databases.mysql.MSYear') @converts('databases.mysql.MSYear')
def conv_MSYear(self, field_args, **extra): def conv_MSYear(self, field_args, **extra):
field_args['validators'].append(validators.NumberRange(min=1901, max=2155)) field_args['validators'].append(validators.NumberRange(min=1901, max=2155))
return fields.TextField(**field_args) return fields.StringField(**field_args)
@converts('databases.postgres.PGInet', 'dialects.postgresql.base.INET') @converts('databases.postgres.PGInet', 'dialects.postgresql.base.INET')
def conv_PGInet(self, field_args, **extra): def conv_PGInet(self, field_args, **extra):
field_args.setdefault('label', u'IP Address') field_args.setdefault('label', u'IP Address')
field_args['validators'].append(validators.IPAddress()) field_args['validators'].append(validators.IPAddress())
return fields.TextField(**field_args) return fields.StringField(**field_args)
@converts('dialects.postgresql.base.MACADDR') @converts('dialects.postgresql.base.MACADDR')
def conv_PGMacaddr(self, field_args, **extra): def conv_PGMacaddr(self, field_args, **extra):
field_args.setdefault('label', u'MAC Address') field_args.setdefault('label', u'MAC Address')
field_args['validators'].append(validators.MacAddress()) field_args['validators'].append(validators.MacAddress())
return fields.TextField(**field_args) return fields.StringField(**field_args)
@converts('dialects.postgresql.base.UUID') @converts('dialects.postgresql.base.UUID')
def conv_PGUuid(self, field_args, **extra): def conv_PGUuid(self, field_args, **extra):
field_args.setdefault('label', u'UUID') field_args.setdefault('label', u'UUID')
field_args['validators'].append(validators.UUID()) field_args['validators'].append(validators.UUID())
return fields.TextField(**field_args) return fields.StringField(**field_args)
@converts('sqlalchemy.dialects.postgresql.base.ARRAY') @converts('sqlalchemy.dialects.postgresql.base.ARRAY')
def conv_ARRAY(self, field_args, **extra): def conv_ARRAY(self, field_args, **extra):
......
...@@ -146,7 +146,7 @@ class ModelView(BaseModelView): ...@@ -146,7 +146,7 @@ class ModelView(BaseModelView):
class MyInlineModelConverter(AdminModelConverter): class MyInlineModelConverter(AdminModelConverter):
def post_process(self, form_class, info): def post_process(self, form_class, info):
form_class.value = wtf.TextField('value') form_class.value = wtf.StringField('value')
return form_class return form_class
class MyAdminView(ModelView): class MyAdminView(ModelView):
......
...@@ -32,9 +32,9 @@ class DateTimeField(fields.DateTimeField): ...@@ -32,9 +32,9 @@ class DateTimeField(fields.DateTimeField):
Any additional parameters Any additional parameters
""" """
super(DateTimeField, self).__init__(label, validators, **kwargs) super(DateTimeField, self).__init__(label, validators, **kwargs)
self.format = format or '%Y-%m-%d %H:%M:%S' self.format = format or '%Y-%m-%d %H:%M:%S'
class TimeField(fields.Field): class TimeField(fields.Field):
""" """
A text field which stores a `datetime.time` object. A text field which stores a `datetime.time` object.
...@@ -139,7 +139,7 @@ class Select2Field(fields.SelectField): ...@@ -139,7 +139,7 @@ class Select2Field(fields.SelectField):
super(Select2Field, self).pre_validate(form) super(Select2Field, self).pre_validate(form)
class Select2TagsField(fields.TextField): class Select2TagsField(fields.StringField):
"""`Select2 <http://ivaynberg.github.com/select2/#tags>`_ styled text field. """`Select2 <http://ivaynberg.github.com/select2/#tags>`_ styled text field.
You must include select2.js, form.js and select2 stylesheet for it to work. You must include select2.js, form.js and select2 stylesheet for it to work.
""" """
......
...@@ -109,11 +109,11 @@ class ImageUploadInput(object): ...@@ -109,11 +109,11 @@ class ImageUploadInput(object):
# Fields # Fields
class FileUploadField(fields.TextField): class FileUploadField(fields.StringField):
""" """
Customizable file-upload field. Customizable file-upload field.
Saves file to configured path, handles updates and deletions. Inherits from `TextField`, Saves file to configured path, handles updates and deletions. Inherits from `StringField`,
resulting filename will be stored as string. resulting filename will be stored as string.
""" """
widget = FileUploadInput() widget = FileUploadInput()
......
...@@ -314,7 +314,7 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -314,7 +314,7 @@ class BaseModelView(BaseView, ActionsMixin):
For example:: For example::
class MyForm(Form): class MyForm(Form):
name = TextField('Name') name = StringField('Name')
class MyModelView(BaseModelView): class MyModelView(BaseModelView):
form = MyForm form = MyForm
......
...@@ -13,18 +13,17 @@ class InlineFieldList(FieldList): ...@@ -13,18 +13,17 @@ class InlineFieldList(FieldList):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(InlineFieldList, self).__init__(*args, **kwargs) super(InlineFieldList, self).__init__(*args, **kwargs)
def __call__(self, **kwargs):
# Create template # Create template
self.template = self.unbound_field.bind(form=None, name='') template = self.unbound_field.bind(form=None, name='')
# Small hack to remove separator from FormField # Small hack to remove separator from FormField
if isinstance(self.template, FormField): if isinstance(template, FormField):
self.template.separator = '' template.separator = ''
self.template.process(None) template.process(None)
def __call__(self, **kwargs):
return self.widget(self, return self.widget(self,
template=self.template, template=template,
check=self.display_row_controls, check=self.display_row_controls,
**kwargs) **kwargs)
......
...@@ -60,7 +60,7 @@ class InlineBaseFormAdmin(object): ...@@ -60,7 +60,7 @@ class InlineBaseFormAdmin(object):
class MyInlineForm(InlineFormAdmin): class MyInlineForm(InlineFormAdmin):
def postprocess_form(self, form): def postprocess_form(self, form):
form.value = TextField('value') form.value = StringField('value')
return form return form
class MyAdmin(ModelView): class MyAdmin(ModelView):
......
...@@ -67,14 +67,8 @@ def test_model(): ...@@ -67,14 +67,8 @@ def test_model():
eq_(view._search_supported, False) eq_(view._search_supported, False)
eq_(view._filters, None) eq_(view._filters, None)
# Verify form eq_(view._create_form_class.test1.field_class, fields.StringField)
# TODO: Figure out why there's inconsistency eq_(view._create_form_class.test2.field_class, fields.StringField)
try:
eq_(view._create_form_class.test1.field_class, fields.TextField)
eq_(view._create_form_class.test2.field_class, fields.TextField)
except AssertionError:
eq_(view._create_form_class.test1.field_class, fields.StringField)
eq_(view._create_form_class.test2.field_class, fields.StringField)
eq_(view._create_form_class.test3.field_class, fields.TextAreaField) eq_(view._create_form_class.test3.field_class, fields.TextAreaField)
eq_(view._create_form_class.test4.field_class, fields.TextAreaField) eq_(view._create_form_class.test4.field_class, fields.TextAreaField)
...@@ -150,7 +144,7 @@ def test_extra_fields(): ...@@ -150,7 +144,7 @@ def test_extra_fields():
view = CustomModelView( view = CustomModelView(
Model1, Model1,
form_extra_fields={ form_extra_fields={
'extra_field': fields.TextField('Extra Field') 'extra_field': fields.StringField('Extra Field')
} }
) )
admin.add_view(view) admin.add_view(view)
...@@ -177,7 +171,7 @@ def test_extra_field_order(): ...@@ -177,7 +171,7 @@ def test_extra_field_order():
Model1, Model1,
form_columns=('extra_field', 'test1'), form_columns=('extra_field', 'test1'),
form_extra_fields={ form_extra_fields={
'extra_field': fields.TextField('Extra Field') 'extra_field': fields.StringField('Extra Field')
} }
) )
admin.add_view(view) admin.add_view(view)
......
...@@ -82,8 +82,8 @@ def test_model(): ...@@ -82,8 +82,8 @@ def test_model():
eq_(view._filters, None) eq_(view._filters, None)
# Verify form # Verify form
eq_(view._create_form_class.test1.field_class, fields.TextField) eq_(view._create_form_class.test1.field_class, fields.StringField)
eq_(view._create_form_class.test2.field_class, fields.TextField) eq_(view._create_form_class.test2.field_class, fields.StringField)
eq_(view._create_form_class.test3.field_class, fields.TextAreaField) eq_(view._create_form_class.test3.field_class, fields.TextAreaField)
eq_(view._create_form_class.test4.field_class, fields.TextAreaField) eq_(view._create_form_class.test4.field_class, fields.TextAreaField)
...@@ -158,7 +158,7 @@ def test_extra_fields(): ...@@ -158,7 +158,7 @@ def test_extra_fields():
view = CustomModelView( view = CustomModelView(
Model1, Model1,
form_extra_fields={ form_extra_fields={
'extra_field': fields.TextField('Extra Field') 'extra_field': fields.StringField('Extra Field')
} }
) )
admin.add_view(view) admin.add_view(view)
......
...@@ -8,8 +8,8 @@ from . import setup ...@@ -8,8 +8,8 @@ from . import setup
class TestForm(form.Form): class TestForm(form.Form):
test1 = fields.TextField('Test1') test1 = fields.StringField('Test1')
test2 = fields.TextField('Test2') test2 = fields.StringField('Test2')
class TestView(ModelView): class TestView(ModelView):
......
...@@ -91,8 +91,8 @@ def test_model(): ...@@ -91,8 +91,8 @@ def test_model():
eq_(view._filters, None) eq_(view._filters, None)
# Verify form # Verify form
eq_(view._create_form_class.test1.field_class, fields.TextField) eq_(view._create_form_class.test1.field_class, fields.StringField)
eq_(view._create_form_class.test2.field_class, fields.TextField) eq_(view._create_form_class.test2.field_class, fields.StringField)
eq_(view._create_form_class.test3.field_class, fields.TextAreaField) eq_(view._create_form_class.test3.field_class, fields.TextAreaField)
eq_(view._create_form_class.test4.field_class, fields.TextAreaField) eq_(view._create_form_class.test4.field_class, fields.TextAreaField)
...@@ -567,7 +567,7 @@ def test_form_override(): ...@@ -567,7 +567,7 @@ def test_form_override():
admin.add_view(view1) admin.add_view(view1)
admin.add_view(view2) admin.add_view(view2)
eq_(view1._create_form_class.test.field_class, fields.TextField) eq_(view1._create_form_class.test.field_class, fields.StringField)
eq_(view2._create_form_class.test.field_class, fields.FileField) eq_(view2._create_form_class.test.field_class, fields.FileField)
...@@ -711,7 +711,7 @@ def test_extra_fields(): ...@@ -711,7 +711,7 @@ def test_extra_fields():
view = CustomModelView( view = CustomModelView(
Model1, db.session, Model1, db.session,
form_extra_fields={ form_extra_fields={
'extra_field': fields.TextField('Extra Field') 'extra_field': fields.StringField('Extra Field')
} }
) )
admin.add_view(view) admin.add_view(view)
...@@ -738,7 +738,7 @@ def test_extra_field_order(): ...@@ -738,7 +738,7 @@ def test_extra_field_order():
Model1, db.session, Model1, db.session,
form_columns=('extra_field', 'test1'), form_columns=('extra_field', 'test1'),
form_extra_fields={ form_extra_fields={
'extra_field': fields.TextField('Extra Field') 'extra_field': fields.StringField('Extra Field')
} }
) )
admin.add_view(view) admin.add_view(view)
......
...@@ -45,7 +45,7 @@ def test_inline_form(): ...@@ -45,7 +45,7 @@ def test_inline_form():
eq_(view.endpoint, 'user') eq_(view.endpoint, 'user')
# Verify form # Verify form
eq_(view._create_form_class.name.field_class, fields.TextField) eq_(view._create_form_class.name.field_class, fields.StringField)
eq_(view._create_form_class.info.field_class, InlineModelFormList) eq_(view._create_form_class.info.field_class, InlineModelFormList)
rv = client.get('/admin/user/') rv = client.get('/admin/user/')
......
...@@ -21,9 +21,9 @@ class Model(object): ...@@ -21,9 +21,9 @@ class Model(object):
class Form(form.BaseForm): class Form(form.BaseForm):
col1 = fields.TextField() col1 = fields.StringField()
col2 = fields.TextField() col2 = fields.StringField()
col3 = fields.TextField() col3 = fields.StringField()
class SimpleFilter(filters.BaseFilter): class SimpleFilter(filters.BaseFilter):
......
...@@ -45,7 +45,7 @@ setup( ...@@ -45,7 +45,7 @@ setup(
platforms='any', platforms='any',
install_requires=[ install_requires=[
'Flask>=0.7', 'Flask>=0.7',
'wtforms<2.0' 'wtforms'
], ],
tests_require=[ tests_require=[
'nose>=1.0', 'nose>=1.0',
......
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