timeform_base.py 3.7 KB

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