From 6ec25055b6454684ae2e7fb57a5366a675cb3d69 Mon Sep 17 00:00:00 2001 From: Shirlei Chaves <shirlei@gmail.com> Date: Tue, 3 May 2016 22:26:51 -0300 Subject: [PATCH] Prevent election edit from using existing shortname --- helios/migrations/0003_auto_20160507_1948.py | 20 +++++++++++++++++++ helios/models.py | 2 +- helios/views.py | 21 +++++++++----------- 3 files changed, 30 insertions(+), 13 deletions(-) create mode 100644 helios/migrations/0003_auto_20160507_1948.py diff --git a/helios/migrations/0003_auto_20160507_1948.py b/helios/migrations/0003_auto_20160507_1948.py new file mode 100644 index 0000000..162d6bb --- /dev/null +++ b/helios/migrations/0003_auto_20160507_1948.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('helios', '0002_castvote_cast_ip'), + ] + + operations = [ + migrations.AlterField( + model_name='election', + name='short_name', + field=models.CharField(unique=True, max_length=100), + preserve_default=True, + ), + ] diff --git a/helios/models.py b/helios/models.py index 55a9fc3..86a31a5 100644 --- a/helios/models.py +++ b/helios/models.py @@ -45,7 +45,7 @@ class Election(HeliosModel): # later versions, at some point will upgrade to "2011/01/Election" datatype = models.CharField(max_length=250, null=False, default="legacy/Election") - short_name = models.CharField(max_length=100) + short_name = models.CharField(max_length=100, unique=True) name = models.CharField(max_length=250) ELECTION_TYPES = ( diff --git a/helios/views.py b/helios/views.py index d646dcc..efe6546 100644 --- a/helios/views.py +++ b/helios/views.py @@ -10,7 +10,7 @@ from django.core.mail import send_mail from django.core.paginator import Paginator from django.core.exceptions import PermissionDenied from django.http import * -from django.db import transaction +from django.db import transaction, IntegrityError from mimetypes import guess_type @@ -205,15 +205,11 @@ def election_new(request): user = get_user(request) election_params['admin'] = user - - election, created_p = Election.get_or_create(**election_params) - - if created_p: - # add Helios as a trustee by default + try: + election = Election.objects.create(**election_params) election.generate_trustee(ELGAMAL_PARAMS) - return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(one_election_view, args=[election.uuid])) - else: + except IntegrityError: error = "An election with short name %s already exists" % election_params['short_name'] else: error = "No special characters allowed in the short name." @@ -243,11 +239,12 @@ def one_election_edit(request, election): clean_data = election_form.cleaned_data for attr_name in RELEVANT_FIELDS: setattr(election, attr_name, clean_data[attr_name]) + try: + election.save() + return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(one_election_view, args=[election.uuid])) + except IntegrityError: + error = "An election with short name %s already exists" % clean_data['short_name'] - election.save() - - return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(one_election_view, args=[election.uuid])) - return render_template(request, "election_edit", {'election_form' : election_form, 'election' : election, 'error': error}) @election_admin(frozen=False) -- GitLab