From 2bae28290b1802d27a560da184476b83c711c5a1 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Sun, 25 Aug 2013 17:35:32 +0200 Subject: Add images to finds (refs #1314) * an abstract model class has been defined to manage image and thumbnail with resizing on the fly * max size for images and thumbnails are set in project settings * new field have been added to Find model to save images and thumbnails * form and wizard of Find have been changed --- ishtar_common/models.py | 52 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) (limited to 'ishtar_common/models.py') diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 12b1b79f9..fc4cdbd17 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -20,10 +20,14 @@ """ Models description """ +from cStringIO import StringIO import datetime +from PIL import Image +import os from django.conf import settings from django.core.exceptions import ObjectDoesNotExist, ValidationError +from django.core.files.uploadedfile import SimpleUploadedFile from django.core.validators import validate_slug from django.utils.translation import ugettext_lazy as _, ugettext from django.utils.safestring import SafeUnicode, mark_safe @@ -258,6 +262,54 @@ class GeneralType(models.Model): for child in cls._get_childs(item, dct, instances, exclude=exclude): yield child +class ImageModel(models.Model): + image = models.ImageField(upload_to="upload/", blank=True, null=True) + thumbnail = models.ImageField(upload_to='upload/thumbs/', blank=True, + null=True) + IMAGE_MAX_SIZE = settings.IMAGE_MAX_SIZE + THUMB_MAX_SIZE = settings.THUMB_MAX_SIZE + + class Meta: + abstract = True + + def has_changed(self, field): + if not self.pk: + return True + manager = getattr(self.__class__, 'objects') + old = getattr(manager.get(pk=self.pk), field) + return not getattr(self, field) == old + + def create_thumb(self, image, size): + """Returns the image resized to fit inside a box of the given size""" + image.thumbnail(size, Image.ANTIALIAS) + temp = StringIO() + image.save(temp, 'jpeg') + temp.seek(0) + return SimpleUploadedFile('temp', temp.read()) + + def save(self, *args, **kwargs): + # manage images + if self.has_changed('image'): + # convert to jpg + filename = os.path.splitext(os.path.split(self.image.name)[-1])[0] + filename = "%s.jpg" % filename + image = Image.open(self.image.file) + + # convert to RGB + if image.mode not in ('L', 'RGB'): + image = image.convert('RGB') + + # resize if necessary + self.image.save(filename, + self.create_thumb(image, self.IMAGE_MAX_SIZE), + save=False) + + # save the thumbnail + self.thumbnail.save('_%s' % filename, + self.create_thumb(image, self.THUMB_MAX_SIZE), + save=False) + super(ImageModel, self).save(*args, **kwargs) + class HistoryError(Exception): def __init__(self, value): self.value = value -- cgit v1.2.3