timeform_base.py 3.8 KB

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