Mercurial > public > sg101
diff gpp/forums/stats.py @ 395:e10fa0d8e7ad
Fixing #192; cache some forum stats and have them be computed outside of the request/response cycle. Update the template tag to just read the cache.
author | Brian Neal <bgneal@gmail.com> |
---|---|
date | Fri, 25 Mar 2011 00:27:10 +0000 |
parents | |
children | e94570675664 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gpp/forums/stats.py Fri Mar 25 00:27:10 2011 +0000 @@ -0,0 +1,59 @@ +""" +This module is responsible for managing various forum statistics. + +""" +from django.core.cache import cache +from django.contrib.auth.models import User + +from forums.models import Post + + +CACHE_KEY = 'forums-stats' +CACHE_TIMEOUT = 4 * 60 * 60 # seconds + + +def calc_stats(): + """ + This function is responsible for computing the forum statistics. + A tuple is returned: (forums post count, active user count, latest username) + + """ + post_count = Post.objects.all().count() + user_count = User.objects.all().count() + + if user_count > 0: + latest_user = User.objects.filter(is_active=True).values_list( + 'username', flat=True).order_by('-date_joined')[0] + else: + latest_user = None + + return post_count, user_count, latest_user + + +def update_stats(): + """ + This function is responsible for computing the forum statistics and + inserting them into the cache. The stats are returned. + + This function should be run periodically, preferably outside of the + request/response cycle. On MySQL under InnoDb it is expensive to retrieve + the total post count. + + """ + stats = calc_stats() + cache.set(CACHE_KEY, stats, CACHE_TIMEOUT) + return stats + + +def retrieve_stats(): + """ + This function retrieves the forum stats from the cache if they are + available. If there is a cache-miss, the stats are calcuated, the cache is + updated, and the stats returned. + + """ + stats = cache.get(CACHE_KEY) + if stats is None: + stats = update_stats() + + return stats