Ejemplo n.º 1
0
def addVoting(request):
    if request.method == 'POST':
        # create a form instance and populate it with data from the request:
        form = VotingForm(request.POST,user=request.user)
        # check whether it's valid:
        if form.is_valid():
            vot = form.save(commit=False);
            vot.moderator = UserProfile.objects.filter(user=request.user)[0]
            vot.save() ## zrobic zapisywanie wiele do wielu
            for k in form.cleaned_data['kandydaci']:
                kan = Candidate(glosowanie=vot,osoba=k)
                kan.save()

            for u in form.cleaned_data['uprawnieni']:
                upr = Voter(glosowanie=vot,osoba=u)
                upr.save()

            #form.save_m2m() ## zamiast tego dodac reczny zapis do bazy
            return render(request, 'AddVotingSuccess.html')

    # if a GET (or any other method) we'll create a blank form
    else:
        form = VotingForm(user=request.user)
        #form.fields["kandydaci"].queryset = UserProfile.objects.exclude(user=request.user) ##modyfikujemy liste kandydatow
    return render(request, 'addVoting.html', {'regform': form,})
Ejemplo n.º 2
0
def voting_edit(request,vot_id):
    #zabezpieczenie przed edycja glosowanie juz rozpoczetego oraz glosowania,ktorego nie jestesmy wlascicielami
    voting = get_object_or_404(Voting, pk=vot_id,moderator__user=request.user,od__gt =timezone.now().date()) #zmiana na date()
    if request.method == 'POST':
        # create a form instance and populate it with data from the request:
        form = VotingForm(request.POST,instance=voting,user=request.user)
        # check whether it's valid:
        if form.is_valid():

            vot = form.save(commit=False);
            vot.save()
            vot.candidate_set.all().delete()
            vot.voter_set.all().delete()

            for k in form.cleaned_data['kandydaci']:
                kan = Candidate(glosowanie=vot,osoba=k)
                kan.save()

            for u in form.cleaned_data['uprawnieni']:
                upr = Voter(glosowanie=vot,osoba=u)
                upr.save()

            #form.save_m2m() ## zamiast tego dodac reczny zapis do bazy
            return render(request, 'editVotingSuccess.html')
    # if a GET (or any other method) we'll create a blank form
    else:
        form = VotingForm(instance=voting,user=request.user)
        #form.fields["kandydaci"].queryset = UserProfile.objects.exclude(user=request.user) ##modyfikujemy liste kandydatow
    return render(request, 'editVoting.html', {'regform': form,'vot_id':voting.id})
Ejemplo n.º 3
0
def polling_station_vote(ballot_id):
    ballot = db.session.query(Ballot).get(ballot_id)
    if ballot is None:
        abort(404)
    permit_voting(ballot)

    input_options = pickle.loads(request.form["input_options_data"])
    try:
        validate_options(input_options, ballot)
    except ValidationError as e:
        flash(unicode(e), "danger")
        return redirect(url_for('polling_station_item', ballot_id=ballot_id))
    except ValueError as e:
        flash(u"Některý z hlasů má neplatnou hodnotu", "danger")
        return redirect(url_for('polling_station_item', ballot_id=ballot_id))

    try:
        vote_timestamp = session.get("vote_timestamp_{}".format(ballot_id),
                                     False)
        if not vote_timestamp:
            raise ValidationError()
        hash_base = compute_hash_base(ballot_id, g.user.id, input_options,
                                      vote_timestamp)
        hash_salt = request.form["hash_salt"]
        h = hashlib.sha1()
        h.update(hash_base.encode("utf-8"))
        h.update(hash_salt.encode("utf-8"))
        hash_digest = h.hexdigest()
    except Exception as e:
        flash(u"Chyba při výpočtu kontrolního řetězce", "danger")
        return redirect(url_for('polling_station_item', ballot_id=ballot_id))

    for (option_id, value) in input_options.items():
        vote = Vote()
        vote.ballot_option_id = option_id
        vote.value = value
        vote.hash_digest = hash_digest
        db.session.add(vote)

    voter = Voter()
    voter.ballot_id = ballot_id
    voter.name = g.user.name
    voter.email = g.user.email
    voter.person_id = g.user.id
    voter.voted_at = datetime.datetime.now()
    voter.remote_addr = request.remote_addr
    voter.user_agent = request.user_agent.string
    db.session.add(voter)

    send_mail = "send_confirmation_email" in request.form
    email_body = send_vote_confirmation(ballot, voter, hash_digest, hash_salt,
                                        vote_timestamp, send_mail)

    db.session.commit()

    return render_template('polling_station_vote.html',
                           ballot=ballot,
                           hash_digest=hash_digest,
                           email_body=email_body,
                           really_send=send_mail)
