6
0

NotificationManager.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. import warnings
  2. from functools import partial
  3. from socketio import Server
  4. from typing import Callable
  5. from pycs import app
  6. from pycs.database.File import File
  7. from pycs.database.Label import Label
  8. from pycs.database.Model import Model
  9. from pycs.database.Project import Project
  10. from pycs.database.Result import Result
  11. from pycs.frontend.util.JSONEncoder import JSONEncoder
  12. from pycs.jobs.Job import Job
  13. from pycs.util import Singleton
  14. class NotificationManager(Singleton):
  15. """
  16. send events via a socket.io connection
  17. """
  18. def __repr__(self) -> str:
  19. return f"<{self.__class__.__name__} 0x{id(self):x}>"
  20. def setup(self, sio: Server):
  21. self.sio = sio
  22. def init(self):
  23. self.sio = None
  24. self.json = JSONEncoder()
  25. def __call__(self, name, obj_id, cls=None):
  26. if self.sio is None:
  27. warnings.warn("NotificationManager was called before a setup was performed!")
  28. return
  29. if cls is not None:
  30. assert isinstance(obj_id, int), \
  31. f"{cls.__name__} ID must be an integer, but was {type(obj_id)} ({obj_id=})!"
  32. obj = cls.query.get(obj_id)
  33. else:
  34. obj = obj_id
  35. assert obj is not None, "Object was unexpectedly None!"
  36. app.logger.debug(f"{name}: {obj}")
  37. enc = self.json.default(obj)
  38. self.sio.emit(name, enc)
  39. def _new_signal(self, signal_name, suffix, *args, **kwargs):
  40. return partial(self, f'{signal_name}-{suffix}', *args, **kwargs)
  41. def create(self, suffix, *args, **kwargs) -> Callable:
  42. return self._new_signal('create', suffix, *args, **kwargs)
  43. def edit(self, suffix, *args, **kwargs) -> Callable:
  44. return self._new_signal('edit', suffix, *args, **kwargs)
  45. def remove(self, suffix, *args, **kwargs) -> Callable:
  46. return self._new_signal('remove', suffix, *args, **kwargs)
  47. @classmethod
  48. def removed(kls, suffix, *args, **kwargs):
  49. return kls().remove(suffix)(*args, **kwargs)
  50. @classmethod
  51. def edited(kls, suffix, *args, **kwargs):
  52. return kls().edit(suffix)(*args, **kwargs)
  53. @classmethod
  54. def created(kls, suffix, *args, **kwargs):
  55. return kls().create(suffix)(*args, **kwargs)
  56. # def create_job(self, created_job: Job):
  57. # """
  58. # fire create-job event
  59. # :param created_job:
  60. # :return:
  61. # """
  62. # self.__emit('create-job', created_job)
  63. # def edit_job(self, edited_job: Job):
  64. # """
  65. # fire edit-job event
  66. # :param edited_job:
  67. # :return:
  68. # """
  69. # self.__emit('edit-job', edited_job)
  70. # def remove_job(self, removed_job: Job):
  71. # """
  72. # fire remove-job event
  73. # :param removed_job:
  74. # :return:
  75. # """
  76. # self.__emit('remove-job', removed_job)
  77. # def create_model(self, created_model_id: int):
  78. # """
  79. # fire create-model event
  80. # :param created_model:
  81. # :return:
  82. # """
  83. # self.__emit('create-model', created_model_id, Model)
  84. # def remove_model(self, model_serialized: dict):
  85. # """
  86. # fire remove-model event
  87. # :param removed_model:
  88. # :return:
  89. # """
  90. # self.__emit('remove-model', model_serialized)
  91. # def create_project(self, created_project_id: int):
  92. # """
  93. # fire create-project event
  94. # :param created_project:
  95. # :return:
  96. # """
  97. # self.__emit('create-project', created_project_id, Project)
  98. # def remove_project(self, project_serialized: dict):
  99. # """
  100. # fire remove-project event
  101. # :param removed_project:
  102. # :return:
  103. # """
  104. # self.__emit('remove-project', project_serialized)
  105. # def edit_project(self, edited_project_id: int):
  106. # """
  107. # fire edit-project event
  108. # :param edited_project:
  109. # :return:
  110. # """
  111. # self.__emit('edit-project', edited_project_id, Project)
  112. # def create_label(self, created_label_id: int):
  113. # """
  114. # fire create-label event
  115. # :param created_label:
  116. # :return:
  117. # """
  118. # self.__emit('create-label', created_label_id, Label)
  119. # def edit_label(self, edited_label_id: int):
  120. # """
  121. # fire edit-label event
  122. # :param edited_label:
  123. # :return:
  124. # """
  125. # self.__emit('edit-label', edited_label_id, Label)
  126. # def remove_label(self, label_serialized: dict):
  127. # """
  128. # fire remove-label event
  129. # :param removed_label:
  130. # :return:
  131. # """
  132. # self.__emit('remove-label', label_serialized)
  133. # def create_file(self, created_file_id: int):
  134. # """
  135. # fire create-file event
  136. # :param created_file:
  137. # :return:
  138. # """
  139. # self.__emit('create-file', created_file_id, File)
  140. # def edit_file(self, edited_file_id: int):
  141. # """
  142. # fire edit-file event
  143. # :param edited_file:
  144. # :return:
  145. # """
  146. # self.__emit('edit-file', edited_file_id, File)
  147. # def remove_file(self, file_serialized: dict):
  148. # """
  149. # fire remove-file event
  150. # :param removed_file:
  151. # :return:
  152. # """
  153. # self.__emit('remove-file', file_serialized)
  154. # def create_result(self, created_result_id: int):
  155. # """
  156. # fire create-result event
  157. # :param created_result:
  158. # :return:
  159. # """
  160. # self.__emit('create-result', created_result_id, Result)
  161. # def edit_result(self, edited_result_id: int):
  162. # """
  163. # fire edit-result event
  164. # :param edited_result:
  165. # :return:
  166. # """
  167. # self.__emit('edit-result', edited_result_id, Result)
  168. # def remove_result(self, result_serialized: dict):
  169. # """
  170. # fire remove-result event
  171. # :param removed_result:
  172. # :return:
  173. # """
  174. # self.__emit('remove-result', result_serialized)