Merge pull request #6854 from takluyver/post-new-terminal

Create new terminals with POST request to API
This commit is contained in:
Min RK 2014-11-11 14:12:54 -08:00
commit a257e580a0
5 changed files with 40 additions and 18 deletions

View File

@ -163,6 +163,10 @@ class IPythonHandler(AuthenticatedHandler):
def session_manager(self):
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']

View File

@ -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');

View File

@ -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),
]

View File

@ -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?

View File

@ -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():