diff --git a/scripts/parsley-datefield.js b/scripts/parsley-datefield.js new file mode 100644 index 0000000..892617d --- /dev/null +++ b/scripts/parsley-datefield.js @@ -0,0 +1,32 @@ +$(document).ready(function() { + window.ParsleyValidator.addValidator('datefield', function (str, format) { + /** + * Modified version of micro-strptime.js. + * https://github.com/cho45/micro-strptime.js + */ + if (!format) throw Error("Missing format"); + fds = { + '%': '%', + 'A': '[a-z]+', + 'B': '[a-z]+', + 'Y': '[0-9]{4}', + 'm': '[0-9]{0,2}', + 'd': '[0-9]{0,2}', + 'H': '[0-9]{0,2}', + 'M': '[0-9]{0,2}', + 'S': '[0-9]{0,2}', + 's': '[0-9]+', + 'Z': 'UTC|Z|[+-][0-9][0-9]:?[0-9][0-9]', + 'I': '[0-9]{0,2}', + 'p': 'AM|PM' + }; + // Create a regular expression from the format string, that matches a string of that format. + var re = new RegExp(format.replace(/%(?:([a-zA-Z%])|('[^']+')|("[^"]+"))/g, function (_, a, b, c) { + var fd = a || b || c; + var d = fds[fd]; + if (!d) throw Error("Unknown format descripter: " + fd); + return '(' + d + ')'; + }), 'i'); + return re.test(str); + }, 32).addMessage('en', 'datefield', 'The input needs to be in the correct date format.') +}); diff --git a/wtformsparsleyjs/core.py b/wtformsparsleyjs/core.py index 1c64656..5afcf95 100644 --- a/wtformsparsleyjs/core.py +++ b/wtformsparsleyjs/core.py @@ -20,7 +20,8 @@ from wtforms.fields import StringField as _StringField, BooleanField as _Boolean DecimalField as _DecimalField, IntegerField as _IntegerField, \ FloatField as _FloatField, PasswordField as _PasswordField, \ SelectField as _SelectField, TextAreaField as _TextAreaField, \ - RadioField as _RadioField + RadioField as _RadioField, DateField as _DateField, \ + DateTimeField as _DateTimeField def parsley_kwargs(field, kwargs): @@ -39,6 +40,10 @@ def parsley_kwargs(field, kwargs): one. Do check if the behaviour suits your needs. """ new_kwargs = copy.deepcopy(kwargs) + + if isinstance(field, DateField) or isinstance(field, DateTimeField): + _date_kwargs(new_kwargs, field) + for vali in field.validators: if isinstance(vali, Email): _email_kwargs(new_kwargs) @@ -162,6 +167,9 @@ def _trigger_kwargs(kwargs, trigger=u'change'): def _message_kwargs(kwargs, message): kwargs[u'data-parsley-error-message'] = message +def _date_kwargs(kwargs, field): + kwargs[u'data-parsley-datefield'] = field.format + class ParsleyInputMixin(Input): def __call__(self, field, **kwargs): kwargs = parsley_kwargs(field, kwargs) @@ -257,3 +265,14 @@ class TextAreaField(_TextAreaField): class SelectField(_SelectField): def __init__(self, *args, **kwargs): super(SelectField, self).__init__(widget=Select(), *args, **kwargs) + + +class DateTimeField(_DateTimeField): + def __init__(self, *args, **kwargs): + super(DateTimeField, self).__init__(widget=TextInput(), *args, **kwargs) + + +class DateField(_DateField): + def __init__(self, *args, **kwargs): + super(DateField, self).__init__(widget=TextInput(), *args, **kwargs) +