diff options
| author | Étienne Loks <etienne.loks@peacefrogs.net> | 2013-08-25 17:35:32 +0200 | 
|---|---|---|
| committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2013-08-25 17:35:32 +0200 | 
| commit | 62d12b1e348323e0acd3f76026defce9aab4e5e0 (patch) | |
| tree | 54218f760a4955d071f934a54811a2be9778894e /ishtar_common/models.py | |
| parent | 255e494370e287c0d0fc78131c4d56e7d805cadb (diff) | |
| download | Ishtar-62d12b1e348323e0acd3f76026defce9aab4e5e0.tar.bz2 Ishtar-62d12b1e348323e0acd3f76026defce9aab4e5e0.zip | |
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
Diffstat (limited to 'ishtar_common/models.py')
| -rw-r--r-- | ishtar_common/models.py | 52 | 
1 files changed, 52 insertions, 0 deletions
| 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 | 
