From 6e8c4a325332a816a2a94e869f6337dd17de05e7 2013-10-18 23:35:03
From: MinRK <benjaminrk@gmail.com>
Date: 2013-10-18 23:35:03
Subject: [PATCH] copy_from in json, not in url param
---

diff --git a/IPython/html/services/notebooks/handlers.py b/IPython/html/services/notebooks/handlers.py
index adcd852..e52e559 100644
--- a/IPython/html/services/notebooks/handlers.py
+++ b/IPython/html/services/notebooks/handlers.py
@@ -150,15 +150,19 @@ class NotebookHandler(IPythonHandler):
         POST /api/notebooks/path?copy=OtherNotebook.ipynb : new copy of OtherNotebook in path
         """
         
-        model = self.get_json_body()
-        copy = self.get_argument("copy", default="")
         if name is not None:
-            raise web.HTTPError(400, "Only POST to directories. Use PUT for full names")
+            raise web.HTTPError(400, "Only POST to directories. Use PUT for full names.")
+        
+        model = self.get_json_body()
         
-        if copy:
-            self._copy_notebook(copy, path)
-        elif model:
-            self._upload_notebook(model, path)
+        if model is not None:
+            copy_from = model.get('copy_from')
+            if copy_from:
+                if model.get('content'):
+                    raise web.HTTPError(400, "Can't upload and copy at the same time.")
+                self._copy_notebook(copy_from, path)
+            else:
+                self._upload_notebook(model, path)
         else:
             self._create_empty_notebook(path)
 
@@ -178,14 +182,15 @@ class NotebookHandler(IPythonHandler):
         """
         if name is None:
             raise web.HTTPError(400, "Only PUT to full names. Use POST for directories.")
+        
         model = self.get_json_body()
-        copy = self.get_argument("copy", default="")
-        if copy:
-            if model is not None:
-                raise web.HTTPError(400)
-            self._copy_notebook(copy, path, name)
-        elif model:
-            if self.notebook_manager.notebook_exists(name, path):
+        if model:
+            copy_from = model.get('copy_from')
+            if copy_from:
+                if model.get('content'):
+                    raise web.HTTPError(400, "Can't upload and copy at the same time.")
+                self._copy_notebook(copy_from, path, name)
+            elif self.notebook_manager.notebook_exists(name, path):
                 self._save_notebook(model, path, name)
             else:
                 self._upload_notebook(model, path, name)
diff --git a/IPython/html/services/notebooks/tests/test_notebooks_api.py b/IPython/html/services/notebooks/tests/test_notebooks_api.py
index 16aefa8..06c5327 100644
--- a/IPython/html/services/notebooks/tests/test_notebooks_api.py
+++ b/IPython/html/services/notebooks/tests/test_notebooks_api.py
@@ -2,6 +2,7 @@
 """Test the notebooks webservice API."""
 
 import io
+import json
 import os
 import shutil
 from unicodedata import normalize
@@ -25,11 +26,10 @@ class NBAPI(object):
     def __init__(self, base_url):
         self.base_url = base_url
 
-    def _req(self, verb, path, body=None, params=None):
+    def _req(self, verb, path, body=None):
         response = requests.request(verb,
                 url_path_join(self.base_url, 'api/notebooks', path),
                 data=body,
-                params=params,
         )
         response.raise_for_status()
         return response
@@ -47,7 +47,8 @@ class NBAPI(object):
         return self._req('POST', path, body)
 
     def copy_untitled(self, copy_from, path='/'):
-        return self._req('POST', path, params={'copy':copy_from})
+        body = json.dumps({'copy_from':copy_from})
+        return self._req('POST', path, body)
 
     def create(self, name, path='/'):
         return self._req('PUT', url_path_join(path, name))
@@ -56,7 +57,8 @@ class NBAPI(object):
         return self._req('PUT', url_path_join(path, name), body)
 
     def copy(self, copy_from, copy_to, path='/'):
-        return self._req('PUT', url_path_join(path, copy_to), params={'copy':copy_from})
+        body = json.dumps({'copy_from':copy_from})
+        return self._req('PUT', url_path_join(path, copy_to), body)
 
     def save(self, name, body, path='/'):
         return self._req('PUT', url_path_join(path, name), body)