diff --git a/storages/backends/dropbox.py b/storages/backends/dropbox.py index 39b90b789..dc1958757 100644 --- a/storages/backends/dropbox.py +++ b/storages/backends/dropbox.py @@ -18,6 +18,7 @@ from storages.utils import setting from dropbox.client import DropboxClient +from dropbox.rest import ErrorResponse DATE_FORMAT = '%a, %d %b %Y %X +0000' @@ -51,8 +52,10 @@ def delete(self, name): self.client.file_delete(name) def exists(self, name): - response = self.client.search('/', name, file_limit=1) - return bool(response) + try: + return bool(self.client.metadata(name)) + except ErrorResponse: + return False def listdir(self, path): directories, files = [], [] @@ -78,6 +81,10 @@ def accessed_time(self, name): acc_time = datetime.strptime(metadata['client_mtime'], DATE_FORMAT) return acc_time + def url(self, name): + media = self.client.media(name) + return media['url'] + def _open(self, name, mode='rb'): remote_file = DropBoxFile(name, self) return remote_file diff --git a/tests/test_dropbox.py b/tests/test_dropbox.py index f5b4417e6..41be28a13 100644 --- a/tests/test_dropbox.py +++ b/tests/test_dropbox.py @@ -48,6 +48,10 @@ 'size': '0 bytes', 'thumb_exists': False } +FILE_MEDIA_FIXTURE = { + 'url': 'https://dl.dropboxusercontent.com/1/view/foo', + 'expires': 'Fri, 16 Sep 2011 01:01:25 +0000', +} __all__ = [ 'DropBoxTest', @@ -67,13 +71,13 @@ def setUp(self, *args): def test_delete(self, *args): self.storage.delete('foo') - @mock.patch('dropbox.client.DropboxClient.search', + @mock.patch('dropbox.client.DropboxClient.metadata', return_value=[FILE_FIXTURE]) def test_exists(self, *args): exists = self.storage.exists('foo') self.assertTrue(exists) - @mock.patch('dropbox.client.DropboxClient.search', + @mock.patch('dropbox.client.DropboxClient.metadata', return_value=[]) def test_not_exists(self, *args): exists = self.storage.exists('bar') @@ -121,6 +125,12 @@ def test_read(self, *args): content = self.storage._read('foo') self.assertEqual(content, 'bar') + @mock.patch('dropbox.client.DropboxClient.media', + return_value=FILE_MEDIA_FIXTURE) + def test_url(self, *args): + url = self.storage.url('foo') + self.assertEqual(url, FILE_MEDIA_FIXTURE['url']) + class DropBoxFileTest(TestCase): @mock.patch('dropbox.client._OAUTH2_ACCESS_TOKEN_PATTERN',