diff --git a/election/models.py b/election/models.py
index f4b63b39..979c3beb 100644
--- a/election/models.py
+++ b/election/models.py
@@ -67,6 +67,9 @@ class ElectionList(models.Model):
title = models.CharField(_('title'), max_length=255)
election = models.ForeignKey(Election, related_name='election_list', verbose_name=_("election"))
+ def __str__(self):
+ return self.title
+
class Candidature(models.Model):
"""
diff --git a/election/templates/election/election_detail.jinja b/election/templates/election/election_detail.jinja
index 89ab2042..5570d18c 100644
--- a/election/templates/election/election_detail.jinja
+++ b/election/templates/election/election_detail.jinja
@@ -54,6 +54,7 @@
{% endfor %}
{% endif %}
+
{% if object.is_candidature_active -%}
candidature
{% endif -%}
diff --git a/election/urls.py b/election/urls.py
index ba36777b..4254d1a9 100644
--- a/election/urls.py
+++ b/election/urls.py
@@ -1,9 +1,10 @@
-from django.conf.urls import url, include
+from django.conf.urls import url
from election.views import *
urlpatterns = [
url(r'^$', ElectionsListView.as_view(), name='list'),
- url(r'^create$', PageCreateView.as_view(), name='create'),
+ url(r'^create$', ElectionCreateView.as_view(), name='create'),
+ url(r'^list/create$', ElectionListCreateView.as_view(), name='create_list'),
url(r'^(?P[0-9]+)/detail$', ElectionDetailView.as_view(), name='detail'),
]
diff --git a/election/views.py b/election/views.py
index 4dd06371..1561789b 100644
--- a/election/views.py
+++ b/election/views.py
@@ -4,6 +4,7 @@ from django.views.generic.edit import UpdateView, CreateView, DeleteView, FormVi
from django.core.urlresolvers import reverse_lazy, reverse
from django.utils.translation import ugettext_lazy as _
from django.forms.models import modelform_factory
+from django.core.exceptions import PermissionDenied, ObjectDoesNotExist, ImproperlyConfigured
from django.forms import CheckboxSelectMultiple
from django.utils import timezone
from django.conf import settings
@@ -12,15 +13,23 @@ from django import forms
from core.views import CanViewMixin, CanEditMixin, CanEditPropMixin, CanCreateMixin
from core.views.forms import SelectDateTime
from core.widgets import ChoiceWithOtherField
-from election.models import Election, Role, Candidature
+from election.models import Election, Role, Candidature, ElectionList
from ajax_select.fields import AutoCompleteSelectField
+
# Forms
class CandidateForm(forms.Form):
- user = AutoCompleteSelectField('users', label=_('Refound this account'), help_text=None, required=True)
+ """ Form to candidate """
+ user = AutoCompleteSelectField('users', label=_('User to candidate'), help_text=None, required=True)
+ program = forms.CharField(widget=forms.Textarea)
+
+ def __init__(self, election_id, *args, **kwargs):
+ super(CandidateForm, self).__init__(*args, **kwargs)
+ self.fields['role'] = forms.ModelChoiceField(Role.objects.filter(election__id=election_id))
+ self.fields['election_list'] = forms.ModelChoiceField(ElectionList.objects.filter(election__id=election_id))
# Display elections
@@ -47,8 +56,15 @@ class ElectionDetailView(CanViewMixin, DetailView):
template_name = 'election/election_detail.jinja'
pk_url_kwarg = "election_id"
+ def get_context_data(self, **kwargs):
+ """ Add additionnal data to the template """
+ kwargs = super(ElectionDetailView, self).get_context_data(**kwargs)
+ kwargs['candidate_form'] = CandidateForm(self.get_object().id)
+ return kwargs
-class PageCreateView(CanCreateMixin, CreateView):
+# Create views
+
+class ElectionCreateView(CanCreateMixin, CreateView):
model = Election
form_class = modelform_factory(Election,
fields=['title', 'description', 'start_candidature', 'end_candidature', 'start_date', 'end_date',
@@ -68,3 +84,28 @@ class PageCreateView(CanCreateMixin, CreateView):
def get_success_url(self, **kwargs):
return reverse_lazy('election:detail', kwargs={'election_id': self.object.id})
+
+
+class ElectionListCreateView(CanCreateMixin, CreateView):
+ model = ElectionList
+ form_class = modelform_factory(ElectionList,
+ fields=['title', 'election'])
+ template_name = 'core/page_prop.jinja'
+
+ def form_valid(self, form):
+ """
+ Verify that the user can vote on this election
+ """
+ obj = form.instance
+ res = super(CreateView, self).form_valid
+ if obj.election:
+ for grp in obj.election.candidature_groups.all():
+ if self.request.user.is_in_group(grp):
+ return res(form)
+ for grp in obj.election.edit_groups.all():
+ if self.request.user.is_in_group(grp):
+ return res(form)
+ raise PermissionDenied
+
+ def get_success_url(self, **kwargs):
+ return reverse_lazy('election:detail', kwargs={'election_id': self.object.election.id})