Implement Awards to keep track of badge awards, and use notifications to send mail when badges are awarded

This commit is contained in:
Trever Fischer
2012-06-07 16:51:52 -04:00
parent 711e021e8e
commit d776b7bd1c
3 changed files with 21 additions and 6 deletions

View File

@@ -2,3 +2,4 @@ import models
from django.contrib import admin from django.contrib import admin
admin.site.register(models.Badge) admin.site.register(models.Badge)
admin.site.register(models.Award)

View File

@@ -1,9 +1,7 @@
import models import models
import django.dispatch import django.dispatch
badge_awarded = django.dispatch.Signal(providing_args=["user",]) badge_awarded = django.dispatch.Signal(providing_args=["user", "badge"])
def award(user, badge): def award(user, badge, reason=""):
user.badges += badge models.Award.objects.create(badge=badge, user=user, reason=reason)
user.save()
badge_awarded.send_robust(sender=badge, user=user)

View File

@@ -1,5 +1,7 @@
from django.db import models from django.db import models
from django.contrib.auth.models import User from django.contrib.auth.models import User
import api
from notification import models as notification
def unique_slug(item,slug_source,slug_field): def unique_slug(item,slug_source,slug_field):
"""Ensures a unique slug field by appending an integer counter to duplicate slugs. """Ensures a unique slug field by appending an integer counter to duplicate slugs.
@@ -32,7 +34,7 @@ class Badge(models.Model):
name = models.TextField() name = models.TextField()
description = models.TextField() description = models.TextField()
slug = models.SlugField(blank=True) slug = models.SlugField(blank=True)
users = models.ManyToManyField(User, related_name='badges') users = models.ManyToManyField(User, related_name='badges', through='Award', blank=True)
secret = models.BooleanField(default=False) secret = models.BooleanField(default=False)
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
@@ -41,3 +43,17 @@ class Badge(models.Model):
def __unicode__(self): def __unicode__(self):
return self.name return self.name
class Award(models.Model):
badge = models.ForeignKey(Badge)
user = models.ForeignKey(User, related_name='awards')
reason = models.TextField(blank=True)
timestamp = models.DateTimeField(auto_now_add=True)
def save(self, *args, **kwargs):
super(Award, self).save(*args, **kwargs)
api.badge_awarded.send_robust(sender=self, user=self.user, badge=self.badge)
notification.send([self.user], "badge_awarded", {"award": self})
def __unicode__(self):
return "%s for %s"%(self.badge.__unicode__(), self.user.__unicode__())