diff --git a/imagekit/conf.py b/imagekit/conf.py index 4c39edc..7bbb5b9 100644 --- a/imagekit/conf.py +++ b/imagekit/conf.py @@ -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' diff --git a/imagekit/generatedfiles/__init__.py b/imagekit/generatedfiles/__init__.py index 8b1c9cd..5bc93f3 100644 --- a/imagekit/generatedfiles/__init__.py +++ b/imagekit/generatedfiles/__init__.py @@ -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') diff --git a/imagekit/generatedfiles/namers.py b/imagekit/generatedfiles/namers.py new file mode 100644 index 0000000..a20aa5a --- /dev/null +++ b/imagekit/generatedfiles/namers.py @@ -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))) diff --git a/imagekit/specs/__init__.py b/imagekit/specs/__init__.py index 7c096a2..cf37b6f 100644 --- a/imagekit/specs/__init__.py +++ b/imagekit/specs/__init__.py @@ -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__