Ejemplo n.º 4
0
 def post(self, request, advise):
     ad = get_object_or_404(Advise, id=advise)
     sid = request.session.session_key
     v = Voter.objects.filter(ad=ad, sid=sid)
     if not v.count():
         if 'p1' in request.POST:
             ad.votes += 1
         elif 'm1' in request.POST:
             ad.votes -= 1
         ad.save()
     v = Voter(ad=ad, sid=sid)
     v.save()
     return redirect(why, ad.happy.id)
Ejemplo n.º 5
0
def polling_station_vote(ballot_id):
    ballot = db.session.query(Ballot).get(ballot_id)
    if ballot is None:
        abort(404)
    permit_voting(ballot)

    input_options = pickle.loads(request.form["input_options_data"])
    try:
        validate_options(input_options, ballot)
    except ValidationError as e:
        flash(unicode(e), "danger")
        return redirect(url_for('polling_station_item', ballot_id=ballot_id))
    except ValueError as e:
        flash(u"Některý z hlasů má neplatnou hodnotu", "danger")
        return redirect(url_for('polling_station_item', ballot_id=ballot_id))

    try:
        vote_timestamp = session.get(
            "vote_timestamp_{}".format(ballot_id), False)
        if not vote_timestamp:
            raise ValidationError()
        hash_base = compute_hash_base(ballot_id, g.user.id,
                                      input_options, vote_timestamp)
        hash_salt = request.form["hash_salt"]
        h = hashlib.sha1()
        h.update(hash_base.encode("utf-8"))
        h.update(hash_salt.encode("utf-8"))
        hash_digest = h.hexdigest()
    except Exception as e:
        flash(u"Chyba při výpočtu kontrolního řetězce", "danger")
        return redirect(url_for('polling_station_item', ballot_id=ballot_id))

    for (option_id, value) in input_options.items():
        vote = Vote()
        vote.ballot_option_id = option_id
        vote.value = value
        vote.hash_digest = hash_digest
        db.session.add(vote)

    voter = Voter()
    voter.ballot_id = ballot_id
    voter.name = g.user.name
    voter.email = g.user.email
    voter.person_id = g.user.id
    voter.voted_at = datetime.datetime.now()
    voter.remote_addr = request.remote_addr
    voter.user_agent = request.user_agent.string
    db.session.add(voter)

    send_mail = "send_confirmation_email" in request.form
    email_body = send_vote_confirmation(ballot, voter, hash_digest,
                                        hash_salt, vote_timestamp, send_mail)

    db.session.commit()

    return render_template(
        'polling_station_vote.html', ballot=ballot,
        hash_digest=hash_digest, email_body=email_body, really_send=send_mail)
Ejemplo n.º 6
0
def login():
    form = LogInForm()

    if request.method == 'GET':
        return render_template('login.html', form=form)
    elif request.method == 'POST':
        if form.validate_on_submit():
            try:
                conn = mysql.connect()
                cursor = conn.cursor()
                cursor.callproc('ValidateLogin', (form.email.data, ))
                rv = cursor.fetchall()

            finally:
                conn.commit()
                conn.close()
                print len(rv)
                if len(rv) != 0:

                    if check_password_hash(str(rv[0][2]), form.password.data):
                        voter = Voter(rv[0][0], rv[0][1])
                        login_user(voter)
                        return redirect(url_for('showAGMs'))
                    else:
                        return "Wrong password"
                else:
                    return "user doesn't exist"

        else:
            return "form not validated"
    else:
        return "form not validated"
Ejemplo n.º 7
0
 def find_voter(self, voterid):
     voter = Voter.find(voterid)
     if voter:
         logger.info("%s - match found", voterid)
     else:
         logger.info("%s - no match found", voterid)
     return voter
