~ronnie.vd.c/ubuntu-elections/port-to-django-1-1

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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
from django.conf import settings
if getattr(settings, 'IS_DJANGO_1_1', False):
    from common import messages
else:
    from django.contrib import messages

from django.contrib.auth.decorators import login_required, permission_required
from django.db import IntegrityError
from django.views.generic.simple import direct_to_template
from django.shortcuts import redirect
from django.template import RequestContext
from django.http import Http404
from django.utils.translation import ugettext as _
from django_openid_auth.models import UserOpenID
import hashlib

from ubuntu_voting.settings import SECRET_KEY, SECRET_KEY2

from common.decorators import custom_permission_required
from common.launchpad import lp
from elections.models import Election, Candidate, Voter
from elections.forms import CreateElectionForm, ApplyForElectionForm, VoteForm

import datetime

def account(request):
    # TODO: Write this view
    return direct_to_template(request, 'election/election_new.html', {})

def election_queue(request):
    elections = Election.objects.filter(candidature_start__gt=datetime.datetime.now())
    return direct_to_template(request, 'election/election_list.html', {'elections': elections})

def election_active(request):
    final_active_date = datetime.datetime.now() - datetime.timedelta(days=30)
    elections = Election.objects.filter(candidature_start__lt=datetime.datetime.now(), election_end__gt=final_active_date)
    return direct_to_template(request, 'election/election_list.html', {'elections': elections})

def election_past(request):
    elections = Election.objects.filter(election_end__lt=datetime.datetime.now())
    return direct_to_template(request, 'election/election_list.html', {'elections': elections})
    
def election_detail(request, slug):
    election = Election.objects.get(slug=slug)
    if election.is_election_end():
        return election_results(request, slug)
    return direct_to_template(request, 'election/election_detail.html', {'election': election})

@custom_permission_required('elections.add_election')
def election_new(request):
    form = CreateElectionForm(data=request.POST or None)
    
    if request.POST and form.is_valid():
        election = form.save()
        messages.success(request, _('The election has been saved'))
        return redirect(election_detail, slug=election.slug)
    
    return direct_to_template(request, 'election/election_new.html', {'form': form})
    
@custom_permission_required('elections.change_election')
def election_edit(request, slug):
    election = Election.objects.get(slug=slug)
    
    form = CreateElectionForm(data=request.POST or None, instance=election)
    
    if request.POST and form.is_valid():
        election = form.save()
        messages.success(request, _('The election has been edited'))
        return redirect(election_detail, slug=election.slug)
     
    return direct_to_template(request, 'election/election_edit.html', {'form': form, 'election': election})   

@custom_permission_required('elections.can_becandidate')
def election_run(request, slug):
    election = Election.objects.get(slug=slug)
    if datetime.datetime.now() < election.candidature_start:
        messages.error(request, _('The candidature period hasn\'t started yet'))
        return redirect(election_detail, slug=election.slug)
    if datetime.datetime.now() > election.candidature_end:
        messages.error(request, _('The candidature period has ended already'))
        return redirect(election_detail, slug=election.slug)

    candidate, created = Candidate.objects.get_or_create(election=election, user=request.user)
    form = ApplyForElectionForm(data=request.POST or None, instance=candidate)
    
    if request.POST and form.is_valid():
        candidate = form.save(commit=False)
        candidate.display_name = lp.people[candidate.user.username].display_name
        candidate.lp_profile = u"https://launchpad.net/~" + lp.people[candidate.user.username].name
        candidate.save()
        messages.success(request, _('Your candidature has been edited successfully'))
        return redirect(election_detail, slug=election.slug)
       
    return direct_to_template(request, 'election/election_candidature.html', {'form': form, 'election': election})

@custom_permission_required('elections.can_vote')
def election_vote(request, slug):
    election = Election.objects.get(slug=slug)
    if datetime.datetime.now() < election.election_start:
        messages.error(request, _('The election hasn\'t started yet'))
        return redirect(election_detail, slug=election.slug)
    if datetime.datetime.now() > election.election_end:
        messages.error(request, _('The election has ended already'))
        return redirect(election_detail, slug=election.slug)
    if len(Candidate.objects.filter(election=election)) < election.candidature_amount:
        messages.error(request, _('There aren\'t enough candidates running for the Community Council to let the elections begin'))
        return redirect(election_detail, slug=election.slug)
    
    # Do some extensive hashing of the voter's OpenID to prevent easy decryption
    openid = UserOpenID.objects.get(user=request.user)    
    user_hash = hashlib.sha256(openid.claimed_id)
    user_hash.update(SECRET_KEY)
    user_hash = hashlib.sha256(user_hash.hexdigest())
    user_hash.update(SECRET_KEY2)
    for i in range(0,10):
        user_hash = hashlib.sha256(user_hash.hexdigest())

    try: # If the voter already exists, it has already voted, raise an exception!
        Voter.objects.get(election=election, voter=user_hash.hexdigest())
    except Voter.DoesNotExist:
        pass
    else:
        messages.error(request, _('You\'ve already voted'))
        return redirect(election_detail, slug=election.slug)
    
    form = VoteForm(data=request.POST or None, election=election)
    print form.fields
    if request.POST and form.is_valid():
        form.save()
        Voter.objects.create(election=election, voter=user_hash.hexdigest())
        messages.success(request, _('You\'ve voted successfully'))
        return redirect(election_detail, slug=election.slug)
        
    return direct_to_template(request, 'election/election_vote.html', {'form': form,
                                                                       'election': election})

    
def election_results(request, slug):
    election = Election.objects.get(slug=slug)
    if datetime.datetime.now() < election.election_start:
        if election.live_results:
            messages.error(request, _('The voting hasn\'t begun yet, the first results will be visible on %(date)s.') % election.election_start)
            return redirect(election_detail, slug=election.slug)
        else:
            messages.error(request, _('The voting hasn\'t begun yet, the first results will be visible on %(date)s.') % election.election_end)
            return redirect(election_detail, slug=election.slug)
    if datetime.datetime.now() < election.election_end and not election.live_results:
        messages.error(request, _('The results will be visible after the vote has finished, on %(date)s.') % election.election_end)
        return redirect(election_detail, slug=election.slug)
    
    return direct_to_template(request, 'election/election_results.html', {'election': election,})