Orion Poplawski 7f9f064
From d729ce7c2063c0de746a7c2ea39697040d0af5bf Mon Sep 17 00:00:00 2001
Orion Poplawski 7f9f064
From: Min RK <benjaminrk@gmail.com>
Orion Poplawski 7f9f064
Date: Mon, 20 Jul 2015 12:10:10 -0700
Orion Poplawski 7f9f064
Subject: [PATCH 1/4] set mime-type on /files/
Orion Poplawski 7f9f064
Orion Poplawski 7f9f064
---
Orion Poplawski 7f9f064
 IPython/html/files/handlers.py | 5 +++++
Orion Poplawski 7f9f064
 1 file changed, 5 insertions(+)
Orion Poplawski 7f9f064
Orion Poplawski 7f9f064
diff --git a/IPython/html/files/handlers.py b/IPython/html/files/handlers.py
Orion Poplawski 7f9f064
index 7727d08..b358d94 100644
Orion Poplawski 7f9f064
--- a/IPython/html/files/handlers.py
Orion Poplawski 7f9f064
+++ b/IPython/html/files/handlers.py
Orion Poplawski 7f9f064
@@ -40,6 +40,11 @@ def get(self, path):
Orion Poplawski 7f9f064
             cur_mime = mimetypes.guess_type(name)[0]
Orion Poplawski 7f9f064
             if cur_mime is not None:
Orion Poplawski 7f9f064
                 self.set_header('Content-Type', cur_mime)
Orion Poplawski 7f9f064
+            else:
Orion Poplawski 7f9f064
+                if model['format'] == 'base64':
Orion Poplawski 7f9f064
+                    self.set_header('Content-Type', 'application/octet-stream')
Orion Poplawski 7f9f064
+                else:
Orion Poplawski 7f9f064
+                    self.set_header('Content-Type', 'text/plain')
Orion Poplawski 7f9f064
         
Orion Poplawski 7f9f064
         if model['format'] == 'base64':
Orion Poplawski 7f9f064
             b64_bytes = model['content'].encode('ascii')
Orion Poplawski 7f9f064
Orion Poplawski 7f9f064
From 50a1366a8fcfb94671c87199515ebc922882f447 Mon Sep 17 00:00:00 2001
Orion Poplawski 7f9f064
From: Min RK <benjaminrk@gmail.com>
Orion Poplawski 7f9f064
Date: Mon, 20 Jul 2015 12:10:25 -0700
Orion Poplawski 7f9f064
Subject: [PATCH 2/4] set model mimetype, even when content=False
Orion Poplawski 7f9f064
Orion Poplawski 7f9f064
---
Orion Poplawski 7f9f064
 IPython/html/services/contents/filemanager.py | 12 +++++++-----
Orion Poplawski 7f9f064
 IPython/html/services/contents/handlers.py    |  3 ---
Orion Poplawski 7f9f064
 2 files changed, 7 insertions(+), 8 deletions(-)
Orion Poplawski 7f9f064
Orion Poplawski 7f9f064
diff --git a/IPython/html/services/contents/filemanager.py b/IPython/html/services/contents/filemanager.py
Orion Poplawski 7f9f064
index 01ce07b..c869c75 100644
Orion Poplawski 7f9f064
--- a/IPython/html/services/contents/filemanager.py
Orion Poplawski 7f9f064
+++ b/IPython/html/services/contents/filemanager.py
Orion Poplawski 7f9f064
@@ -277,18 +277,20 @@ def _file_model(self, path, content=True, format=None):
Orion Poplawski 7f9f064
         model['type'] = 'file'
Orion Poplawski 7f9f064
 
Orion Poplawski 7f9f064
         os_path = self._get_os_path(path)
Orion Poplawski 7f9f064
+        model['mimetype'] = mimetypes.guess_type(os_path)[0]
Orion Poplawski 7f9f064
 
Orion Poplawski 7f9f064
         if content:
Orion Poplawski 7f9f064
             content, format = self._read_file(os_path, format)
