event.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. from threading import Thread
  2. from apscheduler.schedulers.background import BackgroundScheduler
  3. from apscheduler.triggers.cron import CronTrigger
  4. from kalliope.core.ConfigurationManager import BrainLoader
  5. from kalliope.core.SynapseLauncher import SynapseLauncher
  6. from kalliope.core import Utils
  7. class NoEventPeriod(Exception):
  8. """
  9. An Event must contains a period corresponding to its execution
  10. .. seealso:: Event
  11. """
  12. pass
  13. class Event(Thread):
  14. def __init__(self):
  15. super(Event, self).__init__()
  16. Utils.print_info('Starting event manager')
  17. self.scheduler = BackgroundScheduler()
  18. self.brain = BrainLoader().get_brain()
  19. self.synapses = self.brain.synapses
  20. self.load_events()
  21. def run(self):
  22. self.scheduler.start()
  23. def load_events(self):
  24. """
  25. For each received synapse that have an event as signal, we add a new job scheduled
  26. to launch the synapse
  27. :return:
  28. """
  29. for synapse in self.synapses:
  30. for signal in synapse.signals:
  31. # if the signal is an event we add it to the task list
  32. if signal.name == "event":
  33. if self.check_event_dict(signal.parameters):
  34. my_cron = CronTrigger(year=self.get_parameter_from_dict("year", signal.parameters),
  35. month=self.get_parameter_from_dict("month", signal.parameters),
  36. day=self.get_parameter_from_dict("day", signal.parameters),
  37. week=self.get_parameter_from_dict("week", signal.parameters),
  38. day_of_week=self.get_parameter_from_dict("day_of_week", signal.parameters),
  39. hour=self.get_parameter_from_dict("hour", signal.parameters),
  40. minute=self.get_parameter_from_dict("minute", signal.parameters),
  41. second=self.get_parameter_from_dict("second", signal.parameters),)
  42. Utils.print_info("Add synapse name \"%s\" to the scheduler: %s" % (synapse.name, my_cron))
  43. self.scheduler.add_job(self.run_synapse_by_name, my_cron, args=[synapse.name])
  44. @staticmethod
  45. def run_synapse_by_name(synapse_name):
  46. """
  47. This method will run the synapse
  48. """
  49. Utils.print_info("Event triggered, running synapse: %s" % synapse_name)
  50. # get a brain
  51. brain_loader = BrainLoader()
  52. brain = brain_loader.brain
  53. SynapseLauncher.start_synapse_by_name(synapse_name, brain=brain)
  54. @staticmethod
  55. def get_parameter_from_dict(parameter_name, parameters_dict):
  56. """
  57. return the value in the dict parameters_dict frm the key parameter_name
  58. return None if the key does not exist
  59. :param parameter_name: name of the key
  60. :param parameters_dict: dict
  61. :return: string
  62. """
  63. try:
  64. return parameters_dict[parameter_name]
  65. except KeyError:
  66. return None
  67. @staticmethod
  68. def check_event_dict(event_dict):
  69. """
  70. Check received event dictionary of parameter is valid:
  71. :param event_dict: The event Dictionary
  72. :type event_dict: Dict
  73. :return: True if event are ok
  74. :rtype: Boolean
  75. """
  76. def get_key(key_name):
  77. try:
  78. return event_dict[key_name]
  79. except KeyError:
  80. return None
  81. if event_dict is None or event_dict == "":
  82. raise NoEventPeriod("Event must contain at least one of those elements: "
  83. "year, month, day, week, day_of_week, hour, minute, second")
  84. # check content as at least on key
  85. year = get_key("year")
  86. month = get_key("month")
  87. day = get_key("day")
  88. week = get_key("week")
  89. day_of_week = get_key("day_of_week")
  90. hour = get_key("hour")
  91. minute = get_key("minute")
  92. second = get_key("second")
  93. list_to_check = [year, month, day, week, day_of_week, hour, minute, second]
  94. number_of_none_object = list_to_check.count(None)
  95. list_size = len(list_to_check)
  96. if number_of_none_object >= list_size:
  97. raise NoEventPeriod("Event must contain at least one of those elements: "
  98. "year, month, day, week, day_of_week, hour, minute, second")
  99. return True