Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 28 additions & 7 deletions stdimage/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,11 @@
from widgets import DelAdminFileWidget


class ThumbnailField(object):
class AdditionalMediaField(object):
"""Instances of this class will be used to access data of the
generated thumbnails
Additional media items created eg. thumbnail and original

"""

def __init__(self, name):
self.name = name
self.storage = FileSystemStorage()
Expand All @@ -29,6 +28,7 @@ def url(self):
def size(self):
return self.storage.size(self.name)


class StdImageFileDescriptor(ImageFileDescriptor):
""" The thumbnail property of the field should be accessible in instance
cases
Expand Down Expand Up @@ -62,17 +62,17 @@ def __init__(self, *args, **kwargs):
"""
size = kwargs.pop('size', None)
thumbnail_size = kwargs.pop('thumbnail_size', None)

params_size = ('width', 'height', 'force')
for att_name, att in (('size', size),
('thumbnail_size', thumbnail_size)):
if att and isinstance(att, (tuple, list)):
setattr(self, att_name, dict(map(None, params_size, att)))
else:
setattr(self, att_name, None)
self.original = True if kwargs.pop('original', None) == True else None
super(StdImageField, self).__init__(*args, **kwargs)

def _get_thumbnail_filename(self, filename):
def _append_suffix(self, filename, suffix):
"""Returns the thumbnail name associated to the standard image filename

Example::
Expand All @@ -85,9 +85,16 @@ def _get_thumbnail_filename(self, filename):

"""
splitted_filename = list(os.path.splitext(filename))
splitted_filename.insert(1, '.thumbnail')
splitted_filename.insert(1, '.' + suffix)
return ''.join(splitted_filename)

def _get_original_filename(self, filename):
return self._append_suffix(filename, 'original')

def _get_thumbnail_filename(self, filename):
return self._append_suffix(filename, 'thumbnail')


def _resize_image(self, filename, size):
"""Resizes the image to specified width, height and force option

Expand Down Expand Up @@ -147,6 +154,10 @@ def _rename_resize_image(self, instance=None, **kwargs):
dst_fullpath = os.path.join(settings.MEDIA_ROOT, dst)
if os.path.abspath(filename) != os.path.abspath(dst_fullpath):
os.rename(filename, dst_fullpath)
if self.original:
original_filename = self._get_original_filename(
dst_fullpath)
shutil.copyfile(dst_fullpath, original_filename)
if self.size:
self._resize_image(dst_fullpath, self.size)
if self.thumbnail_size:
Expand All @@ -168,9 +179,18 @@ def _set_thumbnail(self, instance=None, **kwargs):
filename = self.generate_filename(instance,
os.path.basename(getattr(instance, self.name).path))
thumbnail_filename = self._get_thumbnail_filename(filename)
thumbnail_field = ThumbnailField(thumbnail_filename)
thumbnail_field = AdditionalMediaField(thumbnail_filename)
setattr(getattr(instance, self.name), 'thumbnail', thumbnail_field)

def _set_original(self, instance=None, **kwargs):
"""Carbon copy of above, should be extrapolated out"""
if getattr(instance, self.name):
filename = self.generate_filename(instance,
os.path.basename(getattr(instance, self.name).path))
original_filename = self._get_original_filename(filename)
original_field = AdditionalMediaField(original_filename)
setattr(getattr(instance, self.name), 'original', original_field)


def formfield(self, **kwargs):
"""Specify form field and widget to be used on the forms"""
Expand Down Expand Up @@ -212,3 +232,4 @@ def contribute_to_class(self, cls, name):
super(StdImageField, self).contribute_to_class(cls, name)
signals.post_save.connect(self._rename_resize_image, sender=cls)
signals.post_init.connect(self._set_thumbnail, sender=cls)
signals.post_init.connect(self._set_original, sender=cls)