Ejemplo n.º 8
0
def add_voter():
    voter_name = request.form['voter_name']

    if not voter_name:
        flash("Please enter a Voter Name.")
        return render_template("add-voter.html", voters=voters)
    else:
        newVoter = Voter(voter_name)
        db.session.add(newVoter)
        db.session.commit()
        flash("Voter added to Database.")
        return redirect("/add-voters")
Ejemplo n.º 9
0
def load_user(vid):

    try:
        conn = mysql.connect()
        cursor = conn.cursor()
        cursor.callproc('GetByVoterID', (vid, ))
        results = cursor.fetchall()

    finally:
        conn.commit()
        user = Voter(results[0][0], results[0][1])
        conn.close()
        return user
Ejemplo n.º 10
0
def register(request, unique_id=None):
    request.session['django_language'] = 'el'
    establishment = None
    voter = None
    if unique_id:
        establishment = get_object_or_404(Establishment,
                                          unique_id=unique_id)
        if establishment.voter_id:
            voter = establishment.voter
        else:
            voter = Voter()
    if request.method == 'POST':
        if unique_id:
            form = RegistrationForm(request.POST, instance=establishment)
        else:
            form = RegistrationForm(request.POST)
        if form.is_valid():
            voter.first_name = form.cleaned_data['voter_first_name']
            voter.surname = form.cleaned_data['voter_surname']
            voter.email = form.cleaned_data['voter_email']
            voter.mobile_phone = form.cleaned_data['voter_mobile_phone']
            voter.save()

            # is_valid changes the instance. Invalidate, in order to avoid
            # storing those changes.
            establishment = Establishment.objects.get(unique_id=unique_id)
            establishment.voter = voter
            establishment.save()
            return render(request, 'roll/thanks.html', {
                'voter_first_name': voter.first_name,
                'voter_surname': voter.surname,
                'voter_email': voter.email,
                'voter_mobile_phone': voter.mobile_phone,
                'registration_url': request.path
            })
    else:
        if unique_id:
            form = RegistrationForm(
                instance=establishment,
                initial={
                    'voter_first_name': voter.first_name,
                    'voter_surname': voter.surname,
                    'voter_email': voter.email,
                    'voter_mobile_phone': voter.mobile_phone,
                })
        else:
            form = RegistrationForm()
    return render(request, 'roll/registration.html', {
        'form': form,
        'voter': voter,
        'form_action': request.path,
    })
Ejemplo n.º 11
0
def get_voter(request, user, election):
    """
  return the current voter
  """
    voter = None
    if request.session.has_key('CURRENT_VOTER_ID'):
        voter = Voter.objects.get(id=request.session['CURRENT_VOTER_ID'])
        if voter.election != election:
            voter = None

    if not voter:
        if user:
            voter = Voter.get_by_election_and_user(election, user)

    return voter
Ejemplo n.º 12
0
def register(request, unique_id=None):
    establishment = None
    voter = None
    if unique_id:
        establishment = Establishment.objects.get(unique_id=unique_id)
        if establishment.voter_id:
            voter = establishment.voter
        else:
            voter = Voter()
    if request.method == 'POST':
        if unique_id:
            form = RegistrationForm(request.POST, instance=establishment)
        else:
            form = RegistrationForm(request.POST)
        if form.is_valid():
            voter.name = form.cleaned_data['voter_name']
            voter.email = form.cleaned_data['voter_email']
            voter.mobile_phone = form.cleaned_data['voter_mobile_phone']
            voter.save()

            # is_valid changes the instance. Invalidate, in order to avoid
            # storing those changes.
            establishment = Establishment.objects.get(unique_id=unique_id)
            establishment.voter = voter
            establishment.save()
            return render(
                request, 'roll/thanks.html', {
                    'voter_name': voter.name,
                    'voter_email': voter.email,
                    'voter_mobile_phone': voter.mobile_phone,
                    'registration_url': request.path
                })
    else:
        if unique_id:
            form = RegistrationForm(instance=establishment,
                                    initial={
                                        'voter_name': voter.name,
                                        'voter_email': voter.email,
                                        'voter_mobile_phone':
                                        voter.mobile_phone,
                                    })
        else:
            form = RegistrationForm()
    return render(request, 'roll/registration.html', {
        'form': form,
        'voter': voter,
        'form_action': request.path,
    })
