summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
Diffstat (limited to 'main')
-rw-r--r--main/utils.py9
1 files changed, 9 insertions, 0 deletions
diff --git a/main/utils.py b/main/utils.py
index 03441c15..8143ea6a 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.'''