show karma graph with date-based X range

this is way more interesting of a graph than delta-based, which just
ends up being a linear slope. dunno what i was thinking yesterday
This commit is contained in:
Brian S. Stephan 2016-03-31 16:36:10 -05:00
parent dab41fa7d3
commit e5263d0019
2 changed files with 37 additions and 9 deletions

View File

@ -1,5 +1,6 @@
"""Karma logging models."""
from datetime import timedelta
import logging
import pytz
@ -7,11 +8,19 @@ from irc.client import NickMask
from django.conf import settings
from django.db import models
from django.utils import timezone
log = logging.getLogger('karma.models')
def perdelta(start, end, delta):
curr = start
while curr < end:
yield curr
curr += delta
yield end
class KarmaKeyManager(models.Manager):
"""Manage handy queries for KarmaKey."""
@ -52,18 +61,37 @@ class KarmaKey(models.Model):
return rank+1
return None
def history(self):
def history(self, mode='delta'):
"""Determine the score for this karma entry at every delta."""
history = []
entries = KarmaLogEntry.objects.filter(key=self).order_by('created')
for entry in entries:
timestamp = entry.created
delta = entry.delta
score = KarmaLogEntry.objects.filter(key=self).filter(created__lte=entry.created).aggregate(models.Sum('delta'))['delta__sum']
if mode == 'delta':
entries = KarmaLogEntry.objects.filter(key=self).order_by('created')
for entry in entries:
timestamp = entry.created
delta = entry.delta
score = KarmaLogEntry.objects.filter(key=self).filter(created__lte=entry.created).aggregate(
models.Sum('delta'))['delta__sum']
history.append((timestamp, delta, score))
history.append((timestamp, delta, score))
elif mode == 'date':
first_entry = KarmaLogEntry.objects.filter(key=self).order_by('created')[0]
slice_begin = first_entry.created.date()
slice_end = timezone.now().date()
for timeslice in perdelta(slice_begin, slice_end, timedelta(days=1)):
score = KarmaLogEntry.objects.filter(key=self).filter(
created__lte=timeslice+timedelta(days=1)).aggregate(models.Sum('delta'))['delta__sum']
if not score:
score = 0
try:
prev_score = history[-1][2]
except IndexError:
prev_score = 0
delta = score - prev_score
history.append((timeslice, delta, score))
return history

View File

@ -14,4 +14,4 @@ def key_detail(request, karma_key):
entry = get_object_or_404(KarmaKey, key=karma_key)
return render(request, 'karma/karma_key.html', {'entry': entry, 'entry_history': entry.history()})
return render(request, 'karma/karma_key.html', {'entry': entry, 'entry_history': entry.history(mode='date')})