Skip to content

Commit

Permalink
Refactoring the storage backend method signatures
Browse files Browse the repository at this point in the history
Now everything just takes the image object and handles it's own logic.
For the most part the calculated image is stored as
image.hashed_filename().

This also fixes a bug where deleting images wouldn't actually delete
anything because the save method was being passed "hash.extension" but
the delete method was just being passed "hash".  Now everything uses
hashed_filename()
  • Loading branch information
patrickomatic committed Sep 27, 2013
1 parent bb027f7 commit f2cc879
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 35 deletions.
54 changes: 24 additions & 30 deletions urlimaging/backends/default.py
Expand Up @@ -4,13 +4,13 @@


class ImageStorage:
def delete_image(self, hash):
def delete_image(self, image):
raise Exception('delete_image not implemented')

def save_image(self, filename):
def save_image(self, image):
raise Exception('save_image not implemented')

def get_image_url(self, hash):
def get_image_url(self, image):
raise Exception('get_image_url not implemented')

def get_required_settings(self):
Expand Down Expand Up @@ -46,29 +46,29 @@ def __init__(self):
self.bucket = self.connection.get_bucket(settings.S3_BUCKET_NAME)


def delete_image(self, hash):
def delete_image(self, image):
from boto.s3.key import Key

k = Key(self.bucket, hash)
k = Key(self.bucket, image.hashed_filename())
k.delete()
k.close()


@retry(3, Exception)
def save_image(self, hash, filename):
def save_image(self, image):
from boto.s3.key import Key

key = Key(self.bucket, hash)
key.set_contents_from_filename(filename,
key = Key(self.bucket, image.hashed_filename())
key.set_contents_from_filename(image.filename,
{'Cache-Control': 'public, max-age=%d' % settings.S3_EXPIRES,
'Expires': time.asctime(time.gmtime(time.time() + settings.S3_EXPIRES)) })
key.close()


def get_image_url(self, hash):
def get_image_url(self, image):
from boto.s3.key import Key

key = Key(self.bucket, hash)
key = Key(self.bucket, image.hashed_filename())

ret = key.generate_url(settings.S3_EXPIRES, 'GET',
{'Cache-Control': 'public, max-age=%d' % settings.S3_EXPIRES,
Expand All @@ -89,20 +89,15 @@ def get_storage_dir(self):
except AttributeError:
return settings.MEDIA_ROOT

def delete_image(self, image):
os.unlink(os.path.join(self.get_storage_dir(), image.hashed_filename()))

def delete_image(self, hash):
os.unlink(os.path.join(self.get_storage_dir(), hash))
def save_image(self, image):
shutil.copyfile(filename, os.path.join(self.get_storage_dir(), image.hashed_filename()))


def save_image(self, hash, filename):
shutil.copyfile(filename, os.path.join(self.get_storage_dir(), hash))


def get_image_url(self, hash):
# XXX check for a setting
def get_image_url(self, image):
prefix = settings.IMAGE_PATH_PREFIX if hasattr(settings, 'IMAGE_PATH_PREFIX') else ''
return settings.MEDIA_URL + prefix + "/" + hash

return settings.MEDIA_URL + prefix + "/" + image.hashed_filename()

def get_required_settings(self):
return []
Expand All @@ -115,26 +110,25 @@ def identity_file_str(self):
except AttributeError:
return ""

def delete_image(self, hash):
def delete_image(self, image):
os.system("ssh %(identify_file)s %(ssh_user)s \"rm %(file_path)s\"" % {
'identity_file': self.identity_file_str(),
'ssh_user': settings.SSH_MEDIA_USER,
'file_path': os.path.join(settings.SSH_MEDIA_PATH, hash)})
'file_path': os.path.join(settings.SSH_MEDIA_PATH, image.hashed_filename())})

def save_image(self, filename):
def save_image(self, image):
os.system("scp %(identity_file)s %(filename)s %(ssh_user)s:%(file_path)s" % {
'identity_file': self.identity_file_str(),
'ssh_user': settings.SSH_MEDIA_USER,
'filename': filename,
'file_path': os.path.join(settings.SSH_MEDIA_PATH, hash)})
'file_path': os.path.join(settings.SSH_MEDIA_PATH, image.hashed_filename())})

def get_image_url(self, hash):
def get_image_url(self, image):
url = settings.PROCESSED_MEDIA_URL
if url.endswith("/"):
return url + hash
return url + image.hashed_filename()
else:
return url + '/' + hash
return url + '/' + image.hashed_filename()

def get_required_settings(self):
return ['PROCESSED_MEDIA_URL', 'SSH_MEDIA_USER', 'SSH_MEDIA_PATH',]

return ['PROCESSED_MEDIA_URL', 'SSH_MEDIA_USER', 'SSH_MEDIA_PATH']
11 changes: 6 additions & 5 deletions urlimaging/models.py
Expand Up @@ -70,7 +70,7 @@ class ModifiedImage(models.Model):


def delete(self):
settings.IMAGE_STORAGE.delete_image(self.hash)
settings.IMAGE_STORAGE.delete_image(image)

models.Model.delete(self)

Expand All @@ -86,6 +86,9 @@ def refresh(self):
def get_absolute_url(self):
return '/' + self.operations + self.site.domain_name + self.original_location

def hashed_filename(self):
return "%s%s" % (self.hash, self.ext)

def __unicode__(self):
return self.get_absolute_url()

Expand Down Expand Up @@ -113,7 +116,6 @@ def __init__(self, url=None):
self.todo = []
self.url = ""
self.filename = ""
self.hashed_filename = ""
self.ext = ""
self.hash = ""
self.operations = ""
Expand Down Expand Up @@ -145,7 +147,6 @@ def parse_url(self, url):

self.hash = hashlib.sha224(self.operations + latin1_to_ascii(url)).hexdigest()
self.filename = file_location(self.hash, self.ext)
self.hashed_filename = "%s%s" % (self.hash, self.ext)
else:
self.todo = []

Expand Down Expand Up @@ -251,12 +252,12 @@ def run_commands(self, user=None):
except ValueError as e:
break

settings.IMAGE_STORAGE.save_image(self.hashed_filename, self.filename)
settings.IMAGE_STORAGE.save_image(image)
image.size = os.path.getsize(self.filename)

os.unlink(self.filename)

if check_remote_image:
image.save()

return settings.IMAGE_STORAGE.get_image_url(self.hashed_filename)
return settings.IMAGE_STORAGE.get_image_url(image)

0 comments on commit f2cc879

Please sign in to comment.