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:
parent
dab41fa7d3
commit
e5263d0019
|
@ -1,5 +1,6 @@
|
||||||
"""Karma logging models."""
|
"""Karma logging models."""
|
||||||
|
|
||||||
|
from datetime import timedelta
|
||||||
import logging
|
import logging
|
||||||
import pytz
|
import pytz
|
||||||
|
|
||||||
|
@ -7,11 +8,19 @@ from irc.client import NickMask
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
from django.utils import timezone
|
||||||
|
|
||||||
log = logging.getLogger('karma.models')
|
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):
|
class KarmaKeyManager(models.Manager):
|
||||||
|
|
||||||
"""Manage handy queries for KarmaKey."""
|
"""Manage handy queries for KarmaKey."""
|
||||||
|
@ -52,18 +61,37 @@ class KarmaKey(models.Model):
|
||||||
return rank+1
|
return rank+1
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def history(self):
|
def history(self, mode='delta'):
|
||||||
"""Determine the score for this karma entry at every delta."""
|
"""Determine the score for this karma entry at every delta."""
|
||||||
|
|
||||||
history = []
|
history = []
|
||||||
|
|
||||||
entries = KarmaLogEntry.objects.filter(key=self).order_by('created')
|
if mode == 'delta':
|
||||||
for entry in entries:
|
entries = KarmaLogEntry.objects.filter(key=self).order_by('created')
|
||||||
timestamp = entry.created
|
for entry in entries:
|
||||||
delta = entry.delta
|
timestamp = entry.created
|
||||||
score = KarmaLogEntry.objects.filter(key=self).filter(created__lte=entry.created).aggregate(models.Sum('delta'))['delta__sum']
|
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
|
return history
|
||||||
|
|
||||||
|
|
|
@ -14,4 +14,4 @@ def key_detail(request, karma_key):
|
||||||
|
|
||||||
entry = get_object_or_404(KarmaKey, key=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')})
|
||||||
|
|
Loading…
Reference in New Issue