update.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. from __future__ import absolute_import
  2. import logging
  3. from functools import partial
  4. from pprint import pformat
  5. from tornado import websocket
  6. from tornado.ioloop import PeriodicCallback
  7. from . import settings
  8. from ..models import WorkersModel
  9. logger = logging.getLogger(__name__)
  10. class UpdateWorkers(websocket.WebSocketHandler):
  11. listeners = []
  12. periodic_callback = None
  13. workers = None
  14. def open(self):
  15. if not settings.AUTO_REFRESH:
  16. self.write_message({})
  17. return
  18. app = self.application
  19. if not self.listeners:
  20. logger.debug('Starting a timer for dashboard updates')
  21. periodic_callback = self.periodic_callback or PeriodicCallback(
  22. partial(UpdateWorkers.on_update_time, app),
  23. settings.PAGE_UPDATE_INTERVAL)
  24. if not periodic_callback._running:
  25. periodic_callback.start()
  26. self.listeners.append(self)
  27. def on_message(self, message):
  28. pass
  29. def on_close(self):
  30. if self in self.listeners:
  31. self.listeners.remove(self)
  32. if not self.listeners and self.periodic_callback:
  33. logger.debug('Stopping dashboard updates timer')
  34. self.periodic_callback.stop()
  35. @classmethod
  36. def on_update_time(cls, app):
  37. workers = WorkersModel.get_latest(app)
  38. changes = workers.workers
  39. if workers != cls.workers and changes:
  40. logger.debug('Sending dashboard updates: %s', pformat(changes))
  41. for l in cls.listeners:
  42. l.write_message(changes)
  43. cls.workers = workers