diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 4b45ff9a5..d4ebaaddd 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -7,9 +7,11 @@ django-storages CHANGELOG Dropbox ------- +- Strip off the root path when saving files to fix saving with upgraded versions of Django (`#1168`_) - Update ``DropBoxStorage`` constructor parameter order to be backwards compatible (`#1167`_) .. _#1167: https://github.com/jschneier/django-storages/pull/1167 +.. _#1168: https://github.com/jschneier/django-storages/pull/1168 1.13 (2022-08-05) ***************** diff --git a/storages/backends/dropbox.py b/storages/backends/dropbox.py index eb372fcdc..dff282598 100644 --- a/storages/backends/dropbox.py +++ b/storages/backends/dropbox.py @@ -170,7 +170,9 @@ def _save(self, name, content): else: self._chunked_upload(content, self._full_path(name)) content.close() - return name + # .save() validates the filename isn't absolute but Dropbox requires an absolute filename. + # Work with the absolute name internally but strip it off before passing up-the-chain + return name.lstrip(self.root_path) def _chunked_upload(self, content, dest_path): upload_session = self.client.files_upload_session_start( diff --git a/tests/test_dropbox.py b/tests/test_dropbox.py index 185733cf1..015bfe06b 100644 --- a/tests/test_dropbox.py +++ b/tests/test_dropbox.py @@ -130,11 +130,12 @@ def test_open(self, *args): obj = self.storage._open('foo') self.assertIsInstance(obj, File) - @mock.patch('dropbox.Dropbox.files_upload', - return_value='foo') + @mock.patch('dropbox.Dropbox.files_upload', return_value='foo') + @mock.patch('dropbox.Dropbox.files_get_metadata', return_value=None) def test_save(self, files_upload, *args): - self.storage._save('foo', File(io.BytesIO(b'bar'), 'foo')) + name = self.storage.save('foo', File(io.BytesIO(b'bar'), 'foo')) self.assertTrue(files_upload.called) + self.assertEqual(name, 'foo') @mock.patch('dropbox.Dropbox.files_upload') @mock.patch('dropbox.Dropbox.files_upload_session_finish') @@ -192,6 +193,13 @@ def test_jailed(self, *args): self.assertFalse(dirs) self.assertFalse(files) + @mock.patch('dropbox.Dropbox.files_upload', return_value='foo') + @mock.patch('dropbox.Dropbox.files_get_metadata', return_value=None) + def test_saves(self, *args): + self.storage = dropbox.DropBoxStorage('foo', root_path='/bar') + name = self.storage.save('xyz', File(io.BytesIO(b'abc'), 'def')) + self.assertEqual(name, 'xyz') + def test_suspicious(self, *args): self.storage = dropbox.DropBoxStorage('foo', root_path='/bar') with self.assertRaises((SuspiciousFileOperation, ValueError)):