changeset 164:f7a6b8fe4556

Implement #46, add a forums stat feature like phpBB.
author Brian Neal <bgneal@gmail.com>
date Mon, 28 Dec 2009 16:52:42 +0000
parents 4f07047e0a40
children 952e05cb3d80
files gpp/forums/management/__init__.py gpp/forums/management/commands/__init__.py gpp/forums/management/commands/forum_stats.py gpp/forums/models.py gpp/forums/templatetags/forum_tags.py gpp/templates/forums/forum_stats_tag.html gpp/templates/forums/index.html gpp/templates/forums/whos_online_tag.html
diffstat 6 files changed, 100 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gpp/forums/management/commands/forum_stats.py	Mon Dec 28 16:52:42 2009 +0000
@@ -0,0 +1,29 @@
+"""
+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()
--- a/gpp/forums/models.py	Tue Dec 22 03:56:26 2009 +0000
+++ b/gpp/forums/models.py	Mon Dec 28 16:52:42 2009 +0000
@@ -337,3 +337,22 @@
         
     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)
--- a/gpp/forums/templatetags/forum_tags.py	Tue Dec 22 03:56:26 2009 +0000
+++ b/gpp/forums/templatetags/forum_tags.py	Mon Dec 28 16:52:42 2009 +0000
@@ -7,8 +7,11 @@
 from django import template
 from django.conf import settings
 from django.core.cache import cache
+from django.contrib.auth.models import User
 
 from forums.models import Topic
+from forums.models import Post
+from forums.models import Statistic
 
 
 register = template.Library()
@@ -143,3 +146,29 @@
         'total': total,
         'users': users,
     }
+
+
+@register.inclusion_tag('forums/forum_stats_tag.html')
+def forum_stats():
+    """
+    Displays forum statistics.
+    """
+    try:
+        stats = Statistic.objects.get(pk=1)
+    except Statistic.DoesNotExist:
+        stats = None
+
+    post_count = Post.objects.all().count()
+    user_count = User.objects.all().count()
+
+    if user_count > 0:
+        latest_user = User.objects.values_list('username', flat=True).order_by('-date_joined')[0]
+    else:
+        latest_user = None
+
+    return {
+        'stats': stats,
+        'post_count': post_count,
+        'user_count': user_count,
+        'latest_user': latest_user,
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gpp/templates/forums/forum_stats_tag.html	Mon Dec 28 16:52:42 2009 +0000
@@ -0,0 +1,8 @@
+<div id="forum-stats">
+Our <strong>{{ user_count }}</strong> users have posted a total of <strong>{{ post_count }}</strong> posts.<br />
+The newest registered user is <a href="{% url bio-view_profile username=latest_user %}">{{ latest_user }}</a>.
+{% if stats %}
+<br />
+The most users ever online was <strong>{{ stats.max_users }}</strong> on {{ stats.max_users_date|date:"P l, N n, Y" }}.
+{% endif %}
+</div>
--- a/gpp/templates/forums/index.html	Tue Dec 22 03:56:26 2009 +0000
+++ b/gpp/templates/forums/index.html	Mon Dec 28 16:52:42 2009 +0000
@@ -1,4 +1,5 @@
 {% extends 'base.html' %}
+{% load cache %}
 {% load forum_tags %}
 {% block title %}Forums{% endblock %}
 {% block content %}
@@ -33,6 +34,9 @@
       </tbody>
    </table>
 {% endfor %}
+{% cache 900 forum-stats-block %}
+{% forum_stats %}
+{% endcache %}
 {% whos_online %}
 <p>{% current_forum_time user %}</p>
 </div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gpp/templates/forums/whos_online_tag.html	Mon Dec 28 16:52:42 2009 +0000
@@ -0,0 +1,11 @@
+<div id="whos-online">
+There {{ total|pluralize:"is,are"}} {{ total }} user{{ total|pluralize }} online: {{ num_users }} registered user{{ num_users|pluralize }} and {{ num_guests }} guest{{ num_guests|pluralize }}.
+{% if num_users %}
+Registered users:
+<ul class="inline-list">
+{% for user in users %}
+<li><a href="{% url bio-view_profile username=user %}">{{ user }}</a></li>
+{% endfor %}
+</ul>
+{% endif %}
+</div>