Show More
handlers.py
198 lines
| 7.2 KiB
| text/x-python
|
PythonLexer
|
r10642 | """Tornado handlers for the notebooks web service. | ||
|
r10641 | |||
Authors: | ||||
* Brian Granger | ||||
""" | ||||
#----------------------------------------------------------------------------- | ||||
# Copyright (C) 2008-2011 The IPython Development Team | ||||
# | ||||
# Distributed under the terms of the BSD License. The full license is in | ||||
# the file COPYING, distributed as part of this software. | ||||
#----------------------------------------------------------------------------- | ||||
#----------------------------------------------------------------------------- | ||||
# Imports | ||||
#----------------------------------------------------------------------------- | ||||
from tornado import web | ||||
from zmq.utils import jsonapi | ||||
from IPython.utils.jsonutil import date_default | ||||
|
r11644 | from ...base.handlers import IPythonHandler | ||
|
r10641 | |||
#----------------------------------------------------------------------------- | ||||
# Notebook web service handlers | ||||
#----------------------------------------------------------------------------- | ||||
|
r12984 | |||
|
r10641 | class NotebookRootHandler(IPythonHandler): | ||
|
r11644 | @web.authenticated | ||
|
r10641 | def get(self): | ||
nbm = self.notebook_manager | ||||
km = self.kernel_manager | ||||
|
r12984 | notebook_names = nbm.list_notebooks("") | ||
notebooks = [] | ||||
for name in notebook_names: | ||||
model = nbm.notebook_model(name) | ||||
notebooks.append(model) | ||||
self.finish(jsonapi.dumps(notebooks)) | ||||
|
r10641 | |||
@web.authenticated | ||||
def post(self): | ||||
nbm = self.notebook_manager | ||||
|
r12984 | notebook_name = nbm.new_notebook() | ||
model = nbm.notebook_model(notebook_name) | ||||
self.set_header('Location', '{0}api/notebooks/{1}'.format(self.base_project_url, notebook_name)) | ||||
self.finish(jsonapi.dumps(model)) | ||||
class NotebookRootRedirect(IPythonHandler): | ||||
@authenticate_unless_readonly | ||||
def get(self): | ||||
self.redirect("/api/notebooks") | ||||
|
r10641 | |||
class NotebookHandler(IPythonHandler): | ||||
SUPPORTED_METHODS = ('GET', 'PUT', 'DELETE') | ||||
|
r11644 | @web.authenticated | ||
|
r12984 | def get(self, notebook_path): | ||
|
r10641 | nbm = self.notebook_manager | ||
|
r12984 | name, path = nbm.named_notebook_path(notebook_path) | ||
|
r10641 | |||
|
r12984 | if name == None: | ||
notebook_names = nbm.list_notebooks(path) | ||||
notebooks = [] | ||||
for name in notebook_names: | ||||
model = nbm.notebook_model(name,path) | ||||
notebooks.append(model) | ||||
self.finish(jsonapi.dumps(notebooks)) | ||||
else: | ||||
format = self.get_argument('format', default='json') | ||||
model = nbm.notebook_model(name,path) | ||||
data, name = nbm.get_notebook(model, format) | ||||
if format == u'json': | ||||
self.set_header('Content-Type', 'application/json') | ||||
self.set_header('Content-Disposition','attachment; filename="%s.ipynb"' % name) | ||||
elif format == u'py': | ||||
self.set_header('Content-Type', 'application/x-python') | ||||
self.set_header('Content-Disposition','attachment; filename="%s.py"' % name) | ||||
#self.set_header('Last-Modified', last_mod) | ||||
self.finish(jsonapi.dumps(model)) | ||||
|
r10641 | |||
@web.authenticated | ||||
|
r12984 | def put(self, notebook_path): | ||
|
r10641 | nbm = self.notebook_manager | ||
|
r12984 | notebook_name, notebook_path = nbm.named_notebook_path(notebook_path) | ||
if notebook_name == None: | ||||
body = self.request.body.strip() | ||||
format = self.get_argument('format', default='json') | ||||
name = self.get_argument('name', default=None) | ||||
if body: | ||||
notebook_name = nbm.save_new_notebook(body, notebook_path=notebook_path, name=name, format=format) | ||||
else: | ||||
notebook_name = nbm.new_notebook(notebook_path=notebook_path) | ||||
if path==None: | ||||
self.set_header('Location', nbm.notebook_dir + '/'+ notebook_name) | ||||
else: | ||||
self.set_header('Location', nbm.notebook_dir + '/'+ notebook_path + '/' + notebook_name) | ||||
model = nbm.notebook_model(notebook_name, notebook_path) | ||||
self.finish(jsonapi.dumps(model)) | ||||
else: | ||||
format = self.get_argument('format', default='json') | ||||
name = self.get_argument('name', default=None) | ||||
nbm.save_notebook(self.request.body, notebook_path=notebook_path, name=name, format=format) | ||||
model = nbm.notebook_model(notebook_name, notebook_path) | ||||
self.set_status(204) | ||||
self.finish(jsonapi.dumps(model)) | ||||
|
r10641 | |||
@web.authenticated | ||||
|
r12984 | def delete(self, notebook_path): | ||
nbm = self.notebook_manager | ||||
name, path = nbm.named_notebook_path(notebook_path) | ||||
self.notebook_manager.delete_notebook(name, path) | ||||
|
r10641 | self.set_status(204) | ||
self.finish() | ||||
class NotebookCheckpointsHandler(IPythonHandler): | ||||
SUPPORTED_METHODS = ('GET', 'POST') | ||||
@web.authenticated | ||||
|
r12984 | def get(self, notebook_path): | ||
|
r10641 | """get lists checkpoints for a notebook""" | ||
nbm = self.notebook_manager | ||||
|
r12984 | name, path = nbm.named_notebook_path(notebook_path) | ||
checkpoints = nbm.list_checkpoints(name, path) | ||||
|
r10641 | data = jsonapi.dumps(checkpoints, default=date_default) | ||
self.finish(data) | ||||
@web.authenticated | ||||
|
r12984 | def post(self, notebook_path): | ||
|
r10641 | """post creates a new checkpoint""" | ||
nbm = self.notebook_manager | ||||
|
r12984 | name, path = nbm.named_notebook_path(notebook_path) | ||
checkpoint = nbm.create_checkpoint(name, path) | ||||
|
r10641 | data = jsonapi.dumps(checkpoint, default=date_default) | ||
|
r12984 | if path == None: | ||
self.set_header('Location', '{0}notebooks/{1}/checkpoints/{2}'.format( | ||||
self.base_project_url, name, checkpoint['checkpoint_id'] | ||||
)) | ||||
else: | ||||
self.set_header('Location', '{0}notebooks/{1}/{2}/checkpoints/{3}'.format( | ||||
self.base_project_url, path, name, checkpoint['checkpoint_id'] | ||||
)) | ||||
|
r10641 | self.finish(data) | ||
class ModifyNotebookCheckpointsHandler(IPythonHandler): | ||||
SUPPORTED_METHODS = ('POST', 'DELETE') | ||||
@web.authenticated | ||||
|
r12984 | def post(self, notebook_path, checkpoint_id): | ||
|
r10641 | """post restores a notebook from a checkpoint""" | ||
nbm = self.notebook_manager | ||||
|
r12984 | name, path = nbm.named_notebook_path(notebook_path) | ||
nbm.restore_checkpoint(name, checkpoint_id, path) | ||||
|
r10641 | self.set_status(204) | ||
self.finish() | ||||
@web.authenticated | ||||
|
r12984 | def delete(self, notebook_path, checkpoint_id): | ||
|
r10641 | """delete clears a checkpoint for a given notebook""" | ||
nbm = self.notebook_manager | ||||
|
r12984 | name, path = nbm.named_notebook_path(notebook_path) | ||
nbm.delete_checkpoint(name, checkpoint_id, path) | ||||
|
r10641 | self.set_status(204) | ||
self.finish() | ||||
|
r12984 | |||
|
r10647 | #----------------------------------------------------------------------------- | ||
# URL to handler mappings | ||||
#----------------------------------------------------------------------------- | ||||
|
r12984 | _notebook_path_regex = r"(?P<notebook_path>.+)" | ||
|
r10647 | _checkpoint_id_regex = r"(?P<checkpoint_id>[\w-]+)" | ||
default_handlers = [ | ||||
|
r12984 | (r"api/notebooks/%s/checkpoints" % _notebook_path_regex, NotebookCheckpointsHandler), | ||
(r"api/notebooks/%s/checkpoints/%s" % (_notebook_path_regex, _checkpoint_id_regex), | ||||
ModifyNotebookCheckpointsHandler), | ||||
(r"api/notebooks/%s" % _notebook_path_regex, NotebookHandler), | ||||
(r"api/notebooks/", NotebookRootRedirect), | ||||
(r"api/notebooks", NotebookRootHandler), | ||||
|
r10647 | ] | ||
|
r10641 | |||