forked from benadida/helios-server
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstats_views.py
66 lines (48 loc) · 2.59 KB
/
stats_views.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
"""
Helios stats views
"""
from django.core.urlresolvers import reverse
from django.core.mail import send_mail
from django.core.paginator import Paginator
from django.http import *
from django.db import transaction
from django.db.models import *
from security import *
from helios_auth.security import get_user, save_in_session_across_logouts
from view_utils import *
from helios import tasks
def require_admin(request):
user = get_user(request)
if not user or not user.admin_p:
raise PermissionDenied()
return user
def home(request):
user = require_admin(request)
num_votes_in_queue = CastVote.objects.filter(invalidated_at=None, verified_at=None).count()
return render_template(request, 'stats', {'num_votes_in_queue': num_votes_in_queue})
def force_queue(request):
user = require_admin(request)
votes_in_queue = CastVote.objects.filter(invalidated_at=None, verified_at=None)
for cv in votes_in_queue:
tasks.cast_vote_verify_and_store.delay(cv.id)
return HttpResponseRedirect(reverse(home))
def elections(request):
user = require_admin(request)
page = int(request.GET.get('page', 1))
limit = int(request.GET.get('limit', 25))
elections = Election.objects.all().order_by('-created_at')
elections_paginator = Paginator(elections, limit)
elections_page = elections_paginator.page(page)
return render_template(request, "stats_elections", {'elections' : elections_page.object_list, 'elections_page': elections_page,
'limit' : limit})
def recent_votes(request):
user = require_admin(request)
# elections with a vote in the last 24 hours, ordered by most recent cast vote time
# also annotated with number of votes cast in last 24 hours
elections_with_votes_in_24hours = Election.objects.filter(voter__castvote__cast_at__gt= datetime.datetime.utcnow() - datetime.timedelta(days=1)).annotate(last_cast_vote = Max('voter__castvote__cast_at'), num_recent_cast_votes = Count('voter__castvote')).order_by('-last_cast_vote')
return render_template(request, "stats_recent_votes", {'elections' : elections_with_votes_in_24hours})
def recent_problem_elections(request):
user = require_admin(request)
# elections left unfrozen older than 1 day old (and younger than 10 days old, so we don't go back too far)
elections_with_problems = Election.objects.filter(frozen_at = None, created_at__gt = datetime.datetime.utcnow() - datetime.timedelta(days=10), created_at__lt = datetime.datetime.utcnow() - datetime.timedelta(days=1) )
return render_template(request, "stats_problem_elections", {'elections' : elections_with_problems})