handlers.py
217 lines
| 8.3 KiB
| text/x-python
|
PythonLexer
Brian E. Granger
|
r10642 | """Tornado handlers for the notebooks web service. | ||
Brian E. Granger
|
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 | ||||
MinRK
|
r11644 | from ...base.handlers import IPythonHandler | ||
Brian E. Granger
|
r10641 | |||
#----------------------------------------------------------------------------- | ||||
# Notebook web service handlers | ||||
#----------------------------------------------------------------------------- | ||||
Zachary Sailer
|
r12984 | |||
Brian E. Granger
|
r10641 | class NotebookRootHandler(IPythonHandler): | ||
MinRK
|
r11644 | @web.authenticated | ||
Brian E. Granger
|
r10641 | def get(self): | ||
Zachary Sailer
|
r13036 | """get returns a list of notebooks from the location | ||
where the server was started.""" | ||||
Brian E. Granger
|
r10641 | nbm = self.notebook_manager | ||
Zachary Sailer
|
r13041 | notebooks = nbm.list_notebooks("/") | ||
Zachary Sailer
|
r12984 | self.finish(jsonapi.dumps(notebooks)) | ||
Brian E. Granger
|
r10641 | |||
@web.authenticated | ||||
def post(self): | ||||
Zachary Sailer
|
r13036 | """post creates a notebooks in the directory where the | ||
server was started""" | ||||
Brian E. Granger
|
r10641 | nbm = self.notebook_manager | ||
Zachary Sailer
|
r13044 | self.log.info(nbm.notebook_dir) | ||
Zachary Sailer
|
r13036 | body = self.request.body.strip() | ||
format = self.get_argument('format', default='json') | ||||
name = self.get_argument('name', default=None) | ||||
if body: | ||||
Zachary Sailer
|
r13039 | fname = nbm.save_new_notebook(body, notebook_path='/', name=name, format=format) | ||
Zachary Sailer
|
r13036 | else: | ||
Zachary Sailer
|
r13039 | fname = nbm.new_notebook(notebook_path='/') | ||
Zachary Sailer
|
r13036 | self.set_header('Location', nbm.notebook_dir + fname) | ||
model = nbm.notebook_model(fname) | ||||
Zachary Sailer
|
r13041 | self.set_header('Location', '{0}api/notebooks/{1}'.format(self.base_project_url, fname)) | ||
Zachary Sailer
|
r12984 | self.finish(jsonapi.dumps(model)) | ||
Zachary Sailer
|
r13012 | |||
Brian E. Granger
|
r10641 | class NotebookHandler(IPythonHandler): | ||
Zachary Sailer
|
r13036 | SUPPORTED_METHODS = ('GET', 'PUT', 'PATCH', 'POST','DELETE') | ||
Brian E. Granger
|
r10641 | |||
MinRK
|
r11644 | @web.authenticated | ||
Zachary Sailer
|
r12984 | def get(self, notebook_path): | ||
Zachary Sailer
|
r13036 | """get checks if a notebook is not named, an returns a list of notebooks | ||
in the notebook path given. If a name is given, return | ||||
the notebook representation""" | ||||
Brian E. Granger
|
r10641 | nbm = self.notebook_manager | ||
Zachary Sailer
|
r12984 | name, path = nbm.named_notebook_path(notebook_path) | ||
Brian E. Granger
|
r10641 | |||
Zachary Sailer
|
r13036 | # Check to see if a notebook name was given | ||
if name is None: | ||||
# List notebooks in 'notebook_path' | ||||
Zachary Sailer
|
r12997 | notebooks = nbm.list_notebooks(path) | ||
Zachary Sailer
|
r12984 | self.finish(jsonapi.dumps(notebooks)) | ||
else: | ||||
Zachary Sailer
|
r13036 | # get and return notebook representation | ||
Zachary Sailer
|
r12984 | format = self.get_argument('format', default='json') | ||
Zachary Sailer
|
r13001 | download = self.get_argument('download', default='False') | ||
Zachary Sailer
|
r13041 | model = nbm.notebook_model(name, path) | ||
Zachary Sailer
|
r13000 | last_mod, representation, name = nbm.get_notebook(name, path, format) | ||
Zachary Sailer
|
r13001 | self.set_header('Last-Modified', last_mod) | ||
if download == 'True': | ||||
if format == u'json': | ||||
self.set_header('Content-Type', 'application/json') | ||||
self.set_header('Content-Disposition','attachment; filename="%s.ipynb"' % name) | ||||
self.finish(representation) | ||||
elif format == u'py': | ||||
self.set_header('Content-Type', 'application/x-python') | ||||
self.set_header('Content-Disposition','attachment; filename="%s.py"' % name) | ||||
self.finish(representation) | ||||
else: | ||||
self.finish(jsonapi.dumps(model)) | ||||
Brian E. Granger
|
r10641 | |||
@web.authenticated | ||||
Zachary Sailer
|
r12997 | def patch(self, notebook_path): | ||
Zachary Sailer
|
r13036 | """patch is currently used strictly for notebook renaming. | ||
Changes the notebook name to the name given in data.""" | ||||
Zachary Sailer
|
r12997 | nbm = self.notebook_manager | ||
Paul Ivanov
|
r13029 | name, path = nbm.named_notebook_path(notebook_path) | ||
Zachary Sailer
|
r12997 | data = jsonapi.loads(self.request.body) | ||
Zachary Sailer
|
r13041 | model = nbm.change_notebook(data, name, path) | ||
Zachary Sailer
|
r12997 | self.finish(jsonapi.dumps(model)) | ||
@web.authenticated | ||||
Zachary Sailer
|
r13036 | def post(self,notebook_path): | ||
"""Create a new notebook in the location given by 'notebook_path'.""" | ||||
Brian E. Granger
|
r10641 | nbm = self.notebook_manager | ||
Paul Ivanov
|
r13029 | fname, path = nbm.named_notebook_path(notebook_path) | ||
Zachary Sailer
|
r13036 | body = self.request.body.strip() | ||
format = self.get_argument('format', default='json') | ||||
name = self.get_argument('name', default=None) | ||||
if body: | ||||
fname = nbm.save_new_notebook(body, notebook_path=path, name=name, format=format) | ||||
else: | ||||
fname = nbm.new_notebook(notebook_path=path) | ||||
self.set_header('Location', nbm.notebook_dir + path + fname) | ||||
model = nbm.notebook_model(fname, path) | ||||
self.finish(jsonapi.dumps(model)) | ||||
@web.authenticated | ||||
def put(self, notebook_path): | ||||
"""saves the notebook in the location given by 'notebook_path'.""" | ||||
nbm = self.notebook_manager | ||||
name, path = nbm.named_notebook_path(notebook_path) | ||||
format = self.get_argument('format', default='json') | ||||
nbm.save_notebook(self.request.body, notebook_path=path, name=name, format=format) | ||||
model = nbm.notebook_model(name, path) | ||||
self.set_status(204) | ||||
self.finish(jsonapi.dumps(model)) | ||||
Brian E. Granger
|
r10641 | |||
@web.authenticated | ||||
Zachary Sailer
|
r12984 | def delete(self, notebook_path): | ||
Zachary Sailer
|
r13036 | """delete rmoves the notebook in the given notebook path""" | ||
Zachary Sailer
|
r12984 | nbm = self.notebook_manager | ||
name, path = nbm.named_notebook_path(notebook_path) | ||||
Zachary Sailer
|
r12991 | nbm.delete_notebook(name, path) | ||
Brian E. Granger
|
r10641 | self.set_status(204) | ||
self.finish() | ||||
class NotebookCheckpointsHandler(IPythonHandler): | ||||
SUPPORTED_METHODS = ('GET', 'POST') | ||||
@web.authenticated | ||||
Zachary Sailer
|
r12984 | def get(self, notebook_path): | ||
Brian E. Granger
|
r10641 | """get lists checkpoints for a notebook""" | ||
nbm = self.notebook_manager | ||||
Zachary Sailer
|
r12984 | name, path = nbm.named_notebook_path(notebook_path) | ||
checkpoints = nbm.list_checkpoints(name, path) | ||||
Brian E. Granger
|
r10641 | data = jsonapi.dumps(checkpoints, default=date_default) | ||
self.finish(data) | ||||
@web.authenticated | ||||
Zachary Sailer
|
r12984 | def post(self, notebook_path): | ||
Brian E. Granger
|
r10641 | """post creates a new checkpoint""" | ||
nbm = self.notebook_manager | ||||
Zachary Sailer
|
r12984 | name, path = nbm.named_notebook_path(notebook_path) | ||
checkpoint = nbm.create_checkpoint(name, path) | ||||
Brian E. Granger
|
r10641 | data = jsonapi.dumps(checkpoint, default=date_default) | ||
Zachary Sailer
|
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'] | ||||
)) | ||||
Brian E. Granger
|
r10641 | self.finish(data) | ||
class ModifyNotebookCheckpointsHandler(IPythonHandler): | ||||
SUPPORTED_METHODS = ('POST', 'DELETE') | ||||
@web.authenticated | ||||
Zachary Sailer
|
r12984 | def post(self, notebook_path, checkpoint_id): | ||
Brian E. Granger
|
r10641 | """post restores a notebook from a checkpoint""" | ||
nbm = self.notebook_manager | ||||
Zachary Sailer
|
r12984 | name, path = nbm.named_notebook_path(notebook_path) | ||
nbm.restore_checkpoint(name, checkpoint_id, path) | ||||
Brian E. Granger
|
r10641 | self.set_status(204) | ||
self.finish() | ||||
@web.authenticated | ||||
Zachary Sailer
|
r12984 | def delete(self, notebook_path, checkpoint_id): | ||
Brian E. Granger
|
r10641 | """delete clears a checkpoint for a given notebook""" | ||
nbm = self.notebook_manager | ||||
Zachary Sailer
|
r12984 | name, path = nbm.named_notebook_path(notebook_path) | ||
nbm.delete_checkpoint(name, checkpoint_id, path) | ||||
Brian E. Granger
|
r10641 | self.set_status(204) | ||
self.finish() | ||||
Zachary Sailer
|
r12984 | |||
Brian E. Granger
|
r10647 | #----------------------------------------------------------------------------- | ||
# URL to handler mappings | ||||
#----------------------------------------------------------------------------- | ||||
Zachary Sailer
|
r12984 | _notebook_path_regex = r"(?P<notebook_path>.+)" | ||
Brian E. Granger
|
r10647 | _checkpoint_id_regex = r"(?P<checkpoint_id>[\w-]+)" | ||
default_handlers = [ | ||||
Zachary Sailer
|
r12984 | (r"api/notebooks/%s/checkpoints" % _notebook_path_regex, NotebookCheckpointsHandler), | ||
(r"api/notebooks/%s/checkpoints/%s" % (_notebook_path_regex, _checkpoint_id_regex), | ||||
ModifyNotebookCheckpointsHandler), | ||||
Zachary Sailer
|
r13033 | (r"api/notebooks/%s/" % _notebook_path_regex, NotebookHandler), | ||
Zachary Sailer
|
r12984 | (r"api/notebooks/%s" % _notebook_path_regex, NotebookHandler), | ||
Zachary Sailer
|
r13041 | (r"api/notebooks/", NotebookRootHandler), | ||
Zachary Sailer
|
r12984 | (r"api/notebooks", NotebookRootHandler), | ||
Brian E. Granger
|
r10647 | ] | ||
Brian E. Granger
|
r10641 | |||