diff --git a/wtformsparsleyjs/core.py b/wtformsparsleyjs/core.py index f428b9b..129f6cf 100644 --- a/wtformsparsleyjs/core.py +++ b/wtformsparsleyjs/core.py @@ -25,6 +25,16 @@ from wtforms.fields import StringField as _StringField, BooleanField as _Boolean DateTimeField as _DateTimeField, FileField as _FileField, \ SelectMultipleField as _SelectMultipleField +from wtforms.fields.html5 import URLField as _URLField, EmailField as _EmailField, \ + DecimalRangeField as _DecimalRangeField, SearchField as _SearchField, \ + TelField as _TelField, IntegerRangeField as _IntegerRangeField + +from wtforms.widgets.html5 import ColorInput as _ColorInput, DateInput as _DateInput, \ + DateTimeInput as _DateTimeInput, EmailInput as _EmailInput, \ + RangeInput as _RangeInput, TelInput as _TelInput, URLInput as _UrlInput, \ + NumberInput as _NumberInput, SearchInput as _SearchInput, TimeInput as _TimeInput, \ + WeekInput as _WeekInput + def parsley_kwargs(field, kwargs): """ @@ -88,6 +98,7 @@ def parsley_kwargs(field, kwargs): return new_kwargs + def _email_kwargs(kwargs): kwargs[u'data-parsley-type'] = u'email' @@ -124,6 +135,7 @@ def _number_range_kwargs(kwargs, vali): def _input_required_kwargs(kwargs): kwargs[u'data-parsley-required'] = u'true' + def _regexp_kwargs(kwargs, vali): # Apparently, this is the best way to check for RegexObject Type # It's needed because WTForms allows compiled regexps to be passed to the validator @@ -134,35 +146,45 @@ def _regexp_kwargs(kwargs, vali): regex_string = vali.regex kwargs[u'data-parsley-pattern'] = regex_string + def _url_kwargs(kwargs): kwargs[u'data-parsley-type'] = u'url' + def _anyof_kwargs(kwargs, vali): # The inlist validator is no longer available in Parsley 2.x, so a custom anyof validator is used. kwargs[u'data-parsley-anyof'] = json.dumps(vali.values) + def _mac_address_kwargs(kwargs): kwargs[u'data-parsley-pattern'] = '^(?:[0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}$' + def _uuid_kwargs(kwargs): kwargs[u'data-parsley-pattern'] = '^[0-9a-fA-F]{8}-([0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}$' + def _none_of_kwargs(kwargs, vali): - #data-parsley-noneof is a custom validator, it can be found in scripts/parsley-noneof.js + # data-parsley-noneof is a custom validator, it can be found in scripts/parsley-noneof.js kwargs[u'data-parsley-noneof'] = json.dumps(vali.values) + def _trigger_kwargs(kwargs, trigger=u'change'): kwargs[u'data-parsley-trigger'] = trigger + def _message_kwargs(kwargs, message): kwargs[u'data-parsley-error-message'] = message + def _date_kwargs(kwargs, field): kwargs[u'data-parsley-datefield'] = field.format + def _integer_kwargs(kwargs): kwargs[u'data-parsley-type'] = "integer" + def _number_kwargs(kwargs): kwargs[u'data-parsley-type'] = "number" @@ -194,6 +216,51 @@ class TextArea(_TextArea): class CheckboxInput(_CheckboxInput, ParsleyInputMixin): pass + +class ColorInput(_ColorInput, ParsleyInputMixin): + pass + + +class DateInput(_DateInput, ParsleyInputMixin): + pass + + +class DateTimeInput(_DateTimeInput, ParsleyInputMixin): + pass + + +class EmailInput(_EmailInput, ParsleyInputMixin): + pass + + +class RangeInput(_RangeInput, ParsleyInputMixin): + pass + + +class TelInput(_TelInput, ParsleyInputMixin): + pass + + +class URLInput(_UrlInput, ParsleyInputMixin): + pass + + +class NumberInput(_NumberInput, ParsleyInputMixin): + pass + + +class TimeInput(_TimeInput, ParsleyInputMixin): + pass + + +class WeekInput(_WeekInput, ParsleyInputMixin): + pass + + +class SearchInput(_SearchInput, ParsleyInputMixin): + pass + + class RadioInput(_RadioInput): def __init__(self, parsley_options): self.parsley_options = parsley_options @@ -202,6 +269,7 @@ class RadioInput(_RadioInput): kwargs.update(self.parsley_options) return super(RadioInput, self).__call__(field, **kwargs) + class Select(_Select): def __call__(self, field, **kwargs): kwargs = parsley_kwargs(field, kwargs) @@ -317,3 +385,44 @@ class SelectMultipleField(_SelectMultipleField): def __init__(self, *args, **kwargs): super(SelectMultipleField, self).__init__(*args, **kwargs) + +class URLField(_URLField): + widget = URLInput() + + def __init__(self, *args, **kwargs): + super(URLField, self).__init__(*args, **kwargs) + + +class TelField(_TelField): + widget = TelInput() + + def __init__(self, *args, **kwargs): + super(TelField, self).__init__(*args, **kwargs) + + +class SearchField(_SearchField): + widget = SearchInput() + + def __init__(self, *args, **kwargs): + super(SearchField, self).__init__(*args, **kwargs) + + +class EmailField(_EmailField): + widget = EmailInput() + + def __init__(self, *args, **kwargs): + super(EmailField, self).__init__(*args, **kwargs) + + +class DecimalRangeField(_DecimalRangeField): + widget = RangeInput() + + def __init__(self, *args, **kwargs): + super(DecimalRangeField, self).__init__(*args, **kwargs) + + +class IntegerRangeField(_IntegerRangeField): + widget = NumberInput() + + def __init__(self, *args, **kwargs): + super(IntegerRangeField, self).__init__(*args, **kwargs) diff --git a/wtformsparsleyjs/sample/sample.py b/wtformsparsleyjs/sample/sample.py index ef05131..7836144 100644 --- a/wtformsparsleyjs/sample/sample.py +++ b/wtformsparsleyjs/sample/sample.py @@ -16,7 +16,7 @@ def parsley_testform(): class ParsleyTestForm(Form): - email = wtformsparsleyjs.StringField( + email = wtformsparsleyjs.EmailField( label = 'E-Mail Address', validators = [ validators.Email( @@ -265,7 +265,7 @@ class ParsleyTestForm(Form): default = 6 ) - # No default values for passwords, becuase the aren't rendered as a safety + # No default values for passwords, because the aren't rendered as a safety # feature. secret = wtformsparsleyjs.PasswordField( label = "Enter your secret:", @@ -296,3 +296,43 @@ class ParsleyTestForm(Form): ], default = "This is my life story, it has to be at least 50 characters." ) + + url = wtformsparsleyjs.URLField( + label = "Enter your website: ", + default = "crashoverhackthemainframe.c" + ) + + search = wtformsparsleyjs.SearchField( + label = "Enter your search term: ", + validators = [ + validators.Length( + max = 10, + message = "Search query too long it almost killed our server" + ) + ], + default = "How can mirrors be real when our eyes arn't real?" + ) + + decimal_range = wtformsparsleyjs.DecimalRangeField( + label = "Enter your favorite decimal: ", + validators = [ + validators.NumberRange( + message = "That's not your favourite number, it's between 0 and 50", + min = 0, + max = 50 + ) + ], + default = 70, + ) + + ineger_range = wtformsparsleyjs.IntegerRangeField( + label = "Enter your age (you must be over 18): ", + validators = [ + validators.NumberRange( + message = "That's not your age, it's between 3 and 5", + min = 3, + max = 5 + ), + ], + default = 18 + )