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