timeform_cron.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import logging
  2. from flask_wtf import Form
  3. from wtforms import StringField, TextAreaField, validators, SubmitField, ValidationError
  4. from croniter import croniter
  5. log = logging.getLogger(__name__)
  6. class CronAlarmForm(Form):
  7. nick = StringField(
  8. "Alarm nick",
  9. validators=[validators.required()],
  10. description="A simple name to recognize this alarm",
  11. )
  12. cron_format = StringField(
  13. "cron-like format",
  14. validators=[validators.required()],
  15. description="the frequency specification, as in the <tt>cron</tt> command; "
  16. 'see <a href="https://crontab.guru/">crontab.guru</a> for a hepl with cron format',
  17. )
  18. exclude = TextAreaField(
  19. "cron-like format; any matching time will be excluded",
  20. description="Another cron-like thing to _exclude_ events",
  21. )
  22. submit = SubmitField("Submit")
  23. def populate_from_timespec(self, timespec):
  24. if "nick" in timespec:
  25. self.nick.data = timespec["nick"]
  26. if "cron_format" in timespec:
  27. self.cron_format.data = timespec["cron_format"]
  28. if "exclude" in timespec:
  29. if type(timespec["exclude"]) is str:
  30. self.exclude.data = timespec["exclude"]
  31. else:
  32. self.exclude.data = "\n".join(timespec["exclude"])
  33. def validate_cron_format(self, field):
  34. if not croniter.is_valid(field.data):
  35. raise ValidationError("formato di cron non valido")
  36. def validate_exclude(self, field):
  37. for line in field.data.split("\n"):
  38. if line.strip() and not croniter.is_valid(line):
  39. raise ValidationError("formato di exclude non valido: %s" % line)
  40. def cronalarm_receive(form):
  41. return {
  42. "kind": "cron",
  43. "nick": form.nick.data,
  44. "cron_format": form.cron_format.data,
  45. "exclude": [
  46. line.strip() for line in form.exclude.data.split("\n") if line.strip()
  47. ],
  48. }