From b95ec91187175f02a95141da1018fb93b37ee689 Mon Sep 17 00:00:00 2001 From: Josh Schneier Date: Tue, 26 Jan 2016 13:06:05 -0500 Subject: [PATCH] Fixes #112 - Check if bucket exists for path='' --- storages/backends/s3boto.py | 7 +++++++ tests/test_s3boto.py | 8 ++++++++ 2 files changed, 15 insertions(+) diff --git a/storages/backends/s3boto.py b/storages/backends/s3boto.py index 6f0196d62..d5d53d0e2 100644 --- a/storages/backends/s3boto.py +++ b/storages/backends/s3boto.py @@ -428,6 +428,13 @@ def delete(self, name): self.bucket.delete_key(self._encode_name(name)) def exists(self, name): + if not name: # root element aka the bucket + try: + self.bucket + return True + except ImproperlyConfigured: + return False + name = self._normalize_name(self._clean_name(name)) if self.entries: return name in self.entries diff --git a/tests/test_s3boto.py b/tests/test_s3boto.py index bd3e6e94b..cfcc293ab 100644 --- a/tests/test_s3boto.py +++ b/tests/test_s3boto.py @@ -10,6 +10,7 @@ from django.core.files.base import ContentFile import django +from boto.exception import S3ResponseError from boto.s3.key import Key from boto.utils import parse_ts, ISO8601 @@ -196,6 +197,13 @@ def test_storage_open_write(self): ) file._multipart.complete_upload.assert_called_once() + def test_storage_exists_bucket(self): + self.storage._connection.get_bucket.side_effect = S3ResponseError(404, 'No bucket') + self.assertFalse(self.storage.exists('')) + + self.storage._connection.get_bucket.side_effect = None + self.assertTrue(self.storage.exists('')) + def test_storage_exists(self): key = self.storage.bucket.new_key.return_value key.exists.return_value = True