2012-02-18 06:56:17 +00:00
|
|
|
from django.db import models
|
|
|
|
|
|
2017-05-18 20:38:32 +00:00
|
|
|
from imagekit import ImageSpec
|
2013-01-24 03:35:57 +00:00
|
|
|
from imagekit.models import ProcessedImageField
|
2012-04-21 01:43:59 +00:00
|
|
|
from imagekit.models import ImageSpecField
|
2013-01-24 03:07:31 +00:00
|
|
|
from imagekit.processors import Adjust, ResizeToFill, SmartCrop
|
2012-02-18 06:56:17 +00:00
|
|
|
|
|
|
|
|
|
2017-05-18 20:38:32 +00:00
|
|
|
class Thumbnail(ImageSpec):
|
|
|
|
|
processors = [ResizeToFill(100, 60)]
|
|
|
|
|
format = 'JPEG'
|
|
|
|
|
options = {'quality': 60}
|
|
|
|
|
|
|
|
|
|
|
2013-01-24 03:54:08 +00:00
|
|
|
class ImageModel(models.Model):
|
|
|
|
|
image = models.ImageField(upload_to='b')
|
|
|
|
|
|
|
|
|
|
|
2012-02-18 06:56:17 +00:00
|
|
|
class Photo(models.Model):
|
|
|
|
|
original_image = models.ImageField(upload_to='photos')
|
|
|
|
|
|
2013-04-03 04:21:04 +00:00
|
|
|
# Implicit source field
|
2012-02-18 06:56:17 +00:00
|
|
|
thumbnail = ImageSpecField([Adjust(contrast=1.2, sharpness=1.1),
|
2013-04-03 04:21:04 +00:00
|
|
|
ResizeToFill(50, 50)], format='JPEG',
|
|
|
|
|
options={'quality': 90})
|
2012-02-18 06:56:17 +00:00
|
|
|
|
|
|
|
|
smartcropped_thumbnail = ImageSpecField([Adjust(contrast=1.2,
|
2012-12-01 21:46:10 +00:00
|
|
|
sharpness=1.1), SmartCrop(50, 50)], source='original_image',
|
2012-02-18 06:56:17 +00:00
|
|
|
format='JPEG', options={'quality': 90})
|
|
|
|
|
|
|
|
|
|
|
2013-01-24 03:35:57 +00:00
|
|
|
class ProcessedImageFieldModel(models.Model):
|
|
|
|
|
processed = ProcessedImageField([SmartCrop(50, 50)], format='JPEG',
|
|
|
|
|
options={'quality': 90}, upload_to='p')
|
|
|
|
|
|
|
|
|
|
|
2017-05-18 20:38:32 +00:00
|
|
|
class ProcessedImageFieldWithSpecModel(models.Model):
|
|
|
|
|
processed = ProcessedImageField(spec=Thumbnail, upload_to='p')
|
|
|
|
|
|
|
|
|
|
|
2013-02-10 20:41:24 +00:00
|
|
|
class CountingCacheFileStrategy(object):
|
|
|
|
|
def __init__(self):
|
2013-05-10 08:39:46 +00:00
|
|
|
self.on_existence_required_count = 0
|
|
|
|
|
self.on_content_required_count = 0
|
2013-05-25 03:21:30 +00:00
|
|
|
self.on_source_saved_count = 0
|
2013-02-10 20:41:24 +00:00
|
|
|
|
2013-05-10 08:39:46 +00:00
|
|
|
def on_existence_required(self, file):
|
|
|
|
|
self.on_existence_required_count += 1
|
|
|
|
|
|
|
|
|
|
def on_content_required(self, file):
|
|
|
|
|
self.on_content_required_count += 1
|
2013-02-10 20:41:24 +00:00
|
|
|
|
2013-05-25 03:21:30 +00:00
|
|
|
def on_source_saved(self, file):
|
|
|
|
|
self.on_source_saved_count += 1
|
2013-02-10 20:41:24 +00:00
|
|
|
|
|
|
|
|
|
2012-02-18 06:56:17 +00:00
|
|
|
class AbstractImageModel(models.Model):
|
|
|
|
|
original_image = models.ImageField(upload_to='photos')
|
2013-02-10 20:41:24 +00:00
|
|
|
abstract_class_spec = ImageSpecField(source='original_image',
|
|
|
|
|
format='JPEG',
|
|
|
|
|
cachefile_strategy=CountingCacheFileStrategy())
|
2012-02-18 06:56:17 +00:00
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
abstract = True
|
|
|
|
|
|
|
|
|
|
|
2013-02-10 20:41:24 +00:00
|
|
|
class ConcreteImageModel(AbstractImageModel):
|
|
|
|
|
pass
|
2013-02-10 20:54:17 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class ConcreteImageModelSubclass(ConcreteImageModel):
|
|
|
|
|
pass
|