# HG changeset patch # User Brian Neal # Date 1284316223 0 # Node ID dcc929973bba0ac4005dfb3ee134ed3fcd768b77 # Parent a3b47d0f4df1b5508b76cdac8a3c297684bc1e84 Fix the max users online statistic as per ticket #90. diff -r a3b47d0f4df1 -r dcc929973bba gpp/core/management/commands/max_users.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gpp/core/management/commands/max_users.py Sun Sep 12 18:30:23 2010 +0000 @@ -0,0 +1,44 @@ +""" +max_users is a custom manage.py command. +It is intended to be called from a cron job to calculate the maximum +number of users online statistic. +""" +import datetime + +from django.core.management.base import NoArgsCommand + +from core.models import UserLastVisit, AnonLastVisit, Statistic + + +class Command(NoArgsCommand): + help = "Run periodically to compute the max users online statistic." + + def handle_noargs(self, **options): + + now = datetime.datetime.now() + cut_off = now - datetime.timedelta(minutes=15) + + users = UserLastVisit.objects.filter(last_visit__gte=cut_off).count() + guests = AnonLastVisit.objects.filter(last_visit__gte=cut_off).count() + + updated = False + try: + stat = Statistic.objects.get(pk=1) + except Statistic.DoesNotExist: + stat = Statistic(max_users=users, + max_users_date=now, + max_anon_users=guests, + max_anon_users_date=now) + updated=True + else: + if users > stat.max_users: + stat.max_users = users + stat.max_users_date = now + updated=True + if guests > stat.max_anon_users: + stat.max_anon_users = guests + stat.max_anon_users_date = now + updated=True + + if updated: + stat.save() diff -r a3b47d0f4df1 -r dcc929973bba gpp/core/models.py --- a/gpp/core/models.py Sun Sep 12 04:04:42 2010 +0000 +++ b/gpp/core/models.py Sun Sep 12 18:30:23 2010 +0000 @@ -1,8 +1,10 @@ """ This file contains the core Models used in gpp """ +import datetime + from django.db import models -from django.contrib import auth +from django.contrib.auth.models import User class UserLastVisit(models.Model): @@ -10,7 +12,7 @@ This model represents timestamps indicating a user's last visit to the site. """ - user = models.ForeignKey(auth.models.User, unique=True) + user = models.ForeignKey(User, unique=True) last_visit = models.DateTimeField(db_index=True) @@ -22,3 +24,19 @@ ip = models.CharField(max_length=16, db_index=True, unique=True) last_visit = models.DateTimeField(db_index=True) + +class Statistic(models.Model): + """ + This model keeps track of site statistics. Currently, the only statistic + is the maximum number of users online. This stat is computed by a mgmt. + command that is run on a cron job to peek at the previous two models. + """ + max_users = models.IntegerField() + max_users_date = models.DateTimeField() + max_anon_users = models.IntegerField() + max_anon_users_date = models.DateTimeField() + + def __unicode__(self): + return u'%d users on %s' % (self.max_users, + self.max_users_date.strftime('%Y-%m-%d %H:%M:%S')) + diff -r a3b47d0f4df1 -r dcc929973bba gpp/forums/management/commands/forum_stats.py --- a/gpp/forums/management/commands/forum_stats.py Sun Sep 12 04:04:42 2010 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,29 +0,0 @@ -""" -forum_stats is a custom manage.py command for the forums application. -It is intended to be called from a cron job to calculate various forum -statistics. -""" -from django.core.management.base import NoArgsCommand -from django.core.cache import cache - -from forums.models import Statistic -import forums.middleware - - -class Command(NoArgsCommand): - help = "Run periodically to gather forum statistics." - - def handle_noargs(self, **options): - # update maximum users online statistic - users_online = cache.get(forums.middleware.USERS_ONLINE_KEY) - if users_online: - try: - stats = Statistic.objects.get(pk=1) - except Statistic.DoesNotExist: - stats = Statistic(max_users=0) - - curr_users = len(users_online) - - if curr_users > stats.max_users: - stats.max_users = curr_users - stats.save() diff -r a3b47d0f4df1 -r dcc929973bba gpp/forums/models.py --- a/gpp/forums/models.py Sun Sep 12 04:04:42 2010 +0000 +++ b/gpp/forums/models.py Sun Sep 12 18:30:23 2010 +0000 @@ -361,21 +361,3 @@ def touch(self): self.last_visit = datetime.datetime.now() - -class Statistic(models.Model): - """ - This model keeps track of forum statistics. Currently, the only statistic - is the maximum number of users online. This stat is computed by a mgmt. - command that is run on a cron job to peek at the "users_online" dict - that is maintained in cache by the forums middleware. - """ - max_users = models.IntegerField() - max_users_date = models.DateTimeField() - - def __unicode__(self): - return u'%d users on %s' % (self.max_users, - self.max_users_date.strftime('%Y-%m-%d %H:%M:%S')) - - def save(self, *args, **kwargs): - self.max_users_date = datetime.datetime.now() - super(Statistic, self).save(*args, **kwargs) diff -r a3b47d0f4df1 -r dcc929973bba gpp/forums/templatetags/forum_tags.py --- a/gpp/forums/templatetags/forum_tags.py Sun Sep 12 04:04:42 2010 +0000 +++ b/gpp/forums/templatetags/forum_tags.py Sun Sep 12 18:30:23 2010 +0000 @@ -11,7 +11,7 @@ from forums.models import Topic from forums.models import Post -from forums.models import Statistic +from core.models import Statistic register = template.Library()