Skip to content
Snippets Groups Projects
Commit 794170d9 authored by Ben Adida's avatar Ben Adida
Browse files

started merging bboard and voter list, they are really the same feature,...

started merging bboard and voter list, they are really the same feature, improving pagination, and added better warnings when trustees haven't uploaded public keys.
parent 5ffc7ec9
No related branches found
No related tags found
No related merge requests found
...@@ -65,7 +65,6 @@ urlpatterns = patterns('', ...@@ -65,7 +65,6 @@ urlpatterns = patterns('',
(r'^/voters/$', voter_list), (r'^/voters/$', voter_list),
(r'^/voters/upload$', voters_upload), (r'^/voters/upload$', voters_upload),
(r'^/voters/list$', voters_list_pretty), (r'^/voters/list$', voters_list_pretty),
(r'^/voters/search$', voters_search),
(r'^/voters/email$', voters_email), (r'^/voters/email$', voters_email),
(r'^/voters/(?P<voter_uuid>[^/]+)$', one_voter), (r'^/voters/(?P<voter_uuid>[^/]+)$', one_voter),
(r'^/voters/(?P<voter_uuid>[^/]+)/delete$', voter_delete), (r'^/voters/(?P<voter_uuid>[^/]+)/delete$', voter_delete),
......
...@@ -196,6 +196,10 @@ class Election(models.Model, electionalgs.Election): ...@@ -196,6 +196,10 @@ class Election(models.Model, electionalgs.Election):
if len(trustees) == 0: if len(trustees) == 0:
issues.append("no trustees") issues.append("no trustees")
for t in trustees:
if t.public_key == None:
issues.append("trustee %s hasn't generated a key yet" % t.name)
return issues return issues
......
{% extends TEMPLATE_BASE %} {% extends TEMPLATE_BASE %}
{% block title %}Voters for {{election.name}}{% endblock %} {% block title %}Voters &amp; Ballot Tracking Center for {{election.name}}{% endblock %}
{% block content %} {% block content %}
<h2 class="title">{{election.name}} &mdash; Voters <span style="font-size:0.7em;">[<a href="{% url helios.views.one_election_view election.uuid %}">back to election</a>]</span></h2> <h2 class="title">{{election.name}} &mdash; Voters and Ballot Tracking Center <span style="font-size:0.7em;">[<a href="{% url helios.views.one_election_view election.uuid %}">back to election</a>]</span></h2>
<p> <p>
<u>Registration</u> is {% if not election.frozen_at %}currently{% endif %} <b>{{ election.registration_status_pretty }}</b>. <u>Registration</u> is {% if not election.frozen_at %}currently{% endif %} <b>{{ election.registration_status_pretty }}</b>.
...@@ -15,21 +15,15 @@ ...@@ -15,21 +15,15 @@
{% endif %} {% endif %}
</p> </p>
<!--
<p>
<u>Eligibility</u>: [more to come]
</p>
-->
{% if email_voters and election.frozen_at and admin_p %} {% if email_voters and election.frozen_at and admin_p %}
<p><a href="{% url helios.views.voters_email election.uuid %}">email voters</a></p> <p><a href="{% url helios.views.voters_email election.uuid %}">email voters</a></p>
{% endif %} {% endif %}
<p> <p>
<form method="get" action="{% url helios.views.voters_search election.uuid %}"><b>search</b>: <input type="text" name="q" /> <input type="submit" value="search" /></form> <form method="get" action="{% url helios.views.voters_list_pretty election.uuid %}"><b>search</b>: <input type="text" name="q" /> <input type="submit" value="search" /></form>
</p> </p>
<br />
{% if admin_p and upload_p %} {% if admin_p and upload_p %}
<p> <p>
{% if not election.frozen_at %} {% if not election.frozen_at %}
...@@ -60,18 +54,15 @@ Prior Bulk Uploads: ...@@ -60,18 +54,15 @@ Prior Bulk Uploads:
{% endif %} {% endif %}
{% if voters %} {% if voters %}
Voters {{offset_plus_one}} - {{offset_plus_limit}} &nbsp;&nbsp;
{% if next_after %} {% if voters_page.has_previous %}
<a href="./list?after={{next_after}}&offset={{offset_plus_limit}}">next {{limit}}</a> &nbsp;&nbsp; <a href="./list?page={{voters_page.previous_page_number}}&limit={{limit}}">previous {{limit}}</a> &nbsp;&nbsp;
{% endif %} {% endif %}
{% ifequal offset 0 %} Voters {{voters_page.start_index}} - {{voters_page.end_index}} (of {{total_voters}})&nbsp;&nbsp;
{% else %}
<a href="./list">back to start</a> &nbsp;&nbsp; {% if voters_page.has_next %}
{% endifequal %} <a href="./list?page={{voters_page.next_page_number}}&limit={{limit}}">next {{limit}}</a> &nbsp;&nbsp;
{% if more_p %}
<a href="./list?after={{next_after}}&offset={{next_offset}}">next {{limit}}</a>
{% endif %} {% endif %}
<table class="pretty"> <table class="pretty">
...@@ -83,6 +74,7 @@ Voters {{offset_plus_one}} - {{offset_plus_limit}} &nbsp;&nbsp; ...@@ -83,6 +74,7 @@ Voters {{offset_plus_one}} - {{offset_plus_limit}} &nbsp;&nbsp;
{% if election.use_voter_aliases %} {% if election.use_voter_aliases %}
<th>Alias</th> <th>Alias</th>
{% endif %} {% endif %}
<th>Smart Ballot Tracker</th>
</tr> </tr>
{% for voter in voters %} {% for voter in voters %}
<tr> <tr>
...@@ -101,6 +93,7 @@ Voters {{offset_plus_one}} - {{offset_plus_limit}} &nbsp;&nbsp; ...@@ -101,6 +93,7 @@ Voters {{offset_plus_one}} - {{offset_plus_limit}} &nbsp;&nbsp;
{% if election.use_voter_aliases %} {% if election.use_voter_aliases %}
<td>{{voter.alias}}</td> <td>{{voter.alias}}</td>
{% endif %} {% endif %}
<td><tt style="font-size: 1.4em;;">{% if voter.vote_hash %}{{voter.vote_hash}} <span style="font-size:0.8em;">[<a href="{% url helios.views.voter_last_vote election_uuid=election.uuid,voter_uuid=voter.uuid %}">view</a>]</span>{% else %}&mdash;{% endif %}</tt></td>
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>
......
...@@ -7,7 +7,9 @@ Ben Adida (ben@adida.net) ...@@ -7,7 +7,9 @@ Ben Adida (ben@adida.net)
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.core.mail import send_mail from django.core.mail import send_mail
from django.core.paginator import Paginator
from django.http import * from django.http import *
from django.db import transaction
from mimetypes import guess_type from mimetypes import guess_type
...@@ -709,6 +711,7 @@ def one_election_save_questions(request, election): ...@@ -709,6 +711,7 @@ def one_election_save_questions(request, election):
# always a machine API # always a machine API
return SUCCESS return SUCCESS
@transaction.commit_on_success
@election_admin(frozen=False) @election_admin(frozen=False)
def one_election_freeze(request, election): def one_election_freeze(request, election):
# figure out the number of questions and trustees # figure out the number of questions and trustees
...@@ -829,9 +832,11 @@ def one_election_set_result_and_proof(request, election): ...@@ -829,9 +832,11 @@ def one_election_set_result_and_proof(request, election):
def voters_list_pretty(request, election): def voters_list_pretty(request, election):
""" """
Show the list of voters Show the list of voters
now using Django pagination
""" """
after = request.GET.get('after', None)
offset= int(request.GET.get('offset', 0)) # for django pagination support
page = int(request.GET.get('page', 1))
limit = int(request.GET.get('limit', 50)) limit = int(request.GET.get('limit', 50))
order_by = 'voter_id' order_by = 'voter_id'
...@@ -843,34 +848,19 @@ def voters_list_pretty(request, election): ...@@ -843,34 +848,19 @@ def voters_list_pretty(request, election):
voter_files = election.voterfile_set.all() voter_files = election.voterfile_set.all()
# load a bunch of voters # load a bunch of voters
voters = Voter.get_by_election(election, after=after, limit=limit+1, order_by=order_by) voters = Voter.get_by_election(election, order_by=order_by)
total_voters = voters.count()
more_p = len(voters) > limit voter_paginator = Paginator(voters, limit)
if more_p: voters_page = voter_paginator.page(page)
voters = voters[0:limit]
next_after = getattr(voters[limit-1], order_by)
else:
next_after = None
return render_template(request, 'voters_list', {'election': election, 'voters': voters, 'admin_p': admin_p, return render_template(request, 'voters_list', {'election': election, 'voters_page': voters_page,
'next_after': next_after, 'email_voters': helios.VOTERS_EMAIL, 'voters': voters_page.object_list, 'admin_p': admin_p,
'offset': offset, 'limit': limit, 'offset_plus_one': offset+1, 'email_voters': helios.VOTERS_EMAIL,
'offset_plus_limit': offset+min(limit,len(voters)), 'limit': limit, 'total_voters': total_voters,
'upload_p': helios.VOTERS_UPLOAD, 'upload_p': helios.VOTERS_UPLOAD,
'voter_files': voter_files}) 'voter_files': voter_files})
@election_admin()
def voters_search(request, election):
"""
Search the voters by voter_id
"""
search_term = request.GET.get('q', None)
if not search_term:
raise Exception("must provide a search term")
voter = Voter.get_by_election_and_voter_id(election, voter_id=search_term)
return render_template(request, 'voters_search', {'election': election, 'voter': voter, 'search_term': search_term})
@election_admin(frozen=False) @election_admin(frozen=False)
def voters_upload(request, election): def voters_upload(request, election):
""" """
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment