1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- # 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())
|