diff --git a/auth/auth_systems/password.py b/auth/auth_systems/password.py index 83fbfae80ccd5e7df672a6debd6380a43b538b54..cbec6c9ce12d36057d47c908ffdeb5f3e53f9110 100644 --- a/auth/auth_systems/password.py +++ b/auth/auth_systems/password.py @@ -114,7 +114,6 @@ def update_status(token, message): pass def send_message(user_id, user_name, user_info, subject, body): - if user_info.has_key('email'): - email = user_info['email'] - name = user_name or user_info.get('name', email) - send_mail(subject, body, settings.SERVER_EMAIL, ["%s <%s>" % (name, email)], fail_silently=False) + email = user_id + name = user_name or user_info.get('name', email) + send_mail(subject, body, settings.SERVER_EMAIL, ["%s <%s>" % (name, email)], fail_silently=False) diff --git a/helios/models.py b/helios/models.py index 0de508e123f6c152b9253d0aecc6b38c1f92a572..57fa376e29c7080134b76517ab664d177079c5a4 100644 --- a/helios/models.py +++ b/helios/models.py @@ -9,6 +9,7 @@ Ben Adida from django.db import models, transaction from django.utils import simplejson from django.conf import settings +from django.core.mail import send_mail import datetime, logging, uuid, random @@ -510,9 +511,8 @@ class VoterFile(models.Model): if len(voter) > 2: name = voter[2] - # create the user -- NO MORE! - # user = User.update_or_create(user_type='password', user_id=voter_id, info = {'password': heliosutils.random_string(10), 'email': email, 'name': name}) - # user.save() + # create the user -- NO MORE + # user = User.update_or_create(user_type='password', user_id=email, info = {'name': name}) # does voter for this user already exist voter = Voter.get_by_election_and_voter_id(election, voter_id) @@ -520,7 +520,8 @@ class VoterFile(models.Model): # create the voter if not voter: voter_uuid = str(uuid.uuid4()) - voter = Voter(uuid= voter_uuid, user = None, voter_login_id = voter_id, voter_name = name, election = election) + voter = Voter(uuid= voter_uuid, user = None, voter_login_id = voter_id, + voter_name = name, voter_email = email, election = election) voter.generate_password() new_voters.append(voter) voter.save() @@ -546,12 +547,15 @@ class Voter(models.Model, electionalgs.Voter): # let's link directly to the user now # voter_type = models.CharField(max_length = 100) + # for users of type password, no user object is created + # but a dynamic user object is created automatically user = models.ForeignKey('auth.User', null=True) # if user is null, then you need a voter login ID and password voter_login_id = models.CharField(max_length = 100, null=True) voter_password = models.CharField(max_length = 100, null=True) voter_name = models.CharField(max_length = 200, null=True) + voter_email = models.CharField(max_length = 250, null=True) uuid = models.CharField(max_length = 50) @@ -563,6 +567,13 @@ class Voter(models.Model, electionalgs.Voter): vote_hash = models.CharField(max_length = 100, null=True) cast_at = models.DateTimeField(auto_now_add=False, null=True) + def __init__(self, *args, **kwargs): + super(Voter, self).__init__(*args, **kwargs) + + # stub the user so code is not full of IF statements + if not self.user: + self.user = User(user_type='password', user_id=self.voter_email, name=self.voter_name) + @classmethod @transaction.commit_on_success def register_user_in_election(cls, user, election): @@ -617,11 +628,9 @@ class Voter(models.Model, electionalgs.Voter): @classmethod def get_by_election_and_voter_id(cls, election, voter_id): - query = cls.objects.filter(election = election, voter_login_id = voter_id) - try: - return query[0] - except: + return cls.objects.get(election = election, voter_login_id = voter_id) + except cls.DoesNotExist: return None @classmethod @@ -650,32 +659,23 @@ class Voter(models.Model, electionalgs.Voter): @property def name(self): - if self.user: - return self.user.name - else: - return self.voter_name + return self.user.name @property def voter_id(self): - if self.user: - return self.user.user_id - else: - return self.voter_login_id + return self.user.user_id @property def voter_type(self): - if self.user: - return self.user.user_type - else: - return 'password' + return self.user.user_type @property def display_html_big(self): - if self.user: - return self.user.display_html_big - else: - return """<img border="0" height="25" src="/static/auth/login-icons/password.png" alt="password" /> %s""" % self.name + return self.user.display_html_big + def send_message(self, subject, body): + self.user.send_message(subject, body) + def generate_password(self, length=10): if self.voter_password: raise Exception("password already exists") diff --git a/helios/templates/email/vote_body.txt b/helios/templates/email/vote_body.txt index 7672da0dc2c703c53b4f09580251deea950cd89c..fa0a4db4a82bc09d3f815e80210b5c4abc28dc5e 100644 --- a/helios/templates/email/vote_body.txt +++ b/helios/templates/email/vote_body.txt @@ -5,8 +5,8 @@ Dear {{voter.name}}, Election URL: {{election_url}} Election Fingerprint: {{voter.election.hash}} {% ifequal voter.voter_type "password" %} -Your username: {{voter.user.user_id}} -Your password: {{voter.user.info.password}} +Your username: {{voter.voter_login_id}} +Your password: {{voter.voter_password}} {% else %} Log in with your {{voter.voter_type}} account. {% endifequal %}{% if voter.vote_hash %} diff --git a/helios/views.py b/helios/views.py index 5a2b56043515b2f8d967bdccd3ad08b62ed2a82f..713fffbf6c196d888727ecafe1a83958596c5807 100644 --- a/helios/views.py +++ b/helios/views.py @@ -77,7 +77,24 @@ def stats(request): return render_template(request, "stats", {'elections' : elections_page.object_list, 'elections_page': elections_page, 'limit' : limit}) - + + +def get_voter(request, user, election): + """ + return the current voter + """ + voter = None + if request.session.has_key('CURRENT_VOTER'): + voter = request.session['CURRENT_VOTER'] + if voter.election != election: + voter = None + + if not voter: + if user: + voter = Voter.get_by_election_and_user(election, user) + + return voter + ## ## General election features ## @@ -475,16 +492,8 @@ def one_election_cast_confirm(request, election): if not request.session.has_key('encrypted_vote'): return HttpResponseRedirect(settings.URL_HOST) - voter = None - if request.session.has_key('CURRENT_VOTER'): - voter = request.session['CURRENT_VOTER'] - if voter.election != election: - voter = None + voter = get_voter(request, user, election) - if not voter: - if user: - voter = Voter.get_by_election_and_user(election, user) - # auto-register this person if the election is openreg if user and not voter and election.openreg: voter = _register_voter(election, user) @@ -593,9 +602,9 @@ def one_election_cast_done(request, election): We store the ballot hash in the session """ user = get_user(request) + voter = get_voter(request, user, election) - if user: - voter = Voter.get_by_election_and_user(election, user) + if voter: votes = CastVote.get_by_voter(voter) vote_hash = votes[0].vote_hash