diff --git a/auth/templates/login_box.html b/auth/templates/login_box.html index 4fb7a6eba40ef78e3b8ce7fa5778333b1bedd14d..ce047e2c12a29d1c215d88e815000182b16a06b1 100644 --- a/auth/templates/login_box.html +++ b/auth/templates/login_box.html @@ -5,7 +5,7 @@ {% else %} {% for auth_system in enabled_auth_systems %} {% ifequal auth_system "password" %} -<form method="post" action="{% url auth.auth_systems.password.password_login_view %}"> +<form method="post" action="{{ SECURE_URL_HOST }}{% url auth.auth_systems.password.password_login_view %}"> <input type="hidden" name="election_uuid" value="{{election.uuid}}" /> <input type="hidden" name="csrf_token" value="{{csrf_token}}" /> <input type="hidden" name="return_url" value="{{return_url}}" /> diff --git a/helios/election_urls.py b/helios/election_urls.py index 1ced54bdc31fe91d0387423d6350a44e17756d62..7d00dd6522dfd93850234c3f98322e7c5faaa3e6 100644 --- a/helios/election_urls.py +++ b/helios/election_urls.py @@ -14,6 +14,7 @@ urlpatterns = patterns('', # edit election params (r'^/edit$', one_election_edit), (r'^/schedule$', one_election_schedule), + (r'^/archive$', one_election_archive), # adding trustees (r'^/trustees/$', list_trustees), diff --git a/helios/models.py b/helios/models.py index 9f6d90aa6f0dd01b46428eb8847401b222798c7d..da9c252772c8156b1710a91295fa586ea64366ae 100644 --- a/helios/models.py +++ b/helios/models.py @@ -109,6 +109,10 @@ class Election(models.Model, electionalgs.Election): return utils.hash_b64(self.encrypted_tally.toJSON()) + @property + def is_archived(self): + return self.archived_at != None + @classmethod def get_featured(cls): return cls.objects.filter(featured_p = True).order_by('short_name') @@ -118,12 +122,17 @@ class Election(models.Model, electionalgs.Election): return cls.objects.get_or_create(short_name = kwargs['short_name'], defaults=kwargs) @classmethod - def get_by_user_as_admin(cls, user, include_archived=False): + def get_by_user_as_admin(cls, user, archived_p=None, limit=None): query = cls.objects.filter(admin = user) - if include_archived: - query = query.filter('archived_at', None) + if archived_p == True: + query = query.exclude(archived_at= None) + if archived_p == False: + query = query.filter(archived_at= None) query = query.order_by('-created_at') - return query + if limit: + return query[:limit] + else: + return query @classmethod def get_by_user_as_voter(cls, user): diff --git a/helios/templates/election_view.html b/helios/templates/election_view.html index ba8e74b619d19fa5d8a04eee88726aa21d6309bd..65b16a8dbfb5c525d0438bf193f444d292d074b5 100644 --- a/helios/templates/election_view.html +++ b/helios/templates/election_view.html @@ -24,7 +24,14 @@ if (!navigator.javaEnabled()) { {% endif %} {% endif %}</h2> <p style="padding-top:0px; margin-top:0px"> -an election created by <u><b>{{election.admin.display_html_small|safe}}</b></u><br /> +an election created by <u><b>{{election.admin.display_html_small|safe}}</b></u> +{% if election.is_archived %} +[archived] +{% endif %} +{% if admin_p %} + [{% if election.is_archived %}<a href="{% url helios.views.one_election_archive election_uuid=election.uuid %}?archive_p=0">unarchive it</a>{% else %}<a href="{% url helios.views.one_election_archive election_uuid=election.uuid %}?archive_p=1">archive it</a>{% endif %}] +{% endif %} +<br /> {% if admin_p %} {% if election.featured_p %} this election is featured on the front page. diff --git a/helios/tests.py b/helios/tests.py index b01341cd4f2a405c46b2dc139d62731268ff4b2d..3130d88be32916b35cd17d38855e57cf697adaab 100644 --- a/helios/tests.py +++ b/helios/tests.py @@ -126,6 +126,13 @@ class ElectionModelTests(TestCase): # make sure it logged something self.assertTrue(len(self.election.get_log().all()) > 0) + def test_archive(self): + self.election.archived_at = datetime.datetime.utcnow() + self.assertTrue(self.election.is_archived) + + self.election.archived_at = None + self.assertFalse(self.election.is_archived) + def test_voter_registration(self): # before adding a voter voters = models.Voter.get_by_election(self.election) diff --git a/helios/views.py b/helios/views.py index d4dad1e9ae44e817337f5640bce04ac7e52d5dce..bcb741a017e033bc31875778441ce452c37eb25d 100644 --- a/helios/views.py +++ b/helios/views.py @@ -57,7 +57,7 @@ def get_election_url(election): def home(request): user = get_user(request) if user: - elections = Election.get_by_user_as_admin(user) + elections = Election.get_by_user_as_admin(user, archived_p = False) else: elections = [] @@ -428,7 +428,7 @@ def one_election_cast(request, election): save_in_session_across_logouts(request, 'encrypted_vote', encrypted_vote) - return HttpResponseRedirect("%s%s" % (settings.URL_HOST, reverse(one_election_cast_confirm, args=[election.uuid]))) + return HttpResponseRedirect("%s%s" % (settings.SECURE_URL_HOST, reverse(one_election_cast_confirm, args=[election.uuid]))) @election_view(frozen=True) def one_election_cast_confirm(request, election): @@ -436,7 +436,7 @@ def one_election_cast_confirm(request, election): # if no encrypted vote, the user is reloading this page or otherwise getting here in a bad way if not request.session.has_key('encrypted_vote'): - return HttpResponseRedirect("/") + return HttpResponseRedirect(settings.URL_HOST) if user: voter = Voter.get_by_election_and_user(election, user) @@ -515,7 +515,7 @@ def one_election_cast_confirm(request, election): # voting has not started or has ended if (not election.voting_has_started()) or election.voting_has_stopped(): - return HttpResponseRedirect("/") + return HttpResponseRedirect(settings.URL_HOST) # if user is not logged in # bring back to the confirmation page to let him know @@ -539,7 +539,7 @@ def one_election_cast_confirm(request, election): # remove the vote from the store del request.session['encrypted_vote'] - return HttpResponseRedirect(reverse(one_election_cast_done, args=[election.uuid])) + return HttpResponseRedirect("%s%s" % (settings.URL_HOST, reverse(one_election_cast_done, args=[election.uuid]))) @election_view() def one_election_cast_done(request, election): @@ -679,7 +679,7 @@ def one_election_set_featured(request, election): return HttpResponseRedirect(reverse(one_election_view, args=[election.uuid])) @election_admin() -def one_election_archive(request, election, admin, api_client): +def one_election_archive(request, election): archive_p = request.GET.get('archive_p', True) @@ -688,13 +688,9 @@ def one_election_archive(request, election, admin, api_client): else: election.archived_at = None - # FIXME: what is this?? - storage.election_update(election) + election.save() - if get_user(request): - return HttpResponseRedirect(reverse(one_election_view, args=[election.uuid])) - else: - return SUCCESS + return HttpResponseRedirect(reverse(one_election_view, args=[election.uuid])) # changed from admin to view because # anyone can see the questions, the administration aspect is now diff --git a/server_ui/templates/index.html b/server_ui/templates/index.html index 6450d286e0f55fd1e9ea60b3b7912b8ee3f17371..493c371e4e449f8f5e7284659fd143ef1d70875b 100644 --- a/server_ui/templates/index.html +++ b/server_ui/templates/index.html @@ -21,9 +21,10 @@ {% endfor %} </ul> {% else %} -<em>none yet</em><br /> +<em>none yet</em> {% endif %} -<div style="text-align:right"> +<p>[<a href="{% url helios.views.elections_administered %}">see all</a>]</p> +<div style="text-align:right;"> <a href="{% url helios.views.election_new %}" style="font-size: 1.2em; padding:5px; background: #eee; border: 1px solid #888">create election ></a> </div> {% endif %} diff --git a/server_ui/views.py b/server_ui/views.py index b832f2ab323b3bfda8ac0cd68ac239b2decccb06..417f4ac52142d6f019a58af4248fa8e29f8f4cd3 100644 --- a/server_ui/views.py +++ b/server_ui/views.py @@ -31,7 +31,7 @@ def home(request): create_p = can_create_election(request) if create_p: - elections_administered = Election.get_by_user_as_admin(user) + elections_administered = Election.get_by_user_as_admin(user, archived_p=False, limit=5) else: elections_administered = None