formutils.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import logging
  2. from wtforms.fields import StringField
  3. from wtforms import Field
  4. import wtforms.widgets
  5. from datetime import datetime
  6. log = logging.getLogger(__name__)
  7. class AutocompleteTextInput(wtforms.widgets.Input):
  8. def __init__(self, datalist=None):
  9. super().__init__('text')
  10. self.datalist = datalist
  11. def __call__(self, field, **kwargs):
  12. # every second can be specified
  13. if self.datalist is not None:
  14. return super(AutocompleteTextInput, self).__call__(
  15. field, list=self.datalist, autocomplete="autocomplete",
  16. **kwargs)
  17. return super(AutocompleteTextInput, self).__call__(
  18. field, **kwargs)
  19. class AutocompleteStringField(StringField):
  20. def __init__(self, datalist, *args, **kwargs):
  21. super().__init__(*args, **kwargs)
  22. self.widget = AutocompleteTextInput(datalist)
  23. class DateTimeInput(wtforms.widgets.Input):
  24. input_type = 'datetime-local'
  25. def __call__(self, field, **kwargs):
  26. # every second can be specified
  27. return super(DateTimeInput, self).__call__(field, step='1', **kwargs)
  28. class EasyDateTimeField(Field):
  29. '''
  30. a "fork" of DateTimeField which uses HTML5 datetime-local
  31. The format is not customizable, because it is imposed by the HTML5
  32. specification.
  33. This field does not ensure that browser actually supports datetime-local
  34. input type, nor does it provide polyfills.
  35. '''
  36. widget = DateTimeInput()
  37. formats = ('%Y-%m-%dT%H:%M:%S', '%Y-%m-%dT%H:%M')
  38. def __init__(self, label=None, validators=None, **kwargs):
  39. super(EasyDateTimeField, self).__init__(label, validators, **kwargs)
  40. def _value(self):
  41. if self.raw_data:
  42. return ' '.join(self.raw_data)
  43. return self.data and self.data.strftime(self.formats[0]) or ''
  44. def process_formdata(self, valuelist):
  45. if valuelist:
  46. date_str = ' '.join(valuelist)
  47. for fmt in self.formats:
  48. try:
  49. self.data = datetime.strptime(date_str, fmt)
  50. return
  51. except ValueError:
  52. log.debug('Format `%s` not valid for `%s`',
  53. fmt, date_str)
  54. raise ValueError(self.gettext(
  55. 'Not a valid datetime value <tt>{}</tt>').format(date_str))