From 342281f4c0176d36ea012048d4a5ab31d59420cb Mon Sep 17 00:00:00 2001 From: vam Date: Mon, 14 Nov 2011 15:53:41 +0100 Subject: [PATCH] S3Boto StorageMixin Class provided. --- filebrowser/storage.py | 50 ++++++++++++++++++++++++++++++++++++++ filebrowser/tests/sites.py | 2 +- 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/filebrowser/storage.py b/filebrowser/storage.py index 6f8a5db58..3c1c13ca8 100644 --- a/filebrowser/storage.py +++ b/filebrowser/storage.py @@ -60,3 +60,53 @@ def makedirs(self, name): def rmtree(self, name): shutil.rmtree(self.path(name)) + +class S3BotoStorageMixin(StorageMixin): + + def isfile(self, name): + return self.exists(name) + + def isdir(self, name): + # That's some inefficient implementation... + # If there are some files having 'name' as their prefix, then + # the name is considered to be a directory + if not name: # Empty name is a directory + return True + + if self.isfile(name): + return False + + name = self._normalize_name(self._clean_name(name)) + dirlist = self.bucket.list(self._encode_name(name)) + + # Check whether the iterator is empty + for item in dirlist: + return True + return False + + def move(self, old_file_name, new_file_name, allow_overwrite=False): + + if self.exists(new_file_name): + if allow_overwrite: + self.delete(new_file_name) + else: + raise "The destination file '%s' exists and allow_overwrite is False" % new_file_name + + old_key_name = self._encode_name(self._normalize_name(self._clean_name(old_file_name))) + new_key_name = self._encode_name(self._normalize_name(self._clean_name(new_file_name))) + + k = self.bucket.copy_key(new_key_name, self.bucket.name, old_key_name) + + if not k: + raise "Couldn't copy '%s' to '%s'" % (old_file_name, new_file_name) + + self.delete(old_file_name) + + def makedirs(self, name): + pass + + def rmtree(self, name): + name = self._normalize_name(self._clean_name(name)) + dirlist = self.bucket.list(self._encode_name(name)) + for item in dirlist: + item.delete() diff --git a/filebrowser/tests/sites.py b/filebrowser/tests/sites.py index e84f576c5..c2409902c 100644 --- a/filebrowser/tests/sites.py +++ b/filebrowser/tests/sites.py @@ -216,7 +216,7 @@ def setUp(self): def tearDown(self): # Delete a left-over tmp directories, if there's any - if self.tmpdir: + if hasattr(self, 'tmpdir') and self.tmpdir: print "Removing left-over tmp dir:", self.tmpdir.path self.site.storage.rmtree(self.tmpdir.path)