From e5263d0019258d640ea404af6f030433e094a31a Mon Sep 17 00:00:00 2001 From: "Brian S. Stephan" Date: Thu, 31 Mar 2016 16:36:10 -0500 Subject: [PATCH] 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 --- dr_botzo/karma/models.py | 44 ++++++++++++++++++++++++++++++++-------- dr_botzo/karma/views.py | 2 +- 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/dr_botzo/karma/models.py b/dr_botzo/karma/models.py index 12b1d67..2d58441 100644 --- a/dr_botzo/karma/models.py +++ b/dr_botzo/karma/models.py @@ -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 diff --git a/dr_botzo/karma/views.py b/dr_botzo/karma/views.py index dab855c..4f7abaf 100644 --- a/dr_botzo/karma/views.py +++ b/dr_botzo/karma/views.py @@ -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')})