plugin_manager_handler.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. """Tornado handlers for plugin management."""
  2. # Copyright (c) Jupyter Development Team.
  3. # Distributed under the terms of the Modified BSD License.
  4. import dataclasses
  5. import json
  6. from jupyter_server.base.handlers import APIHandler
  7. from tornado import web
  8. from jupyterlab.extensions.manager import PluginManager
  9. class PluginHandler(APIHandler):
  10. def initialize(self, manager: PluginManager):
  11. super().initialize()
  12. self.manager = manager
  13. @web.authenticated
  14. async def get(self):
  15. """GET query returns info on plugins locks"""
  16. # note: this is informative only - validation is server-side
  17. locks = await self.manager.plugin_locks()
  18. self.set_status(200)
  19. self.finish(json.dumps(locks))
  20. @web.authenticated
  21. async def post(self):
  22. """POST query performs an action on a specific plugin
  23. Body arguments:
  24. {
  25. "cmd": Action to perform - ["enable", "disable"]
  26. "plugin_name": Plugin name
  27. }
  28. """
  29. data = self.get_json_body()
  30. cmd = data["cmd"]
  31. name = data["plugin_name"]
  32. if cmd not in ("enable", "disable") or not name:
  33. raise web.HTTPError(
  34. 422,
  35. f"Could not process instruction {cmd!r} with plugin name {name!r}",
  36. )
  37. ret_value = None
  38. try:
  39. if cmd == "enable":
  40. ret_value = await self.manager.enable(name)
  41. elif cmd == "disable":
  42. ret_value = await self.manager.disable(name)
  43. except Exception as e:
  44. raise web.HTTPError(500, str(e)) from e
  45. if ret_value.status == "error":
  46. self.set_status(500)
  47. else:
  48. self.set_status(201)
  49. self.finish(json.dumps(dataclasses.asdict(ret_value)))
  50. # The path for lab plugins handler.
  51. plugins_handler_path = r"/lab/api/plugins"