this is a djangoification of the old (really old, actually) karma stuff written by mike bloy. functionality should be the same, and might be a bit faster through the ORM now
96 lines
2.7 KiB
Python
96 lines
2.7 KiB
Python
"""Karma logging models."""
|
|
|
|
from __future__ import unicode_literals
|
|
|
|
import logging
|
|
import pytz
|
|
|
|
from irc.client import NickMask
|
|
|
|
from django.conf import settings
|
|
from django.db import models
|
|
|
|
|
|
log = logging.getLogger('karma.models')
|
|
|
|
|
|
class KarmaKeyManager(models.Manager):
|
|
|
|
"""Manage handy queries for KarmaKey."""
|
|
|
|
def ranked_scored_order(self):
|
|
keys = self.annotate(karma_score=models.Sum('karmalogentry__delta')).order_by('-karma_score')
|
|
return keys
|
|
|
|
def ranked_scored_reverse_order(self):
|
|
keys = self.annotate(karma_score=models.Sum('karmalogentry__delta')).order_by('karma_score')
|
|
return keys
|
|
|
|
|
|
class KarmaKey(models.Model):
|
|
|
|
"""Track a thing being karmaed."""
|
|
|
|
key = models.CharField(max_length=200, unique=True)
|
|
|
|
objects = KarmaKeyManager()
|
|
|
|
def __unicode__(self):
|
|
"""String representation."""
|
|
|
|
return "{0:s} ({1:d})".format(self.key, self.score())
|
|
|
|
def score(self):
|
|
"""Determine the score for this karma entry."""
|
|
|
|
return KarmaLogEntry.objects.filter(key=self).aggregate(models.Sum('delta'))['delta__sum']
|
|
|
|
def rank(self):
|
|
"""Determine the rank of this karma entry relative to the others."""
|
|
|
|
sorted_keys = KarmaKey.objects.ranked_scored_order()
|
|
for rank, key in enumerate(sorted_keys):
|
|
if key == self:
|
|
return rank+1
|
|
return None
|
|
|
|
|
|
class KarmaLogEntryManager(models.Manager):
|
|
|
|
"""Manage handy queries for KarmaLogEntry."""
|
|
|
|
def optimists(self):
|
|
karmaers = self.values('nickmask').annotate(karma_outlook=models.Sum('delta')).order_by('-karma_outlook')
|
|
return karmaers
|
|
|
|
def pessimists(self):
|
|
karmaers = self.values('nickmask').annotate(karma_outlook=models.Sum('delta')).order_by('karma_outlook')
|
|
return karmaers
|
|
|
|
def most_opinionated(self):
|
|
karmaers = self.values('nickmask').annotate(karma_count=models.Count('delta')).order_by('-karma_count')
|
|
return karmaers
|
|
|
|
|
|
class KarmaLogEntry(models.Model):
|
|
|
|
"""Track each karma increment/decrement."""
|
|
|
|
key = models.ForeignKey('KarmaKey')
|
|
delta = models.SmallIntegerField()
|
|
nickmask = models.CharField(max_length=200, default='', blank=True)
|
|
created = models.DateTimeField(auto_now_add=True)
|
|
|
|
objects = KarmaLogEntryManager()
|
|
|
|
class Meta:
|
|
verbose_name_plural = 'karma log entries'
|
|
|
|
def __unicode__(self):
|
|
"""String representation."""
|
|
|
|
tz = pytz.timezone(settings.TIME_ZONE)
|
|
return "{0:s}{1:s} @ {2:s} by {3:s}".format(self.key.key, '++' if self.delta > 0 else '--',
|
|
self.created.astimezone(tz).strftime('%Y-%m-%d %H:%M:%S %Z'),
|
|
NickMask(self.nickmask).nick)
|