diff core/s3.py @ 700:e888d627928f

Refactored the processing of image uploads. I suspect I will use this general algorithm in other places (like POTD), so I made it reusable.
author Brian Neal <bgneal@gmail.com>
date Wed, 11 Sep 2013 20:31:23 -0500
parents user_photos/s3.py@67f8d49a9377
children bf5340705d0c
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/s3.py	Wed Sep 11 20:31:23 2013 -0500
@@ -0,0 +1,84 @@
+"""s3.py
+
+This module provides Amazon S3 convenience wrappers.
+
+"""
+from boto.s3.connection import S3Connection
+from boto.s3.key import Key
+
+
+class S3Bucket(object):
+    """This class abstracts an Amazon S3 bucket.
+
+    We currently only support upload functionality.
+
+    """
+    def __init__(self, access_key, secret_key, base_url, bucket_name):
+        self.conn = S3Connection(access_key, secret_key)
+        self.bucket = self.conn.get_bucket(bucket_name, validate=False)
+        self.base_url = base_url
+        if not base_url.endswith('/'):
+            self.base_url += '/'
+        self.name = bucket_name
+
+    def upload_from_file(self, key_name, fp, metadata=None, public=True):
+        """Uploads data from the file object fp to a new key named
+        key_name. metadata, if not None, must be a dict of metadata key / value
+        pairs which will be added to the key.
+
+        If public is True, the key will be made public after the upload.
+
+        Returns the URL to the uploaded file.
+
+        """
+        key = self._make_key(key_name, metadata)
+        key.set_contents_from_file(fp)
+        if public:
+            key.make_public()
+        return '{}{}/{}'.format(self.base_url, self.name, key_name)
+
+    def upload_from_filename(self, key_name, filename, metadata=None,
+            public=True):
+        """Uploads data from the file named by filename to a new key named
+        key_name. metadata, if not None, must be a dict of metadata key / value
+        pairs which will be added to the key.
+
+        If public is True, the key will be made public after the upload.
+
+        Returns the URL to the uploaded file.
+
+        """
+        key = self._make_key(key_name, metadata)
+        key.set_contents_from_filename(filename)
+        if public:
+            key.make_public()
+        return '{}{}/{}'.format(self.base_url, self.name, key_name)
+
+    def upload_from_string(self, key_name, content, metadata=None,
+            public=True):
+        """Creates a new key with the given key_name, and uploads the string
+        content to it. metadata, if not None, must be a dict of metadata key /
+        value pairs which will be added to the key.
+
+        If public is True, the key will be made public after the upload.
+
+        Returns the URL to the uploaded file.
+
+        """
+        key = self._make_key(key_name, metadata)
+        key.set_contents_from_string(content)
+        if public:
+            key.make_public()
+        return '{}{}/{}'.format(self.base_url, self.name, key_name)
+
+    def _make_key(self, key_name, metadata):
+        """Private method to create a key and optionally apply metadata to
+        it.
+
+        """
+        key = Key(self.bucket)
+        key.key = key_name
+        if metadata:
+            for k, v in metadata.iteritems():
+                key.set_metadata(k, v)
+        return key