mirror of
https://github.com/wassname/wtforms-parsleyjs.git
synced 2026-07-23 13:20:10 +08:00
support for wtforms 2.x and upgrading to parsley 2
also adding a few new field types
This commit is contained in:
+60
-19
@@ -4,14 +4,22 @@ import re
|
||||
import copy
|
||||
|
||||
from wtforms.validators import Length, NumberRange, Email, EqualTo, IPAddress, \
|
||||
InputRequired, Regexp, URL, AnyOf
|
||||
Regexp, URL, AnyOf, Optional
|
||||
try:
|
||||
from wtforms.validators import DataRequired
|
||||
except ImportError:
|
||||
# wtforms < 2.x
|
||||
from wtforms.validators import Required as DataRequired
|
||||
|
||||
from wtforms import StringField
|
||||
from wtforms.widgets import TextInput as _TextInput, PasswordInput as _PasswordInput, \
|
||||
CheckboxInput as _CheckboxInput, Select as _Select, Input
|
||||
CheckboxInput as _CheckboxInput, Select as _Select, TextArea as _TextArea, \
|
||||
ListWidget as _ListWidget, HiddenInput as _HiddenInput, Input
|
||||
from wtforms.fields import StringField as _StringField, BooleanField as _BooleanField, \
|
||||
DecimalField as _DecimalField, IntegerField as _IntegerField, \
|
||||
FloatField as _FloatField, PasswordField as _PasswordField, \
|
||||
SelectField as _SelectField
|
||||
SelectField as _SelectField, TextAreaField as _TextAreaField, \
|
||||
RadioField as _RadioField
|
||||
|
||||
|
||||
def parsley_kwargs(field, kwargs):
|
||||
@@ -41,7 +49,7 @@ def parsley_kwargs(field, kwargs):
|
||||
_length_kwargs(new_kwargs, vali)
|
||||
if isinstance(vali, NumberRange):
|
||||
_number_range_kwargs(new_kwargs, vali)
|
||||
if isinstance(vali, InputRequired):
|
||||
if isinstance(vali, DataRequired):
|
||||
_input_required_kwargs(new_kwargs)
|
||||
_trigger_kwargs(new_kwargs, u'key')
|
||||
if isinstance(vali, Regexp) and not 'data_regexp' in new_kwargs:
|
||||
@@ -50,26 +58,30 @@ def parsley_kwargs(field, kwargs):
|
||||
_url_kwargs(new_kwargs)
|
||||
if isinstance(vali, AnyOf):
|
||||
_anyof_kwargs(new_kwargs, vali)
|
||||
if isinstance(vali, Optional):
|
||||
pass
|
||||
|
||||
if not 'data_trigger' in new_kwargs:
|
||||
_trigger_kwargs(new_kwargs)
|
||||
if not 'parsley-error-message' in new_kwargs and vali.message is not None:
|
||||
if not 'parsley-error-message' in new_kwargs \
|
||||
and not isinstance(vali, Optional) \
|
||||
and vali.message is not None:
|
||||
_message_kwargs(new_kwargs, message=vali.message)
|
||||
|
||||
return new_kwargs
|
||||
|
||||
|
||||
def _email_kwargs(kwargs):
|
||||
kwargs[u'parsley-type'] = u'email'
|
||||
kwargs[u'data-parsley-type'] = u'email'
|
||||
|
||||
|
||||
def _equal_to_kwargs(kwargs, vali):
|
||||
kwargs[u'parsley-equalto'] = u'#' + vali.fieldname
|
||||
kwargs[u'data-parsley-equalto'] = u'#' + vali.fieldname
|
||||
|
||||
|
||||
def _ip_address_kwargs(kwargs):
|
||||
# Regexp from http://stackoverflow.com/a/4460645
|
||||
kwargs[u'parsley-regexp'] =\
|
||||
kwargs[u'data-parsley-regexp'] =\
|
||||
r'^\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' \
|
||||
r'(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' \
|
||||
r'(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' \
|
||||
@@ -80,20 +92,20 @@ def _length_kwargs(kwargs, vali):
|
||||
default_number = -1
|
||||
|
||||
if vali.max != default_number and vali.min != default_number:
|
||||
kwargs[u'parsley-rangelength'] = u'[' + str(vali.min) + u',' + str(vali.max) + u']'
|
||||
kwargs[u'data-parsley-rangelength'] = u'[' + str(vali.min) + u',' + str(vali.max) + u']'
|
||||
else:
|
||||
if vali.max == default_number:
|
||||
kwargs[u'parsley-minlength'] = str(vali.min)
|
||||
kwargs[u'data-parsley-minlength'] = str(vali.min)
|
||||
if vali.min == default_number:
|
||||
kwargs[u'parsley-maxlength'] = str(vali.max)
|
||||
kwargs[u'data-parsley-maxlength'] = str(vali.max)
|
||||
|
||||
|
||||
def _number_range_kwargs(kwargs, vali):
|
||||
kwargs[u'parsley-range'] = u'[' + str(vali.min) + u',' + str(vali.max) + u']'
|
||||
kwargs[u'data-parsley-range'] = u'[' + str(vali.min) + u',' + str(vali.max) + u']'
|
||||
|
||||
|
||||
def _input_required_kwargs(kwargs):
|
||||
kwargs[u'parsley-required'] = u'true'
|
||||
kwargs[u'data-parsley-required'] = u'true'
|
||||
|
||||
|
||||
def _regexp_kwargs(kwargs, vali):
|
||||
@@ -104,11 +116,11 @@ def _regexp_kwargs(kwargs, vali):
|
||||
regex_string = vali.regex.pattern
|
||||
else:
|
||||
regex_string = vali.regex
|
||||
kwargs[u'parsley-regexp'] = regex_string
|
||||
kwargs[u'data-parsley-regexp'] = regex_string
|
||||
|
||||
|
||||
def _url_kwargs(kwargs):
|
||||
kwargs[u'parsley-type'] = u'url'
|
||||
kwargs[u'data-parsley-type'] = u'url'
|
||||
|
||||
|
||||
def _string_seq_delimiter(vali, kwargs):
|
||||
@@ -122,21 +134,21 @@ def _string_seq_delimiter(vali, kwargs):
|
||||
delimiter = fallback_delimiter
|
||||
break
|
||||
if delimiter != default_delimiter:
|
||||
kwargs[u'parsley-inlist-delimiter'] = delimiter
|
||||
kwargs[u'data-parsley-inlist-delimiter'] = delimiter
|
||||
return delimiter
|
||||
|
||||
|
||||
def _anyof_kwargs(kwargs, vali):
|
||||
delimiter = _string_seq_delimiter(vali, kwargs)
|
||||
kwargs[u'parsley-inlist'] = delimiter.join(vali.values)
|
||||
kwargs[u'data-parsley-inlist'] = delimiter.join(vali.values)
|
||||
|
||||
|
||||
def _trigger_kwargs(kwargs, trigger=u'change'):
|
||||
kwargs[u'parsley-trigger'] = trigger
|
||||
kwargs[u'data-parsley-trigger'] = trigger
|
||||
|
||||
|
||||
def _message_kwargs(kwargs, message):
|
||||
kwargs[u'parsley-error-message'] = message
|
||||
kwargs[u'data-parsley-error-message'] = message
|
||||
|
||||
|
||||
class ParsleyInputMixin(Input):
|
||||
@@ -153,6 +165,14 @@ class PasswordInput(_PasswordInput, ParsleyInputMixin):
|
||||
pass
|
||||
|
||||
|
||||
class HiddenInput(_HiddenInput, ParsleyInputMixin):
|
||||
pass
|
||||
|
||||
|
||||
class TextArea(_TextArea, ParsleyInputMixin):
|
||||
pass
|
||||
|
||||
|
||||
class CheckboxInput(_CheckboxInput, ParsleyInputMixin):
|
||||
pass
|
||||
|
||||
@@ -163,6 +183,12 @@ class Select(_Select):
|
||||
return super(Select, self).__call__(field, **kwargs)
|
||||
|
||||
|
||||
class ListWidget(_ListWidget):
|
||||
def __call__(self, field, **kwargs):
|
||||
kwargs = parsley_kwargs(field, kwargs)
|
||||
return super(ListWidget, self).__call__(field, **kwargs)
|
||||
|
||||
|
||||
class StringField(_StringField):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(StringField, self).__init__(widget=TextInput(), *args, **kwargs)
|
||||
@@ -173,6 +199,11 @@ class IntegerField(_IntegerField):
|
||||
super(IntegerField, self).__init__(widget=TextInput(), *args, **kwargs)
|
||||
|
||||
|
||||
class RadioField(_RadioField):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(RadioField, self).__init__(widget=ListWidget(), *args, **kwargs)
|
||||
|
||||
|
||||
class BooleanField(_BooleanField):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(BooleanField, self).__init__(widget=CheckboxInput(), *args, **kwargs)
|
||||
@@ -193,6 +224,16 @@ class PasswordField(_PasswordField):
|
||||
super(PasswordField, self).__init__(widget=PasswordInput(), *args, **kwargs)
|
||||
|
||||
|
||||
class HiddenField(_PasswordField):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(PasswordField, self).__init__(widget=HiddenInput(), *args, **kwargs)
|
||||
|
||||
|
||||
class TextAreaField(_TextAreaField):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(TextAreaField, self).__init__(widget=TextArea(), *args, **kwargs)
|
||||
|
||||
|
||||
class SelectField(_SelectField):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(SelectField, self).__init__(widget=Select(), *args, **kwargs)
|
||||
|
||||
Reference in New Issue
Block a user