view gpp/forums/stats.py @ 445:e9f203c5f5bb

Attempting to fix #218; update the topic last visit time with 'now' when viewing the last page of a topic, otherwise use the creation time of the last post on the page.
author Brian Neal <bgneal@gmail.com>
date Wed, 08 Jun 2011 00:24:41 +0000
parents e10fa0d8e7ad
children e94570675664
line wrap: on
line source
"""
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