Ejemplo n.º 13
0
def return_vote_hmac(data):
    '''
    In three steps auth methods (id-num, id-photo), return directly the hmac
    to vote as there's no third-step verification.
    '''
    from crypto import salted_hmac, get_random_string
    from app import db
    from models import Voter
    from crypto import hash_str

    dni = data["dni"].upper()
    ip_addr = data['ip_addr']

    curr_eid = current_app.config.get("CURRENT_ELECTION_ID", 0)
    # create voter
    voter = Voter(
        election_id=curr_eid,
        ip=ip_addr,
        first_name=data['first_name'],
        last_name=data['last_name'],
        email="-",
        tlf="-",
        postal_code=data.get("postal_code", ""),
        receive_mail_updates=data["receive_updates"],
        lang_code=current_app.config.get("BABEL_DEFAULT_LOCALE", "en"),
        status=Voter.STATUS_AUTHENTICATED,
        modified=datetime.utcnow(),
        message=None,
        is_active=True,
        dni=hash_str(dni),
    )

    db.session.add(voter)
    db.session.commit()

    data['identifier'] = voter.id

    message = "%d#%d" % (int(datetime.utcnow().timestamp()), voter.id)
    key = current_app.config.get("AGORA_SHARED_SECRET_KEY", "")

    ret_data = dict(message=message,
                    sha1_hmac=salted_hmac(key, message, "").hexdigest())
    return make_response(json.dumps(ret_data), 200)
Ejemplo n.º 14
0
def add_voter():
    body = request.json

    no_ktp = body['no_ktp']
    nama = body['nama']
    password = body['password']
    alamat = body['alamat']

    try:
        voter = Voter(no_ktp=no_ktp,
                      nama=nama,
                      password=password,
                      alamat=alamat)
        db.session.add(voter)
        db.session.commit()
        return "Voter added. user id={}".format(voter.no_ktp), 200

    except Exception as e:
        return (str(e)), 400
Ejemplo n.º 15
0
def getPoll():
    p = request.args.get("pid")

    # get by pid
    try:

        poll = db_session.query(Poll).filter_by(pid=p).first()

        # create voter
        voter = Voter(poll.id, poll.x, poll.y)
        db_session.add(voter)
        db_session.flush()
        db_session.commit()

        resp = jsonify(
            data={
                "question":
                poll.question,
                "options":
                poll.options.split("|"),
                "x":
                voter.x,
                "y":
                voter.y,
                "vid":
                voter.id,
                "viewers":
                poll.viewers,
                "winners":
                poll.winners.split("|"),
                "status":
                "COMPLETED" if poll.completed else (
                    "STARTED" if poll.started else "WAITING")
            })

        resp.headers['Access-Control-Allow-Origin'] = '*'
        return resp, 200

    except Exception as e:
        print(e)
        return "This poll does not seem to exist.", 400
Ejemplo n.º 16
0
def register_request(data):
    '''
    register the request in the Voter database with STATUS_REQUESTED

    You can move this pipe before or after check_*_blacklisted in the pipeline,
    depending on if you get too many blacklisted requests to avoid too many
    writes on the database
    '''
    from app import db
    from models import Voter

    ip_addr = data['ip_addr']

    # disable older registration attempts for this tlf
    curr_eid = current_app.config.get("CURRENT_ELECTION_ID", 0)

    # create voter and send sms
    voter = Voter(
        election_id=curr_eid,
        ip=ip_addr,
        first_name=data["first_name"],
        last_name=data["last_name"],
        email=data.get("email", ""),
        tlf=data.get("tlf", ""),
        postal_code=data.get("postal_code", ""),
        receive_mail_updates=data["receive_updates"],
        lang_code=current_app.config.get("BABEL_DEFAULT_LOCALE", "en"),
        status=Voter.STATUS_REQUESTED,
        message=None,
        is_active=True,
        dni=data["dni"].upper(),
    )

    db.session.add(voter)
    db.session.commit()

    data['requested_voter'] = voter
    return RET_PIPE_CONTINUE
Ejemplo n.º 17
0
    def validate(self):
        user = users.get_current_user()
        self.logout = users.create_logout_url(self.request.uri)

        self.voter = Voter.gql('WHERE user = :1', user).get()
        if not self.voter:
            return 'invalid'

        self.years = Poll.openYears()
        if not self.years:
            return 'closed'
        defaultYear = max(self.years)
        self.year = int(self.request.get('year') or self.voter.year
                        or defaultYear)
        if self.year not in self.years:
            self.year = defaultYear
        if self.voter.year != self.year:
            self.voter.year = self.year
            self.voter.put()

        self.ballot = Ballot.gql('WHERE voter = :1 and year = :2',
                                 self.voter, self.year).get()
        return None
