timeform_frequency.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. from datetime import datetime
  2. from pytimeparse.timeparse import timeparse
  3. from flask_wtf import Form
  4. from wtforms import StringField, DateTimeField, validators, \
  5. SubmitField, ValidationError, SelectMultipleField
  6. class FrequencyAlarmForm(Form):
  7. nick = StringField('Alarm nick', validators=[validators.required()],
  8. description='A simple name to recognize this alarm')
  9. interval = StringField('Frequency',
  10. validators=[validators.required()],
  11. description='in seconds, or human-readable '
  12. '(like 9w3d12h)')
  13. start = DateTimeField('Start date and time',
  14. validators=[validators.optional()],
  15. description='Date before which no alarm will ring, '
  16. 'expressed as YYYY-MM-DD HH:MM:SS; if omitted, the '
  17. 'alarm will always ring')
  18. end = DateTimeField('End date and time',
  19. validators=[validators.optional()],
  20. description='Date after which no alarm will ring, '
  21. 'expressed as YYYY-MM-DD HH:MM:SS; if omitted, the '
  22. 'alarm will always ring')
  23. weekdays = SelectMultipleField('Days on which the alarm should be played',
  24. choices=[('1', 'Monday'),
  25. ('2', 'Tuesday'),
  26. ('3', 'Wednesday'),
  27. ('4', 'Thursday'),
  28. ('5', 'Friday'),
  29. ('6', 'Saturday'),
  30. ('7', 'Sunday')],
  31. default=list('1234567'),
  32. validators=[validators.required()],
  33. description='The alarm will ring only on '
  34. 'selected weekdays')
  35. submit = SubmitField('Submit')
  36. def populate_from_timespec(self, timespec):
  37. if 'nick' in timespec:
  38. self.nick.data = timespec['nick']
  39. if 'start' in timespec:
  40. self.start.data = datetime.fromtimestamp(timespec['start'])
  41. if 'end' in timespec:
  42. self.end.data = datetime.fromtimestamp(timespec['end'])
  43. if 'weekdays' in timespec:
  44. self.weekdays.data = timespec['weekdays']
  45. else:
  46. self.weekdays.data = list('1234567')
  47. self.interval.data = timespec['interval']
  48. def validate_interval(form, field):
  49. try:
  50. int(field.data)
  51. except ValueError:
  52. if timeparse(field.data) is None:
  53. raise ValidationError("interval must either be a number "
  54. "(in seconds) or a human-readable "
  55. "string like '1h2m' or '1d12h'")
  56. def frequencyalarm_receive(form):
  57. obj = {
  58. 'kind': 'frequency',
  59. 'nick': form.nick.data,
  60. 'interval': form.interval.data,
  61. 'weekdays': form.weekdays.data,
  62. }
  63. if form.start.data:
  64. obj['start'] = int(form.start.data.strftime('%s'))
  65. else:
  66. obj['start'] = 0
  67. if form.end.data:
  68. obj['end'] = int(form.end.data.strftime('%s'))
  69. return obj