diff --git a/helios/templates/voters_upload.html b/helios/templates/voters_upload.html index fcd97953173539a445ab366e8b48c782302cc670..9c3d7cc7374644667d4c4d0f807308dc41d2951f 100644 --- a/helios/templates/voters_upload.html +++ b/helios/templates/voters_upload.html @@ -5,14 +5,23 @@ <form method="post" action="" id="upload_form" enctype="multipart/form-data"> <p> - If your election allows for password-based voters, then you can bulk upload them here.<br /> - Please enter CSV content for your list of voters as follows: + If you would like to specify your list of voters by name and email address,<br /> + you can bulk upload a list of such voters here.<br /><br /> + + Please prepare a text file of comma-separated values, as follows: </p> <pre> benadida,ben@adida.net,Ben Adida bob,bob@acme.org,Bob Acme ... </pre> + + <p> + The easiest way to prepare such a file is to use a spreadsheet program and to export as "CSV". + </p> + {% if error %} + <div style="color: red;">{{error}}</div> + {% endif %} <input type="hidden" name="csrf_token" value="{{csrf_token}}" /> <input type="file" name="voters_file" /> diff --git a/helios/views.py b/helios/views.py index b25b045d9f178211d80325bf7a77c6d71d496939..01d8257b0b33d9c59e75e8e30400dfb83669bcfc 100644 --- a/helios/views.py +++ b/helios/views.py @@ -1142,7 +1142,7 @@ def voters_upload(request, election): # raise PermissionDenied() if request.method == "GET": - return render_template(request, 'voters_upload', {'election': election}) + return render_template(request, 'voters_upload', {'election': election, 'error': request.GET.get('e',None)}) if request.method == "POST": if bool(request.POST.get('confirm_p', 0)): @@ -1153,15 +1153,18 @@ def voters_upload(request, election): return HttpResponseRedirect(reverse(voters_list_pretty, args=[election.uuid])) else: # we need to confirm - voters_file = request.FILES['voters_file'] - voter_file_obj = election.add_voters_file(voters_file) + if request.FILES.has_key('voters_file'): + voters_file = request.FILES['voters_file'] + voter_file_obj = election.add_voters_file(voters_file) - request.session['voter_file_id'] = voter_file_obj.id - - # import the first few lines to check - voters = [v for v in voter_file_obj.itervoters()][:5] + request.session['voter_file_id'] = voter_file_obj.id + + # import the first few lines to check + voters = [v for v in voter_file_obj.itervoters()][:5] - return render_template(request, 'voters_upload_confirm', {'election': election, 'voters': voters}) + return render_template(request, 'voters_upload_confirm', {'election': election, 'voters': voters}) + else: + return HttpResponseRedirect("%s?%s" % (reverse(voters_upload, args=[election.uuid]), urllib.urlencode({'e':'no voter file specified, try again'}))) @election_admin() def voters_upload_cancel(request, election):