2010-06-20 22:50:13 -07:00
|
|
|
try:
|
|
|
|
import cPickle as pickle
|
|
|
|
except ImportError:
|
|
|
|
import pickle
|
|
|
|
from django.utils.hashcompat import md5_constructor
|
|
|
|
|
|
|
|
def cache_function(length):
|
|
|
|
"""
|
|
|
|
A variant of the snippet posted by Jeff Wheeler at
|
|
|
|
http://www.djangosnippets.org/snippets/109/
|
|
|
|
|
|
|
|
Caches a function, using the function and its arguments as the key, and the
|
|
|
|
return value as the value saved. It passes all arguments on to the
|
|
|
|
function, as it should.
|
|
|
|
|
|
|
|
The decorator itself takes a length argument, which is the number of
|
|
|
|
seconds the cache will keep the result around.
|
|
|
|
"""
|
|
|
|
def decorator(func):
|
|
|
|
def inner_func(*args, **kwargs):
|
|
|
|
from django.core.cache import cache
|
|
|
|
|
|
|
|
raw = [func.__name__, func.__module__, args, kwargs]
|
|
|
|
pickled = pickle.dumps(raw, protocol=pickle.HIGHEST_PROTOCOL)
|
|
|
|
key = md5_constructor(pickled).hexdigest()
|
2010-07-10 14:23:33 -07:00
|
|
|
key = 'cache_function.' + func.__name__ + '.' + key
|
2010-06-20 22:50:13 -07:00
|
|
|
value = cache.get(key)
|
|
|
|
if value is not None:
|
|
|
|
return value
|
|
|
|
else:
|
|
|
|
result = func(*args, **kwargs)
|
|
|
|
cache.set(key, result, length)
|
|
|
|
return result
|
|
|
|
return inner_func
|
|
|
|
return decorator
|
|
|
|
|
2008-10-07 11:53:56 -07:00
|
|
|
#utility to make a pair of django choices
|
|
|
|
make_choice = lambda l: [(str(m), str(m)) for m in l]
|