Orion Poplawski 7f9f064
-            default_mime = {
Orion Poplawski 7f9f064
-                'text': 'text/plain',
Orion Poplawski 7f9f064
-                'base64': 'application/octet-stream'
Orion Poplawski 7f9f064
-            }[format]
Orion Poplawski 7f9f064
+            if model['mimetype'] is None:
Orion Poplawski 7f9f064
+                default_mime = {
Orion Poplawski 7f9f064
+                    'text': 'text/plain',
Orion Poplawski 7f9f064
+                    'base64': 'application/octet-stream'
Orion Poplawski 7f9f064
+                }[format]
Orion Poplawski 7f9f064
+                model['mimetype'] = default_mime
Orion Poplawski 7f9f064
 
Orion Poplawski 7f9f064
             model.update(
Orion Poplawski 7f9f064
                 content=content,
Orion Poplawski 7f9f064
                 format=format,
Orion Poplawski 7f9f064
-                mimetype=mimetypes.guess_type(os_path)[0] or default_mime,
Orion Poplawski 7f9f064
             )
Orion Poplawski 7f9f064
 
Orion Poplawski 7f9f064
         return model
Orion Poplawski 7f9f064
diff --git a/IPython/html/services/contents/handlers.py b/IPython/html/services/contents/handlers.py
Orion Poplawski 7f9f064
index 5cd849e..d77e70e 100644
Orion Poplawski 7f9f064
--- a/IPython/html/services/contents/handlers.py
Orion Poplawski 7f9f064
+++ b/IPython/html/services/contents/handlers.py
Orion Poplawski 7f9f064
@@ -52,9 +52,6 @@ def validate_model(model, expect_content):
Orion Poplawski 7f9f064
         )
Orion Poplawski 7f9f064
 
Orion Poplawski 7f9f064
     maybe_none_keys = ['content', 'format']
Orion Poplawski 7f9f064
-    if model['type'] == 'file':
Orion Poplawski 7f9f064
-        # mimetype should be populated only for file models
Orion Poplawski 7f9f064
-        maybe_none_keys.append('mimetype')
Orion Poplawski 7f9f064
     if expect_content:
Orion Poplawski 7f9f064
         errors = [key for key in maybe_none_keys if model[key] is None]
Orion Poplawski 7f9f064
         if errors:
Orion Poplawski 7f9f064
Orion Poplawski 7f9f064
From df24d9153b86863ccfa98bf509704d9304143ce1 Mon Sep 17 00:00:00 2001
Orion Poplawski 7f9f064
From: Min RK <benjaminrk@gmail.com>
Orion Poplawski 7f9f064
Date: Mon, 20 Jul 2015 12:11:04 -0700
Orion Poplawski 7f9f064
Subject: [PATCH 3/4] only redirect to editor for text documents
Orion Poplawski 7f9f064
Orion Poplawski 7f9f064
treat unidentified mime-types as text
Orion Poplawski 7f9f064
---
Orion Poplawski 7f9f064
 IPython/html/static/tree/js/notebooklist.js | 7 +++++++
Orion Poplawski 7f9f064
 1 file changed, 7 insertions(+)
