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.""" | ||||
| 
 | ||||
| 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 | ||||
| 
 | ||||
|  | ||||
| @ -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')}) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user