Ejemplo n.º 18
0
def user_can_see_election(request, election):
    user = get_user(request)

    if not election.private_p:
        return True

    # election is private

    # but maybe this user is the administrator?
    if user_can_admin_election(user, election):
        return True

    # or maybe this is a trustee of the election?
    trustee = get_logged_in_trustee(request)
    if trustee and trustee.election.uuid == election.uuid:
        return True

    voter = get_voter(request, user, election)

    if user and not voter:
        if user.user_type in settings.AUTH_BIND_USERID_TO_VOTERID:
            voter = Voter.get_by_election_and_voter_id(election, user.user_id)
    # then this user has to be a voter
    return (voter != None)
Ejemplo n.º 19
0
def voters_by_precinct(precinct):
    voters = Voter.select().where(registeredprecinct=precinct)
    context = {"precinct": precinct}
    context.update(paginate(voters))
    return render_template("voter_list.precinct.html", **context)
Ejemplo n.º 20
0
def search():
    search_form = Search(request.args)
    voters = Voter.search(search_form.query.data, search_form.type.data)
    context = {"form": search_form}
    context.update(paginate(voters))
    return render_template("voter_list.search.html", **context)
Ejemplo n.º 21
0
def voter_detail(voterid):
    try:
        voter = Voter.get(id=voterid)
    except Voter.DoesNotExist:
        voter = None
    return render_template("voter_detail.html", voter=voter)
Ejemplo n.º 22
0
def create_voter():
    for entry in request.json['voters']:
        voter_id = entry['VOTERID']
        last_name = entry['LAST-NAME']
        first_name = entry['FIRST-NAME']
        mid_init = entry["MID-INIT"]
        suffix = entry['SUFFIX']
        date_of_birth = entry["DATE-OF-BIRTH"]
        birth_year = entry["BIRTH YEAR"]
        phone = entry["PHONE"]
        address = entry["ADDR"]
        home_no = entry["HOME-NO"]
        home_apt = entry["HOME-APT"]
        home_street = entry["HOME-STREET"]
        home_dev = entry["HOME-DEV"]
        home_city = entry["HOME-CITY"]
        home_zipcode = entry["HOME-ZIPCODE"]
        county = entry["COUNTY"]
        ed = entry["ED"]
        rd = entry["RD"]
        sd = entry["SD"]
        cn_levy = entry["CNLEVY"]
        wilm = entry["WILM"]
        code_home_city = entry["CODE-HOME-CITY"]
        sch_dist = entry["SCH-DIST"]
        party = entry["PARTY"]
        date_reg = entry["DATE-REG"]
        pp_hist_1 = entry["PP-HIST-1"]
        pp_hist_2 = entry["PP-HIST-2"]
        pr_hist_1 = entry["PR-HIST-1"]
        pr_hist_2 = entry["PR-HIST-2"]
        pr_hist_3 = entry["PR-HIST-3"]
        gen_hist_1 = entry["GEN-HIST-1"]
        gen_hist_2 = entry["GEN-HIST-2"]
        gen_hist_3 = entry["GEN-HIST-3"]
        gen_hist_4 = entry["GEN-HIST-4"]
        gen_hist_5 = entry["GEN-HIST-5"]
        sp_hist_1 = entry["SP-HIST-1"]
        sp_hist_2 = entry["SP-HIST-2"]
        sp_hist_3 = entry["SP-HIST-3"]
        schl_hist_1 = entry["SCHL-HIST-1"]
        schl_hist_2 = entry["SCHL-HIST-2"]
        schl_hist_3 = entry["SCHL-HIST-3"]
        schl_hist_4 = entry["SCHL-HIST-4"]
        schl_hist_5 = entry["SCHL-HIST-5"]
        ref_hist_1 = entry["REF-HIST-1"]
        ref_hist_2 = entry["REF-HIST-2"]
        ref_hist_3 = entry["REF-HIST-3"]
        ref_hist_4 = entry["REF-HIST-4"]
        ref_hist_5 = entry["REF-HIST-5"]
        mail_no = entry["MAIL-NO"]
        mail_apt = entry["MAIL-APT"]
        mail_street = entry["MAIL-STR"]
        mail_city = entry["MAIL-CITY"]
        mail_state = entry["MAIL-STATE"]
        mail_zip = entry["MAIL-ZIP"]
        date_last_chg = entry["DATE-LAST-CHG"]
        code_change = entry["CODE-CHANGE"]
        status = entry["STATUS"]
        gender = entry["GENDER"]

        new_voter = Voter(
            voter_id, last_name, first_name, mid_init, suffix, date_of_birth,
            birth_year, phone, address, home_no, home_apt, home_street,
            home_dev, home_city, home_zipcode, county, ed, rd, sd, cn_levy,
            wilm, code_home_city, sch_dist, party, date_reg, pp_hist_1,
            pp_hist_2, pr_hist_1, pr_hist_2, pr_hist_3, gen_hist_1, gen_hist_2,
            gen_hist_3, gen_hist_4, gen_hist_5, sp_hist_1, sp_hist_2,
            sp_hist_3, schl_hist_1, schl_hist_2, schl_hist_3, schl_hist_4,
            schl_hist_5, ref_hist_1, ref_hist_2, ref_hist_3, ref_hist_4,
            ref_hist_5, mail_no, mail_apt, mail_street, mail_city, mail_state,
            mail_zip, date_last_chg, code_change, status, gender)

        db.session.add(new_voter)
        db.session.commit()

        return voter_schema.jsonify(new_voter)
