mirror of
https://github.com/Hopiu/django-imagekit.git
synced 2026-03-17 05:40:25 +00:00
43 lines
1.7 KiB
Python
43 lines
1.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
from __future__ import absolute_import
|
|
|
|
from imagekit.imagecache import PessimisticImageCacheBackend, InvalidImageCacheBackendError
|
|
|
|
|
|
def generate(model, pk, attr):
|
|
try:
|
|
instance = model._default_manager.get(pk=pk)
|
|
except model.DoesNotExist:
|
|
pass # The model was deleted since the task was scheduled. NEVER MIND!
|
|
else:
|
|
field_file = getattr(instance, attr)
|
|
field_file.delete(save=False)
|
|
field_file.generate(save=True)
|
|
|
|
|
|
class CeleryImageCacheBackend(PessimisticImageCacheBackend):
|
|
"""
|
|
A pessimistic cache state backend that uses celery to generate its spec
|
|
images. Like PessimisticCacheStateBackend, this one checks to see if the
|
|
file exists on validation, so the storage is hit fairly frequently, but an
|
|
image is guaranteed to exist. However, while validation guarantees the
|
|
existence of *an* image, it does not necessarily guarantee that you will get
|
|
the correct image, as the spec may be pending regeneration. In other words,
|
|
while there are `generate` tasks in the queue, it is possible to get a
|
|
stale spec image. The tradeoff is that calling `invalidate()` won't block
|
|
to interact with file storage.
|
|
|
|
"""
|
|
def __init__(self):
|
|
try:
|
|
from celery.task import task
|
|
except:
|
|
raise InvalidImageCacheBackendError("Celery image cache backend requires either the 'celery' library")
|
|
if not getattr(CeleryImageCacheBackend, '_task', None):
|
|
CeleryImageCacheBackend._task = task(generate)
|
|
|
|
def invalidate(self, file):
|
|
self._task.delay(file.instance.__class__, file.instance.pk, file.attname)
|
|
|
|
def clear(self, file):
|
|
file.delete(save=False)
|