diff options
-rw-r--r-- | main/utils.py | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/main/utils.py b/main/utils.py index 03441c1..8143ea6 100644 --- a/main/utils.py +++ b/main/utils.py @@ -8,16 +8,19 @@ import hashlib from django.core.cache import cache + CACHE_TIMEOUT = 1800 INVALIDATE_TIMEOUT = 10 CACHE_LATEST_PREFIX = 'cache_latest_' + def cache_function_key(func, args, kwargs): raw = [func.__name__, func.__module__, args, kwargs] pickled = pickle.dumps(raw, protocol=pickle.HIGHEST_PROTOCOL) key = hashlib.md5(pickled).hexdigest() return 'cache_function.' + func.__name__ + '.' + key + def cache_function(length): """ A variant of the snippet posted by Jeff Wheeler at @@ -43,6 +46,7 @@ def cache_function(length): return inner_func return decorator + def clear_cache_function(func, args, kwargs): key = cache_function_key(func, args, kwargs) cache.delete(key) @@ -50,6 +54,7 @@ def clear_cache_function(func, args, kwargs): # utility to make a pair of django choices make_choice = lambda l: [(str(m), str(m)) for m in l] + # These are in here because we would be jumping around in some import circles # and hoops otherwise. The only thing currently using these keys is the feed # caching stuff. @@ -65,6 +70,7 @@ def refresh_latest(**kwargs): # will be valid again. See "Scaling Django" by Mike Malone, slide 30. cache.set(cache_key, None, INVALIDATE_TIMEOUT) + def retrieve_latest(sender): # we could break this down based on the request url, but it would probably # cost us more in query time to do so. @@ -84,6 +90,7 @@ def retrieve_latest(sender): pass return None + def set_created_field(sender, **kwargs): '''This will set the 'created' field on any object to datetime.utcnow() if it is unset. For use as a pre_save signal handler.''' @@ -91,6 +98,7 @@ def set_created_field(sender, **kwargs): if hasattr(obj, 'created') and not obj.created: obj.created = datetime.utcnow() + def groupby_preserve_order(iterable, keyfunc): '''Take an iterable and regroup using keyfunc to determine whether items belong to the same group. The order of the iterable is preserved and @@ -112,6 +120,7 @@ def groupby_preserve_order(iterable, keyfunc): return result + class PackageStandin(object): '''Resembles a Package object, and has a few of the same fields, but is really a link to a pkgbase that has no package with matching pkgname.''' |