From 2ad28dc516114f3232c31fdba7a89b75fea25979 2014-11-11 22:12:54 From: Min RK Date: 2014-11-11 22:12:54 Subject: [PATCH] Merge pull request #6854 from takluyver/post-new-terminal Create new terminals with POST request to API --- diff --git a/IPython/html/base/handlers.py b/IPython/html/base/handlers.py index 2643c2c..5cf6f24 100644 --- a/IPython/html/base/handlers.py +++ b/IPython/html/base/handlers.py @@ -164,6 +164,10 @@ class IPythonHandler(AuthenticatedHandler): return self.settings['session_manager'] @property + def terminal_manager(self): + return self.settings['terminal_manager'] + + @property def kernel_spec_manager(self): return self.settings['kernel_spec_manager'] diff --git a/IPython/html/static/tree/js/terminallist.js b/IPython/html/static/tree/js/terminallist.js index c7ef391..9ccf7c6 100644 --- a/IPython/html/static/tree/js/terminallist.js +++ b/IPython/html/static/tree/js/terminallist.js @@ -39,11 +39,28 @@ define([ $('#new_terminal').click($.proxy(this.new_terminal, this)); }; - TerminalList.prototype.new_terminal = function() { - var url = utils.url_join_encode(this.base_url, 'terminals/new'); - window.open(url, '_blank'); + TerminalList.prototype.new_terminal = function () { + var w = window.open(); + var base_url = this.base_url; + var settings = { + type : "POST", + dataType: "json", + success : function (data, status, xhr) { + var name = data.name; + w.location = utils.url_join_encode(base_url, 'terminals', name); + }, + error : function(jqXHR, status, error){ + w.close(); + utils.log_ajax_error(jqXHR, status, error); + }, + }; + var url = utils.url_join_encode( + this.base_url, + 'api/terminals' + ); + $.ajax(url, settings); }; - + TerminalList.prototype.load_terminals = function() { var that = this; var url = utils.url_join_encode(this.base_url, 'api/terminals'); diff --git a/IPython/html/terminal/__init__.py b/IPython/html/terminal/__init__.py index e4e33a2..d8d9945 100644 --- a/IPython/html/terminal/__init__.py +++ b/IPython/html/terminal/__init__.py @@ -1,18 +1,17 @@ import os from terminado import NamedTermManager from IPython.html.utils import url_path_join as ujoin -from .handlers import TerminalHandler, NewTerminalHandler, TermSocket +from .handlers import TerminalHandler, TermSocket from . import api_handlers def initialize(webapp): shell = os.environ.get('SHELL', 'sh') - webapp.terminal_manager = NamedTermManager(shell_command=[shell]) + terminal_manager = webapp.settings['terminal_manager'] = NamedTermManager(shell_command=[shell]) base_url = webapp.settings['base_url'] handlers = [ - (ujoin(base_url, "/terminals/new"), NewTerminalHandler), (ujoin(base_url, r"/terminals/(\w+)"), TerminalHandler), (ujoin(base_url, r"/terminals/websocket/(\w+)"), TermSocket, - {'term_manager': webapp.terminal_manager}), + {'term_manager': terminal_manager}), (ujoin(base_url, r"/api/terminals"), api_handlers.TerminalRootHandler), (ujoin(base_url, r"/api/terminals/(\w+)"), api_handlers.TerminalHandler), ] diff --git a/IPython/html/terminal/api_handlers.py b/IPython/html/terminal/api_handlers.py index 90fcd22..4c7600c 100644 --- a/IPython/html/terminal/api_handlers.py +++ b/IPython/html/terminal/api_handlers.py @@ -1,22 +1,31 @@ import json from tornado import web from ..base.handlers import IPythonHandler, json_errors +from ..utils import url_path_join class TerminalRootHandler(IPythonHandler): @web.authenticated @json_errors def get(self): - tm = self.application.terminal_manager + tm = self.terminal_manager terms = [{'name': name} for name in tm.terminals] self.finish(json.dumps(terms)) + @web.authenticated + @json_errors + def post(self): + """POST /terminals creates a new terminal and redirects to it""" + name, _ = self.terminal_manager.new_named_terminal() + self.finish(json.dumps({'name': name})) + + class TerminalHandler(IPythonHandler): SUPPORTED_METHODS = ('GET', 'DELETE') @web.authenticated @json_errors def get(self, name): - tm = self.application.terminal_manager + tm = self.terminal_manager if name in tm.terminals: self.finish(json.dumps({'name': name})) else: @@ -25,7 +34,7 @@ class TerminalHandler(IPythonHandler): @web.authenticated @json_errors def delete(self, name): - tm = self.application.terminal_manager + tm = self.terminal_manager if name in tm.terminals: tm.kill(name) # XXX: Should this wait for terminal to finish before returning? diff --git a/IPython/html/terminal/handlers.py b/IPython/html/terminal/handlers.py index 20e0fa7..404cf41 100644 --- a/IPython/html/terminal/handlers.py +++ b/IPython/html/terminal/handlers.py @@ -16,13 +16,6 @@ class TerminalHandler(IPythonHandler): self.write(self.render_template('terminal.html', ws_path="terminals/websocket/%s" % term_name)) -class NewTerminalHandler(IPythonHandler): - """Redirect to a new terminal.""" - @web.authenticated - def get(self): - name, _ = self.application.terminal_manager.new_named_terminal() - self.redirect(name, permanent=False) - class TermSocket(terminado.TermSocket, IPythonHandler): def get(self, *args, **kwargs): if not self.get_current_user():