diff options
| author | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-08-24 22:38:43 +0200 |
|---|---|---|
| committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-08-24 22:38:43 +0200 |
| commit | 149185cda723c2d60fb581c5014ddedfa3a4fdf9 (patch) | |
| tree | 643043ec2d5b94d9bfb1c27acd58aa105d3b31fd /chimere/models.py | |
| parent | c76f9631a14e21881329f4f1383d2fd3327d432d (diff) | |
| parent | 02598e2ba0d244ced3d8bb25448d2a7bacf93ba7 (diff) | |
| download | Chimère-149185cda723c2d60fb581c5014ddedfa3a4fdf9.tar.bz2 Chimère-149185cda723c2d60fb581c5014ddedfa3a4fdf9.zip | |
Merge branch 'master' into saclay
Conflicts:
example_project/settings.py
Diffstat (limited to 'chimere/models.py')
| -rw-r--r-- | chimere/models.py | 58 |
1 files changed, 55 insertions, 3 deletions
diff --git a/chimere/models.py b/chimere/models.py index 936353d..4f6d4e0 100644 --- a/chimere/models.py +++ b/chimere/models.py @@ -20,10 +20,10 @@ """ Models description """ -import os, string, re +import os, datetime, re, string import simplejson as json from lxml import etree -import datetime +from PIL import Image from subprocess import Popen, PIPE from django.conf import settings @@ -540,6 +540,14 @@ class PictureFile(models.Model): width = models.IntegerField(_(u"Width")) miniature = models.BooleanField(_(u"Display inside the description?"), default=settings.CHIMERE_MINIATURE_BY_DEFAULT) + thumbnailfile = models.ImageField(_(u"Thumbnail"), upload_to='pictures', + blank=True, null=True, + height_field='thumbnailfile_height', + width_field='thumbnailfile_width') + thumbnailfile_height = models.IntegerField(_(u"Thumbnail height"), + blank=True, null=True) + thumbnailfile_width = models.IntegerField(_(u"Thumbnail width"), + blank=True, null=True) order = models.IntegerField(_(u"Order"), default=1) marker = models.ForeignKey(Marker, related_name='pictures') @@ -550,10 +558,54 @@ class PictureFile(models.Model): verbose_name = _(u"Picture file") verbose_name_plural = _(u"Picture files") +def scale_image(max_x, pair): + x, y = pair + new_y = (float(max_x) / x) * y + return (int(max_x), int(new_y)) + def picturefile_post_save(sender, **kwargs): - if not kwargs['instance'] or not kwargs['created']: + if not kwargs['instance']: return picturefile = kwargs['instance'] + + if not picturefile.thumbnailfile: + file = picturefile.picture + # defining the filename and the thumbnail filename + filehead, filetail = os.path.split(os.path.abspath(file.path)) + basename, format = os.path.splitext(filetail) + basename = defaultfilters.slugify(basename) + basename = re.sub(r'-','_', basename) + miniature = basename + '_thumb' + format + filename = file.path + miniature_filename = os.path.join(filehead, miniature) + try: + image = Image.open(filename) + except: + image = None + if image: + image_x, image_y = image.size + if settings.CHIMERE_THUMBS_SCALE_HEIGHT: + image_y, image_x = scale_image( + settings.CHIMERE_THUMBS_SCALE_HEIGHT, + (image_y, image_x)) + elif settings.CHIMERE_THUMBS_SCALE_WIDTH: + image_x, image_y = scale_image( + settings.CHIMERE_THUMBS_SCALE_WIDTH, + (image_x, image_y)) + image.thumbnail([image_x, image_y], Image.ANTIALIAS) + + temp_image = open(miniature_filename, 'w') + try: + image.save(temp_image, image.format, quality=90, optimize=1) + except: + image.save(temp_image, image.format, quality=90) + + short_name = miniature_filename[len(settings.MEDIA_ROOT):] + picturefile.thumbnailfile = short_name + picturefile.save() + + if not kwargs['instance'] or not kwargs['created']: + return pfs = PictureFile.objects.filter(marker=picturefile.marker).exclude( pk=picturefile.pk).order_by('order') for idx, pf in enumerate(pfs.all()): |
