forked from samuelclay/NewsBlur
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy paths3_utils.py
124 lines (96 loc) · 3.78 KB
/
s3_utils.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import os
import sys
import time
import mimetypes
from boto.s3.connection import S3Connection
from boto.s3.key import Key
from utils.image_functions import ImageOps
if '/srv/newsblur' not in ' '.join(sys.path):
sys.path.append("/srv/newsblur")
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
from django.conf import settings
ACCESS_KEY = settings.S3_ACCESS_KEY
SECRET = settings.S3_SECRET
BUCKET_NAME = settings.S3_BACKUP_BUCKET # Note that you need to create this bucket first
def save_file_in_s3(filename):
conn = S3Connection(ACCESS_KEY, SECRET)
bucket = conn.get_bucket(BUCKET_NAME)
k = Key(bucket)
k.key = filename
k.set_contents_from_filename(filename)
def get_file_from_s3(filename):
conn = S3Connection(ACCESS_KEY, SECRET)
bucket = conn.get_bucket(BUCKET_NAME)
k = Key(bucket)
k.key = filename
k.get_contents_to_filename(filename)
def list_backup_in_s3():
conn = S3Connection(ACCESS_KEY, SECRET)
bucket = conn.get_bucket(BUCKET_NAME)
for i, key in enumerate(bucket.get_all_keys()):
print "[%s] %s" % (i, key.name)
def delete_all_backups():
#FIXME: validate filename exists
conn = S3Connection(ACCESS_KEY, SECRET)
bucket = conn.get_bucket(BUCKET_NAME)
for i, key in enumerate(bucket.get_all_keys()):
print "deleting %s" % (key.name)
key.delete()
if __name__ == '__main__':
import sys
if len(sys.argv) < 3:
print 'Usage: %s <get/set/list/delete> <backup_filename>' % (sys.argv[0])
else:
if sys.argv[1] == 'set':
save_file_in_s3(sys.argv[2])
elif sys.argv[1] == 'get':
get_file_from_s3(sys.argv[2])
elif sys.argv[1] == 'list':
list_backup_in_s3()
elif sys.argv[1] == 'delete':
delete_all_backups()
else:
print 'Usage: %s <get/set/list/delete> <backup_filename>' % (sys.argv[0])
class S3Store:
def __init__(self, bucket_name=settings.S3_AVATARS_BUCKET_NAME):
self.s3 = S3Connection(ACCESS_KEY, SECRET)
self.bucket = self.create_bucket(bucket_name)
def create_bucket(self, bucket_name):
return self.s3.create_bucket(bucket_name)
def save_profile_picture(self, user_id, filename, image_body):
mimetype, extension = self._extract_mimetype(filename)
if not mimetype or not extension:
return
image_name = 'profile_%s.%s' % (int(time.time()), extension)
image = ImageOps.resize_image(image_body, 'fullsize', fit_to_size=False)
if image:
key = 'avatars/%s/large_%s' % (user_id, image_name)
self._save_object(key, image, mimetype=mimetype)
image = ImageOps.resize_image(image_body, 'thumbnail', fit_to_size=True)
if image:
key = 'avatars/%s/thumbnail_%s' % (user_id, image_name)
self._save_object(key, image, mimetype=mimetype)
return image and image_name
def _extract_mimetype(self, filename):
mimetype = mimetypes.guess_type(filename)[0]
extension = None
if mimetype == 'image/jpeg':
extension = 'jpg'
elif mimetype == 'image/png':
extension = 'png'
elif mimetype == 'image/gif':
extension = 'gif'
return mimetype, extension
def _make_key(self):
return Key(bucket=self.bucket)
def _save_object(self, key, file_object, mimetype=None):
k = self._make_key()
k.key = key
file_object.seek(0)
if mimetype:
k.set_contents_from_file(file_object, headers={
'Content-Type': mimetype,
})
else:
k.set_contents_from_file(file_object)
k.set_acl('public-read')