timeform_base.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import logging
  2. from datetime import datetime
  3. from pytimeparse.timeparse import timeparse
  4. from flask_wtf import Form
  5. from wtforms import StringField, validators, SubmitField, \
  6. SelectMultipleField, ValidationError
  7. from larigira.formutils import EasyDateTimeField
  8. log = logging.getLogger(__name__)
  9. class SingleAlarmForm(Form):
  10. nick = StringField('Alarm nick', validators=[validators.required()],
  11. description='A simple name to recognize this alarm')
  12. dt = EasyDateTimeField('Date and time', validators=[validators.required()],
  13. description='Date to ring on, expressed as '
  14. '2000-12-31T13:42:00')
  15. submit = SubmitField('Submit')
  16. def populate_from_timespec(self, timespec):
  17. if 'nick' in timespec:
  18. self.nick.data = timespec['nick']
  19. if 'timestamp' in timespec:
  20. self.dt.data = datetime.fromtimestamp(timespec['timestamp'])
  21. def singlealarm_receive(form):
  22. return {
  23. 'kind': 'single',
  24. 'nick': form.nick.data,
  25. 'timestamp': int(form.dt.data.strftime('%s'))
  26. }
  27. class FrequencyAlarmForm(Form):
  28. nick = StringField('Alarm nick', validators=[validators.required()],
  29. description='A simple name to recognize this alarm')
  30. interval = StringField('Frequency',
  31. validators=[validators.required()],
  32. description='in seconds, or human-readable '
  33. '(like 9w3d12h)')
  34. start = EasyDateTimeField('Start date and time',
  35. validators=[validators.optional()],
  36. description='Before this, no alarm will ring. '
  37. 'Expressed as YYYY-MM-DDTHH:MM:SS. If omitted, '
  38. 'the alarm will always ring')
  39. end = EasyDateTimeField('End date and time',
  40. validators=[validators.optional()],
  41. description='After this, no alarm will ring. '
  42. 'Expressed as YYYY-MM-DDTHH:MM:SS. If omitted, '
  43. 'the alarm will always ring')
  44. weekdays = SelectMultipleField('Days on which the alarm should be played',
  45. choices=[('1', 'Monday'),
  46. ('2', 'Tuesday'),
  47. ('3', 'Wednesday'),
  48. ('4', 'Thursday'),
  49. ('5', 'Friday'),
  50. ('6', 'Saturday'),
  51. ('7', 'Sunday')],
  52. default=list('1234567'),
  53. validators=[validators.required()],
  54. description='The alarm will ring only on '
  55. 'selected weekdays')
  56. submit = SubmitField('Submit')
  57. def populate_from_timespec(self, timespec):
  58. if 'nick' in timespec:
  59. self.nick.data = timespec['nick']
  60. if 'start' in timespec:
  61. self.start.data = datetime.fromtimestamp(timespec['start'])
  62. if 'end' in timespec:
  63. self.end.data = datetime.fromtimestamp(timespec['end'])
  64. if 'weekdays' in timespec:
  65. self.weekdays.data = timespec['weekdays']
  66. else:
  67. self.weekdays.data = list('1234567')
  68. self.interval.data = timespec['interval']
  69. def validate_interval(self, field):
  70. try:
  71. int(field.data)
  72. except ValueError:
  73. if timeparse(field.data) is None:
  74. raise ValidationError("interval must either be a number "
  75. "(in seconds) or a human-readable "
  76. "string like '1h2m' or '1d12h'")
  77. def frequencyalarm_receive(form):
  78. obj = {
  79. 'kind': 'frequency',
  80. 'nick': form.nick.data,
  81. 'interval': form.interval.data,
  82. 'weekdays': form.weekdays.data,
  83. }
  84. if form.start.data:
  85. obj['start'] = int(form.start.data.strftime('%s'))
  86. else:
  87. obj['start'] = 0
  88. if form.end.data:
  89. obj['end'] = int(form.end.data.strftime('%s'))
  90. return obj