Orion Poplawski 7f9f064
Orion Poplawski 7f9f064
diff --git a/IPython/html/static/tree/js/notebooklist.js b/IPython/html/static/tree/js/notebooklist.js
Orion Poplawski 7f9f064
index 0065143..d8c7b2a 100644
Orion Poplawski 7f9f064
--- a/IPython/html/static/tree/js/notebooklist.js
Orion Poplawski 7f9f064
+++ b/IPython/html/static/tree/js/notebooklist.js
Orion Poplawski 7f9f064
@@ -532,6 +532,13 @@ define([
Orion Poplawski 7f9f064
             icon = 'running_' + icon;
Orion Poplawski 7f9f064
         }
Orion Poplawski 7f9f064
         var uri_prefix = NotebookList.uri_prefixes[model.type];
Orion Poplawski 7f9f064
+        if (model.type === 'file' &&
Orion Poplawski 7f9f064
+            model.mimetype && model.mimetype.substr(0,5) !== 'text/'
Orion Poplawski 7f9f064
+        ) {
Orion Poplawski 7f9f064
+            // send text/unidentified files to editor, others go to raw viewer
Orion Poplawski 7f9f064
+            uri_prefix = 'files';
Orion Poplawski 7f9f064
+        }
Orion Poplawski 7f9f064
+        
Orion Poplawski 7f9f064
         item.find(".item_icon").addClass(icon).addClass('icon-fixed-width');
Orion Poplawski 7f9f064
         var link = item.find("a.item_link")
Orion Poplawski 7f9f064
             .attr('href',
Orion Poplawski 7f9f064
Orion Poplawski 7f9f064
From 2b835ca6daec2592d9127dc85bf2cdcfb718edf2 Mon Sep 17 00:00:00 2001
Orion Poplawski 7f9f064
From: Min RK <benjaminrk@gmail.com>
Orion Poplawski 7f9f064
Date: Mon, 20 Jul 2015 12:11:23 -0700
Orion Poplawski 7f9f064
Subject: [PATCH 4/4] Don't redirect from /edit/ to /files/
Orion Poplawski 7f9f064
Orion Poplawski 7f9f064
show failure to decode, instead
Orion Poplawski 7f9f064
---
Orion Poplawski 7f9f064
 IPython/html/static/edit/js/editor.js | 15 +++------------
Orion Poplawski 7f9f064
 1 file changed, 3 insertions(+), 12 deletions(-)
Orion Poplawski 7f9f064
Orion Poplawski 7f9f064
diff --git a/IPython/html/static/edit/js/editor.js b/IPython/html/static/edit/js/editor.js
Orion Poplawski 7f9f064
index dd12ea4..75d65e0 100644
Orion Poplawski 7f9f064
--- a/IPython/html/static/edit/js/editor.js
Orion Poplawski 7f9f064
+++ b/IPython/html/static/edit/js/editor.js
Orion Poplawski 7f9f064
@@ -90,19 +90,10 @@ function($,
Orion Poplawski 7f9f064
             }).catch(
Orion Poplawski 7f9f064
             function(error) {
Orion Poplawski 7f9f064
                 that.events.trigger("file_load_failed.Editor", error);
Orion Poplawski 7f9f064
-                if (((error.xhr||{}).responseJSON||{}).reason === 'bad format') {
Orion Poplawski 7f9f064
-                    window.location = utils.url_path_join(
Orion Poplawski 7f9f064
-                        that.base_url,
Orion Poplawski 7f9f064
-                        'files',
Orion Poplawski 7f9f064
-                        that.file_path
Orion Poplawski 7f9f064
-                    );
Orion Poplawski 7f9f064
-                } else {
Orion Poplawski 7f9f064
-                    console.warn('Error while loading: the error was:')
Orion Poplawski 7f9f064
-                    console.warn(error)
Orion Poplawski 7f9f064
-                }
Orion Poplawski 7f9f064
+                console.warn('Error loading: ', error);
Orion Poplawski 7f9f064
                 cm.setValue("Error! " + error.message +
Orion Poplawski 7f9f064
                                 "\nSaving disabled.\nSee Console for more details.");
Orion Poplawski 7f9f064
-                cm.setOption('readOnly','nocursor')
Orion Poplawski 7f9f064
+                cm.setOption('readOnly','nocursor');
Orion Poplawski 7f9f064
                 that.save_enabled = false;
Orion Poplawski 7f9f064
             }
Orion Poplawski 7f9f064
         );
Orion Poplawski 7f9f064
@@ -186,7 +177,7 @@ function($,
Orion Poplawski 7f9f064
     Editor.prototype._clean_state = function(){
Orion Poplawski 7f9f064
         var clean = this.codemirror.isClean(this.generation);
Orion Poplawski 7f9f064
         if (clean === this.clean){
Orion Poplawski 7f9f064
-            return
Orion Poplawski 7f9f064
+            return;
Orion Poplawski 7f9f064
         } else {
Orion Poplawski 7f9f064
             this.clean = clean;
Orion Poplawski 7f9f064
         }