From 596f03c0d16b96cf327099e40e09d19e24ad0d19 Mon Sep 17 00:00:00 2001
From: Ben Adida <ben@adida.net>
Date: Wed, 27 Oct 2010 21:44:09 -0700
Subject: [PATCH] made sure user can reload cast_done without any trouble

---
 helios/templates/cast_done.html |  2 +-
 helios/views.py                 | 21 +++++++++++++++++----
 2 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/helios/templates/cast_done.html b/helios/templates/cast_done.html
index 6c0faa4..a6dbf96 100644
--- a/helios/templates/cast_done.html
+++ b/helios/templates/cast_done.html
@@ -10,7 +10,7 @@
 
 <p>
   Your smart ballot tracker is:<br /><br />
-    <tt style="font-size:1.8em; font-weight: bold; padding-left: 20px;">  {{last_vote.vote_hash}}</tt>
+    <tt style="font-size:1.8em; font-weight: bold; padding-left: 20px;">  {{vote_hash}}</tt>
 </p>
 
 {% if logout %}
diff --git a/helios/views.py b/helios/views.py
index 3a1819d..c15635b 100644
--- a/helios/views.py
+++ b/helios/views.py
@@ -551,11 +551,24 @@ def one_election_cast_confirm(request, election):
   
 @election_view()
 def one_election_cast_done(request, election):
+  """
+  This view needs to be loaded because of the IFRAME, but then this causes 
+  problems if someone clicks "reload". So we need a strategy.
+  We store the ballot hash in the session
+  """
   user = get_user(request)
-  voter = Voter.get_by_election_and_user(election, user)
-  votes = CastVote.get_by_voter(voter)
 
-  logout = settings.LOGOUT_ON_CONFIRMATION
+  if user:
+    voter = Voter.get_by_election_and_user(election, user)
+    votes = CastVote.get_by_voter(voter)
+    vote_hash = votes[0].vote_hash
+
+    logout = settings.LOGOUT_ON_CONFIRMATION
+
+    save_in_session_across_logouts(request, 'last_vote_hash', vote_hash)
+  else:
+    vote_hash = request.session['last_vote_hash']
+    logout = False
   
   # local logout ensures that there's no more
   # user locally
@@ -565,7 +578,7 @@ def one_election_cast_done(request, election):
   #   auth_views.do_local_logout(request)
     
   # remote logout is happening asynchronously in an iframe to be modular given the logout mechanism
-  return render_template(request, 'cast_done', {'election': election, 'last_vote': votes[0], 'logout': logout}, include_user=False)
+  return render_template(request, 'cast_done', {'election': election, 'vote_hash': vote_hash, 'logout': logout}, include_user=False)
 
 @election_view()
 @json
-- 
GitLab