# HG changeset patch # User k0s # Date 1261783665 18000 # Node ID 93af41dcff3a176d4190498efbfead5beab7643b # Parent 70ead14c7d435301c25054829e2e6d38e8f5d59c now creates thumbnails using cropresize package diff -r 70ead14c7d43 -r 93af41dcff3a montage/formatters.py --- a/montage/formatters.py Fri Dec 25 17:24:22 2009 -0500 +++ b/montage/formatters.py Fri Dec 25 18:27:45 2009 -0500 @@ -1,20 +1,29 @@ +""" +formatter for decoupage +""" + import mimetypes +import os +import Image +from cropresize import crop_resize from decoupage.formatters import FormatterBase class Images(FormatterBase): """display images with thumbnails""" defaults = { 'size': 'x', - 'columns': None } + 'columns': None, + 'thumb_dir': 'thumbs', + 'thumb_prefix': 'thumb_'} def __init__(self, arg): FormatterBase.__init__(self, arg) # get image size for display width, height = [ i.strip() for i in self.size.split('x', 1) ] - self.width = width or None - self.height = height or None - + self.width = width and int(width) or None + self.height = height and int(height) or None + def __call__(self, request, data): # add width + height data @@ -39,6 +48,50 @@ # thumbnails if 'thumbnails' not in self.args: return - for f in data['files']: + thumb_dir = self.thumb_dir + if not os.path.isabs(thumb_dir): + thumb_dir = os.path.join(data['directory'], self.thumb_dir) + else: raise NotImplementedError - import pdb; pdb.set_trace() + if not os.path.exists(thumb_dir): + os.mkdir(thumb_dir) + for f in data['files']: + filepath = os.path.join(data['directory'], f['name']) + thumbnail = '%s%s' % (self.thumb_prefix, f['name']) + thumbnail_file = os.path.join(data['directory'], thumb_dir, thumbnail) + create_thumbnail = False + if os.path.exists(thumbnail_file): + + # ensure the size is smaller than the specified size + try: + thumb = Image.open(thumbnail_file) + except: + continue + if self.width and thumb.size[0] > self.width: + create_thumbnail = True + if self.height and thumb.size[1] > self.height: + create_thumbnail = True + + # ensure the original file has not been modified + if os.path.getatime(thumbnail_file) < os.path.getatime(filepath): + create_thumbnail = True + else: + # create a new thumbnail + create_thumbnail = True + + if create_thumbnail: # do thumbnail creation + image = Image.open(filepath) + + try: + thumbnail_image = crop_resize(image, (self.width, self.height)) + except: + continue + fd = file(thumbnail_file, 'w') + thumbnail_image.save(fd) + fd.close() + + # fix the path to point to the thumbnail + f['path'] = '%s/%s/%s' % (f['path'].rsplit('/', 1)[0], + self.thumb_dir, + thumbnail) + diff -r 70ead14c7d43 -r 93af41dcff3a setup.py --- a/setup.py Fri Dec 25 17:24:22 2009 -0500 +++ b/setup.py Fri Dec 25 18:27:45 2009 -0500 @@ -1,7 +1,8 @@ +from cropresize import crop_resize from setuptools import setup, find_packages import sys, os -version = '0.1' +version = '0.2' setup(name='montage', version=version, @@ -20,11 +21,8 @@ install_requires=[ # -*- Extra requirements: -*- 'decoupage', -# 'PIL' + 'cropresize' ], - dependency_links=[ - "http://dist.repoze.org/PIL-1.1.6.tar.gz", - ], entry_points=""" # -*- Entry points: -*- [decoupage.formatters]