59 lines
2.0 KiB
Python
59 lines
2.0 KiB
Python
|
# Copyright (c) Jupyter Development Team.
|
||
|
# Distributed under the terms of the Modified BSD License.
|
||
|
import os
|
||
|
import io
|
||
|
import zipfile
|
||
|
import notebook.bundler.tools as tools
|
||
|
|
||
|
def _jupyter_bundlerextension_paths():
|
||
|
"""Metadata for notebook bundlerextension"""
|
||
|
return [{
|
||
|
'name': 'notebook_zip_download',
|
||
|
'label': 'IPython Notebook bundle (.zip)',
|
||
|
'module_name': 'notebook.bundler.zip_bundler',
|
||
|
'group': 'download'
|
||
|
}]
|
||
|
|
||
|
def bundle(handler, model):
|
||
|
"""Create a zip file containing the original notebook and files referenced
|
||
|
from it. Retain the referenced files in paths relative to the notebook.
|
||
|
Return the zip as a file download.
|
||
|
|
||
|
Assumes the notebook and other files are all on local disk.
|
||
|
|
||
|
Parameters
|
||
|
----------
|
||
|
handler : tornado.web.RequestHandler
|
||
|
Handler that serviced the bundle request
|
||
|
model : dict
|
||
|
Notebook model from the configured ContentManager
|
||
|
"""
|
||
|
abs_nb_path = os.path.join(handler.settings['contents_manager'].root_dir,
|
||
|
model['path'])
|
||
|
notebook_filename = model['name']
|
||
|
notebook_name = os.path.splitext(notebook_filename)[0]
|
||
|
|
||
|
# Headers
|
||
|
zip_filename = os.path.splitext(notebook_name)[0] + '.zip'
|
||
|
handler.set_attachment_header(zip_filename)
|
||
|
handler.set_header('Content-Type', 'application/zip')
|
||
|
|
||
|
# Get associated files
|
||
|
ref_filenames = tools.get_file_references(abs_nb_path, 4)
|
||
|
|
||
|
# Prepare the zip file
|
||
|
zip_buffer = io.BytesIO()
|
||
|
zipf = zipfile.ZipFile(zip_buffer, mode='w', compression=zipfile.ZIP_DEFLATED)
|
||
|
zipf.write(abs_nb_path, notebook_filename)
|
||
|
|
||
|
notebook_dir = os.path.dirname(abs_nb_path)
|
||
|
for nb_relative_filename in ref_filenames:
|
||
|
# Build absolute path to file on disk
|
||
|
abs_fn = os.path.join(notebook_dir, nb_relative_filename)
|
||
|
# Store file under path relative to notebook
|
||
|
zipf.write(abs_fn, nb_relative_filename)
|
||
|
|
||
|
zipf.close()
|
||
|
|
||
|
# Return the buffer value as the response
|
||
|
handler.finish(zip_buffer.getvalue())
|