annotate gpp/forums/stats.py @ 429:d0f0800eef0c

Making the jquery tabbed version of the messages app the current version and removing the old. Also figured out how to dynamically update the base template's count of unread messages when messages are read.
author Brian Neal <bgneal@gmail.com>
date Tue, 03 May 2011 02:56:58 +0000
parents e10fa0d8e7ad
children e94570675664
rev   line source
bgneal@395 1 """
bgneal@395 2 This module is responsible for managing various forum statistics.
bgneal@395 3
bgneal@395 4 """
bgneal@395 5 from django.core.cache import cache
bgneal@395 6 from django.contrib.auth.models import User
bgneal@395 7
bgneal@395 8 from forums.models import Post
bgneal@395 9
bgneal@395 10
bgneal@395 11 CACHE_KEY = 'forums-stats'
bgneal@395 12 CACHE_TIMEOUT = 4 * 60 * 60 # seconds
bgneal@395 13
bgneal@395 14
bgneal@395 15 def calc_stats():
bgneal@395 16 """
bgneal@395 17 This function is responsible for computing the forum statistics.
bgneal@395 18 A tuple is returned: (forums post count, active user count, latest username)
bgneal@395 19
bgneal@395 20 """
bgneal@395 21 post_count = Post.objects.all().count()
bgneal@395 22 user_count = User.objects.all().count()
bgneal@395 23
bgneal@395 24 if user_count > 0:
bgneal@395 25 latest_user = User.objects.filter(is_active=True).values_list(
bgneal@395 26 'username', flat=True).order_by('-date_joined')[0]
bgneal@395 27 else:
bgneal@395 28 latest_user = None
bgneal@395 29
bgneal@395 30 return post_count, user_count, latest_user
bgneal@395 31
bgneal@395 32
bgneal@395 33 def update_stats():
bgneal@395 34 """
bgneal@395 35 This function is responsible for computing the forum statistics and
bgneal@395 36 inserting them into the cache. The stats are returned.
bgneal@395 37
bgneal@395 38 This function should be run periodically, preferably outside of the
bgneal@395 39 request/response cycle. On MySQL under InnoDb it is expensive to retrieve
bgneal@395 40 the total post count.
bgneal@395 41
bgneal@395 42 """
bgneal@395 43 stats = calc_stats()
bgneal@395 44 cache.set(CACHE_KEY, stats, CACHE_TIMEOUT)
bgneal@395 45 return stats
bgneal@395 46
bgneal@395 47
bgneal@395 48 def retrieve_stats():
bgneal@395 49 """
bgneal@395 50 This function retrieves the forum stats from the cache if they are
bgneal@395 51 available. If there is a cache-miss, the stats are calcuated, the cache is
bgneal@395 52 updated, and the stats returned.
bgneal@395 53
bgneal@395 54 """
bgneal@395 55 stats = cache.get(CACHE_KEY)
bgneal@395 56 if stats is None:
bgneal@395 57 stats = update_stats()
bgneal@395 58
bgneal@395 59 return stats