You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			65 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
"""Tornado handlers for plugin management."""
 | 
						|
 | 
						|
# Copyright (c) Jupyter Development Team.
 | 
						|
# Distributed under the terms of the Modified BSD License.
 | 
						|
 | 
						|
import dataclasses
 | 
						|
import json
 | 
						|
 | 
						|
from jupyter_server.base.handlers import APIHandler
 | 
						|
from tornado import web
 | 
						|
 | 
						|
from jupyterlab.extensions.manager import PluginManager
 | 
						|
 | 
						|
 | 
						|
class PluginHandler(APIHandler):
 | 
						|
    def initialize(self, manager: PluginManager):
 | 
						|
        super().initialize()
 | 
						|
        self.manager = manager
 | 
						|
 | 
						|
    @web.authenticated
 | 
						|
    async def get(self):
 | 
						|
        """GET query returns info on plugins locks"""
 | 
						|
        # note: this is informative only - validation is server-side
 | 
						|
        locks = await self.manager.plugin_locks()
 | 
						|
        self.set_status(200)
 | 
						|
        self.finish(json.dumps(locks))
 | 
						|
 | 
						|
    @web.authenticated
 | 
						|
    async def post(self):
 | 
						|
        """POST query performs an action on a specific plugin
 | 
						|
 | 
						|
        Body arguments:
 | 
						|
            {
 | 
						|
                "cmd": Action to perform - ["enable", "disable"]
 | 
						|
                "plugin_name": Plugin name
 | 
						|
            }
 | 
						|
        """
 | 
						|
        data = self.get_json_body()
 | 
						|
        cmd = data["cmd"]
 | 
						|
        name = data["plugin_name"]
 | 
						|
        if cmd not in ("enable", "disable") or not name:
 | 
						|
            raise web.HTTPError(
 | 
						|
                422,
 | 
						|
                f"Could not process instruction {cmd!r} with plugin name {name!r}",
 | 
						|
            )
 | 
						|
 | 
						|
        ret_value = None
 | 
						|
        try:
 | 
						|
            if cmd == "enable":
 | 
						|
                ret_value = await self.manager.enable(name)
 | 
						|
            elif cmd == "disable":
 | 
						|
                ret_value = await self.manager.disable(name)
 | 
						|
        except Exception as e:
 | 
						|
            raise web.HTTPError(500, str(e)) from e
 | 
						|
 | 
						|
        if ret_value.status == "error":
 | 
						|
            self.set_status(500)
 | 
						|
        else:
 | 
						|
            self.set_status(201)
 | 
						|
        self.finish(json.dumps(dataclasses.asdict(ret_value)))
 | 
						|
 | 
						|
 | 
						|
# The path for lab plugins handler.
 | 
						|
plugins_handler_path = r"/lab/api/plugins"
 |