Allow default generatedfile name configuration w/namers

This commit is contained in:
Matthew Tretter 2013-01-31 22:37:09 -05:00
parent bf1685dbfb
commit e1c819e9b4
4 changed files with 57 additions and 18 deletions

View file

@ -5,6 +5,8 @@ from django.conf import settings
class ImageKitConf(AppConf):
DEFAULT_GENERATEDFILE_BACKEND = 'imagekit.generatedfiles.backends.Simple'
CACHE_BACKEND = None
GENERATEDFILE_NAMER = 'imagekit.generatedfiles.namers.hash'
SPEC_GENERATEDFILE_NAMER = 'imagekit.generatedfiles.namers.source_name_as_path'
GENERATED_FILE_DIR = 'generated/images'
CACHE_PREFIX = 'imagekit:'
DEFAULT_GENERATEDFILE_STRATEGY = 'imagekit.generatedfiles.strategies.JustInTime'

View file

@ -4,7 +4,7 @@ from django.utils.functional import LazyObject
from ..files import BaseIKFile
from ..registry import generator_registry
from ..signals import before_access
from ..utils import get_logger, get_singleton, generate
from ..utils import get_logger, get_singleton, generate, get_by_qname
class GeneratedImageFile(BaseIKFile, ImageFile):
@ -27,7 +27,12 @@ class GeneratedImageFile(BaseIKFile, ImageFile):
"""
self.generator = generator
self.name = name or getattr(generator, 'generatedfile_name', None)
name = name or getattr(generator, 'generatedfile_name', None)
if not name:
fn = get_by_qname(settings.IMAGEKIT_GENERATEDFILE_NAMER, 'namer')
name = fn(generator)
self.name = name
storage = storage or getattr(generator, 'generatedfile_storage',
None) or get_singleton(settings.IMAGEKIT_DEFAULT_FILE_STORAGE,
'file storage backend')

View file

@ -0,0 +1,45 @@
from django.conf import settings
import os
from ..utils import format_to_extension, suggest_extension
def source_name_as_path(generator):
source_filename = getattr(generator.source, 'name', None)
if source_filename is None or os.path.isabs(source_filename):
# Generally, we put the file right in the generated file directory.
dir = settings.IMAGEKIT_GENERATED_FILE_DIR
else:
# For source files with relative names (like Django media files),
# use the source's name to create the new filename.
dir = os.path.join(settings.IMAGEKIT_GENERATED_FILE_DIR,
os.path.splitext(source_filename)[0])
ext = suggest_extension(source_filename or '', generator.format)
return os.path.normpath(os.path.join(dir,
'%s%s' % (generator.get_hash(), ext)))
def source_name_dot_hash(generator):
source_filename = getattr(generator.source, 'name', None)
if source_filename is None or os.path.isabs(source_filename):
# Generally, we put the file right in the generated file directory.
dir = settings.IMAGEKIT_GENERATED_FILE_DIR
else:
# For source files with relative names (like Django media files),
# use the source's name to create the new filename.
dir = os.path.join(settings.IMAGEKIT_GENERATED_FILE_DIR,
os.path.dirname(source_filename))
ext = suggest_extension(source_filename or '', generator.format)
basename = os.path.basename(source_filename)
return os.path.normpath(os.path.join(dir, '%s.%s%s' % (
os.path.splitext(basename)[0], generator.get_hash()[:12], ext)))
def hash(generator):
format = getattr(generator, 'format', None)
ext = format_to_extension(format) if format else ''
return os.path.normpath(os.path.join(settings.IMAGEKIT_GENERATED_FILE_DIR,
'%s%s' % (generator.get_hash(), ext)))

View file

@ -1,12 +1,11 @@
from django.conf import settings
from django.db.models.fields.files import ImageFieldFile
from hashlib import md5
import os
import pickle
from ..generatedfiles.backends import get_default_generatedfile_backend
from ..generatedfiles.strategies import StrategyWrapper
from ..processors import ProcessorPipeline
from ..utils import open_image, img_to_fobj, suggest_extension
from ..utils import open_image, img_to_fobj, get_by_qname
from ..registry import generator_registry, register
@ -84,20 +83,8 @@ class ImageSpec(BaseImageSpec):
@property
def generatedfile_name(self):
source_filename = getattr(self.source, 'name', None)
if source_filename is None or os.path.isabs(source_filename):
# Generally, we put the file right in the generated file directory.
dir = settings.IMAGEKIT_GENERATED_FILE_DIR
else:
# For source files with relative names (like Django media files),
# use the source's name to create the new filename.
dir = os.path.join(settings.IMAGEKIT_GENERATED_FILE_DIR,
os.path.splitext(source_filename)[0])
ext = suggest_extension(source_filename or '', self.format)
return os.path.normpath(os.path.join(dir,
'%s%s' % (self.get_hash(), ext)))
fn = get_by_qname(settings.IMAGEKIT_SPEC_GENERATEDFILE_NAMER, 'namer')
return fn(self)
def __getstate__(self):
state = self.__dict__