Ejemplo n.º 23
0
        ref_hist_1 = entry["REF-HIST-1"]
        ref_hist_2 = entry["REF-HIST-2"]
        ref_hist_3 = entry["REF-HIST-3"]
        ref_hist_4 = entry["REF-HIST-4"]
        ref_hist_5 = entry["REF-HIST-5"]
        mail_no = entry["MAIL-NO"]
        mail_apt = entry["MAIL-APT"]
        mail_street = entry["MAIL-STR"]
        mail_city = entry["MAIL-CITY"]
        mail_state = entry["MAIL-STATE"]
        mail_zip = entry["MAIL-ZIP"]
        date_last_chg = entry["DATE-LAST-CHG"]
        code_change = entry["CODE-CHANGE"]
        status = entry["STATUS"]
        gender = entry["GENDER"]

        new_voter = Voter(
            voter_id, last_name, first_name, mid_init, suffix, date_of_birth,
            birth_year, phone, address, home_no, home_apt, home_street,
            home_dev, home_city, home_zipcode, county, ed, rd, sd, cn_levy,
            wilm, code_home_city, sch_dist, party, date_reg, pp_hist_1,
            pp_hist_2, pr_hist_1, pr_hist_2, pr_hist_3, gen_hist_1, gen_hist_2,
            gen_hist_3, gen_hist_4, gen_hist_5, sp_hist_1, sp_hist_2,
            sp_hist_3, schl_hist_1, schl_hist_2, schl_hist_3, schl_hist_4,
            schl_hist_5, ref_hist_1, ref_hist_2, ref_hist_3, ref_hist_4,
            ref_hist_5, mail_no, mail_apt, mail_street, mail_city, mail_state,
            mail_zip, date_last_chg, code_change, status, gender)

        db.session.add(new_voter)
        db.session.commit()
Ejemplo n.º 24
0
import pandas as pd
from models import Voter, Candidate

candidates = [Candidate() for _ in range(2)]
voters = [Voter().to_dict() for idx in range(10000)]
# voter_df = pd.DataFrame.from_dict(voters, orient='index', columns=["left_right"])
# voter_df = pd.DataFrame(columns=Voter.__slots__)
voter_df = pd.DataFrame(voters)

voter_df['vote'] = voter_df['left_right'].apply(Voter.vote, args=[candidates])

winner = voter_df['vote'].mode().iloc[0]
mean = voter_df['left_right'].mean()
mean_winner = Voter.vote(mean, candidates)
median = voter_df['left_right'].median()
median_winner = Voter.vote(median, candidates)

assert winner == mean_winner == median_winner

print("done")
Ejemplo n.º 25
0
 def get(self, id):
     voter = Voter.get_by_id(int(id))
     if not voter:
         self.response.out.write('No such voter: ' + id)
         return
     self.render('voter.html', voter=voter)