/usr/lib/python2.7/dist-packages/sagenb_export/nbextension/export_handler.py is in python-sagenb-export 3.2-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | import os
import string
from itertools import count
from tornado.web import authenticated
from notebook.base.handlers import IPythonHandler
from sagenb_export.defaults import DOT_SAGE
from sagenb_export.logger import log
from sagenb_export.sagenb_reader import NotebookSageNB
from sagenb_export.ipynb_writer import IpynbWriter
def filename_escape(name):
def escape(ch):
if ch in string.ascii_letters + string.digits:
return ch
else:
return '_'
return ''.join(map(escape, name))
class ExportSageNBHandler(IPythonHandler):
"""
Return a web page that lists the current SageNB worksheets
"""
@property
def dot_sage(self):
return os.path.expanduser(DOT_SAGE)
@authenticated
def post(self):
print('POST', self.request, self.request.body)
ipynb_filename = self.safe_filename()
IpynbWriter(self.notebook()).write(ipynb_filename)
relative_url = '/notebooks/' + ipynb_filename
self.finish(relative_url)
@property
def unique_id(self):
return self.request.body
def notebook(self):
try:
nb = self._notebook
except AttributeError:
nb = self._notebook = NotebookSageNB.find(self.dot_sage, self.unique_id)
return nb
def safe_filename(self):
basename = filename_escape(self.notebook().name)
filename = '{0}.ipynb'.format(basename)
if not os.path.exists(filename):
return filename
for i in count(2):
filename = '{0} ({1}).ipynb'.format(basename, i)
if not os.path.exists(filename):
return filename
|