12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- import logging
- from wtforms.fields import StringField
- from wtforms import Field
- import wtforms.widgets
- from datetime import datetime
- log = logging.getLogger(__name__)
- class AutocompleteTextInput(wtforms.widgets.Input):
- def __init__(self, datalist=None):
- super().__init__('text')
- self.datalist = datalist
- def __call__(self, field, **kwargs):
- # every second can be specified
- if self.datalist is not None:
- return super(AutocompleteTextInput, self).__call__(
- field, list=self.datalist, autocomplete="autocomplete",
- **kwargs)
- return super(AutocompleteTextInput, self).__call__(
- field, **kwargs)
- class AutocompleteStringField(StringField):
- def __init__(self, datalist, *args, **kwargs):
- super().__init__(*args, **kwargs)
- self.widget = AutocompleteTextInput(datalist)
- class DateTimeInput(wtforms.widgets.Input):
- input_type = 'datetime-local'
- def __call__(self, field, **kwargs):
- # every second can be specified
- return super(DateTimeInput, self).__call__(field, step='1', **kwargs)
- class EasyDateTimeField(Field):
- '''
- a "fork" of DateTimeField which uses HTML5 datetime-local
- The format is not customizable, because it is imposed by the HTML5
- specification.
- This field does not ensure that browser actually supports datetime-local
- input type, nor does it provide polyfills.
- '''
- widget = DateTimeInput()
- formats = ('%Y-%m-%dT%H:%M:%S', '%Y-%m-%dT%H:%M')
- def __init__(self, label=None, validators=None, **kwargs):
- super(EasyDateTimeField, self).__init__(label, validators, **kwargs)
- def _value(self):
- if self.raw_data:
- return ' '.join(self.raw_data)
- return self.data and self.data.strftime(self.formats[0]) or ''
- def process_formdata(self, valuelist):
- if valuelist:
- date_str = ' '.join(valuelist)
- for fmt in self.formats:
- try:
- self.data = datetime.strptime(date_str, fmt)
- return
- except ValueError:
- log.debug('Format `%s` not valid for `%s`',
- fmt, date_str)
- raise ValueError(self.gettext(
- 'Not a valid datetime value <tt>{}</tt>').format(date_str))
|