diff --git a/IPython/html/services/notebooks/handlers.py b/IPython/html/services/notebooks/handlers.py
index 351c053..a2cdb06 100644
--- a/IPython/html/services/notebooks/handlers.py
+++ b/IPython/html/services/notebooks/handlers.py
@@ -62,10 +62,22 @@ class NotebookHandler(IPythonHandler):
# List notebooks in 'path'
notebooks = nbm.list_notebooks(path)
self.finish(json.dumps(notebooks, default=date_default))
+ return
+ # get and return notebook representation
+ model = nbm.get_notebook_model(name, path)
+ self.set_header(u'Last-Modified', model[u'last_modified'])
+
+ if self.get_argument('download', default='False') == 'True':
+ format = self.get_argument('format', default='json')
+ if format == u'json':
+ self.set_header('Content-Type', 'application/json')
+ raise web.HTTPError(400, "Unrecognized format: %s" % ext)
+
+ self.set_header('Content-Disposition',
+ 'attachment; filename="%s"' % name
+ )
+ self.finish(json.dumps(model['content'], default=date_default))
else:
- # get and return notebook representation
- model = nbm.get_notebook_model(name, path)
- self.set_header(u'Last-Modified', model[u'last_modified'])
self.finish(json.dumps(model, default=date_default))
@web.authenticated
diff --git a/IPython/html/static/notebook/js/menubar.js b/IPython/html/static/notebook/js/menubar.js
index 39f0f79..e4c8251 100644
--- a/IPython/html/static/notebook/js/menubar.js
+++ b/IPython/html/static/notebook/js/menubar.js
@@ -18,6 +18,8 @@
var IPython = (function (IPython) {
"use strict";
+
+ var utils = IPython.utils;
/**
* A MenuBar Class to generate the menubar of IPython notebook
@@ -83,14 +85,29 @@ var IPython = (function (IPython) {
});
this.element.find('#download_ipynb').click(function () {
var notebook_name = IPython.notebook.get_notebook_name();
- var url = that.baseProjectUrl() + 'api/notebooks' + that.notebookPath() +
- notebook_name + '?format=json'+ '&download=True';
+ if (IPython.notebook.dirty) {
+ IPython.notebook.save_notebook({async : false});
+ }
+
+ var url = utils.url_path_join(
+ that.baseProjectUrl(),
+ 'api/notebooks',
+ that.notebookPath(),
+ notebook_name + '.ipynb?format=json&download=True'
+ );
window.location.assign(url);
});
this.element.find('#download_py').click(function () {
var notebook_name = IPython.notebook.get_notebook_name();
- var url = that.baseProjectUrl() + 'api/notebooks' + that.notebookPath() +
- notebook_name + '?format=py' + '&download=True';
+ if (IPython.notebook.dirty) {
+ IPython.notebook.save_notebook({async : false});
+ }
+ var url = utils.url_path_join(
+ that.baseProjectUrl(),
+ 'api/notebooks',
+ that.notebookPath(),
+ notebook_name + '.ipynb?format=py&download=True'
+ );
window.location.assign(url);
});
this.element.find('#rename_notebook').click(function () {
diff --git a/IPython/html/static/notebook/js/notebook.js b/IPython/html/static/notebook/js/notebook.js
index 9c3055d..c7d1922 100644
--- a/IPython/html/static/notebook/js/notebook.js
+++ b/IPython/html/static/notebook/js/notebook.js
@@ -1660,7 +1660,7 @@ var IPython = (function (IPython) {
*
* @method save_notebook
*/
- Notebook.prototype.save_notebook = function () {
+ Notebook.prototype.save_notebook = function (extra_settings) {
// Create a JSON model to be sent to the server.
var model = {};
model.name = this.notebook_name;
@@ -1680,6 +1680,11 @@ var IPython = (function (IPython) {
success : $.proxy(this.save_notebook_success, this, start),
error : $.proxy(this.save_notebook_error, this)
};
+ if (extra_settings) {
+ for (var key in extra_settings) {
+ settings[key] = extra_settings[key];
+ }
+ }
$([IPython.events]).trigger('notebook_saving.Notebook');
var url = utils.url_path_join(
this.baseProjectUrl(),