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