django-imagekit/imagekit/files.py

84 lines
2.7 KiB
Python
Raw Normal View History

2012-10-17 01:31:47 +00:00
from django.core.files.base import ContentFile
2012-02-12 05:06:52 +00:00
from django.db.models.fields.files import ImageFieldFile
2012-10-17 01:31:47 +00:00
from django.utils.encoding import smart_str, smart_unicode
import os
from .utils import (SpecWrapper, suggest_extension, format_to_mimetype,
extension_to_mimetype)
2012-02-12 05:06:52 +00:00
class ImageSpecFile(ImageFieldFile):
2012-02-12 21:00:43 +00:00
def __init__(self, spec, source_file, spec_id):
spec = SpecWrapper(spec)
self.storage = spec.storage or source_file.storage
self.spec = spec
2012-02-12 05:06:52 +00:00
self.source_file = source_file
self.spec_id = spec_id
def get_hash(self):
return self.spec.get_hash(self.source_file)
2012-02-12 05:06:52 +00:00
@property
def url(self):
self.validate()
return super(ImageFieldFile, self).url
def _get_file(self):
self.validate()
return super(ImageFieldFile, self).file
file = property(_get_file, ImageFieldFile._set_file, ImageFieldFile._del_file)
def clear(self):
2012-02-12 21:00:43 +00:00
return self.spec.image_cache_backend.clear(self)
2012-02-12 05:06:52 +00:00
def invalidate(self):
2012-02-12 21:00:43 +00:00
return self.spec.image_cache_backend.invalidate(self)
2012-02-12 05:06:52 +00:00
def validate(self):
2012-02-12 21:00:43 +00:00
return self.spec.image_cache_backend.validate(self)
2012-02-12 05:06:52 +00:00
@property
def name(self):
name = self.spec.generate_filename(self.source_file)
if name is not None:
return name
else:
source_filename = self.source_file.name
filepath, basename = os.path.split(source_filename)
filename = os.path.splitext(basename)[0]
extension = suggest_extension(source_filename, self.spec.format)
new_name = '%s%s' % (filename, extension)
cache_filename = ['cache', 'iktt'] + self.spec_id.split(':') + \
[filepath, new_name]
return os.path.join(*cache_filename)
2012-02-12 05:06:52 +00:00
def generate(self, save=True):
2012-10-05 01:37:20 +00:00
return self.spec.generate_file(self.name, self.source_file, save)
2012-10-17 01:31:47 +00:00
class IKContentFile(ContentFile):
"""
Wraps a ContentFile in a file-like object with a filename and a
content_type. A PIL image format can be optionally be provided as a content
type hint.
"""
def __init__(self, filename, content, format=None):
self.file = ContentFile(content)
self.file.name = filename
mimetype = getattr(self.file, 'content_type', None)
if format and not mimetype:
mimetype = format_to_mimetype(format)
if not mimetype:
ext = os.path.splitext(filename or '')[1]
mimetype = extension_to_mimetype(ext)
self.file.content_type = mimetype
def __str__(self):
return smart_str(self.file.name or '')
def __unicode__(self):
return smart_unicode(self.file.name or u'')