diff --git a/IPython/html/services/contents/handlers.py b/IPython/html/services/contents/handlers.py
index 3903aff..f91c662 100644
--- a/IPython/html/services/contents/handlers.py
+++ b/IPython/html/services/contents/handlers.py
@@ -158,23 +158,12 @@ class ContentsHandler(IPythonHandler):
Save notebook at ``path/Name.ipynb``. Notebook structure is specified
in `content` key of JSON request body. If content is not specified,
create a new empty notebook.
- PUT /api/contents/path/Name.ipynb
- with JSON body::
-
- {
- "copy_from" : "[path/to/]OtherNotebook.ipynb"
- }
-
- Copy OtherNotebook to Name
"""
model = self.get_json_body()
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(copy_from, path)
- elif self.contents_manager.file_exists(path):
+ if model.get('copy_from'):
+ raise web.HTTPError(400, "Cannot copy with PUT, only POST")
+ if self.contents_manager.file_exists(path):
self._save(model, path)
else:
self._upload(model, path)
diff --git a/IPython/html/services/contents/tests/test_contents_api.py b/IPython/html/services/contents/tests/test_contents_api.py
index 1685dc9..698f471 100644
--- a/IPython/html/services/contents/tests/test_contents_api.py
+++ b/IPython/html/services/contents/tests/test_contents_api.py
@@ -55,7 +55,7 @@ class API(object):
body = json.dumps({'ext': ext})
return self._req('POST', path, body)
- def copy_untitled(self, copy_from, path='/'):
+ def copy(self, copy_from, path='/'):
body = json.dumps({'copy_from':copy_from})
return self._req('POST', path, body)
@@ -68,7 +68,7 @@ class API(object):
def mkdir(self, path='/'):
return self._req('PUT', path, json.dumps({'type': 'directory'}))
- def copy(self, copy_from, path):
+ def copy_put(self, copy_from, path='/'):
body = json.dumps({'copy_from':copy_from})
return self._req('PUT', path, body)
@@ -352,25 +352,25 @@ class APITest(NotebookTestBase):
data = resp.json()
self.assertEqual(data['content']['nbformat'], 4)
- def test_copy_untitled(self):
- resp = self.api.copy_untitled(u'å b/ç d.ipynb', u'unicodé')
+ def test_copy(self):
+ resp = self.api.copy(u'å b/ç d.ipynb', u'unicodé')
self._check_created(resp, u'unicodé/ç d-Copy0.ipynb')
- resp = self.api.copy_untitled(u'å b/ç d.ipynb', u'å b')
+ resp = self.api.copy(u'å b/ç d.ipynb', u'å b')
self._check_created(resp, u'å b/ç d-Copy0.ipynb')
- def test_copy(self):
- resp = self.api.copy(u'å b/ç d.ipynb', u'å b/cøpy.ipynb')
- self._check_created(resp, u'å b/cøpy.ipynb')
-
def test_copy_path(self):
- resp = self.api.copy(u'foo/a.ipynb', u'å b/cøpyfoo.ipynb')
- self._check_created(resp, u'å b/cøpyfoo.ipynb')
+ resp = self.api.copy(u'foo/a.ipynb', u'å b')
+ self._check_created(resp, u'å b/a-Copy0.ipynb')
+
+ def test_copy_put_400(self):
+ with assert_http_error(400):
+ resp = self.api.copy_put(u'å b/ç d.ipynb', u'å b/cøpy.ipynb')
def test_copy_dir_400(self):
# can't copy directories
with assert_http_error(400):
- resp = self.api.copy(u'å b', u'å c')
+ resp = self.api.copy(u'å b', u'foo')
def test_delete(self):
for d, name in self.dirs_nbs: