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