diff --git a/election/templates/election/election_detail.jinja b/election/templates/election/election_detail.jinja
index 5570d18c..6fa32fca 100644
--- a/election/templates/election/election_detail.jinja
+++ b/election/templates/election/election_detail.jinja
@@ -54,7 +54,9 @@
{% endfor %}
{% endif %}
-
+
{% if object.is_candidature_active -%}
candidature
{% endif -%}
diff --git a/election/urls.py b/election/urls.py
index 4254d1a9..380fa1db 100644
--- a/election/urls.py
+++ b/election/urls.py
@@ -6,5 +6,7 @@ urlpatterns = [
url(r'^$', ElectionsListView.as_view(), name='list'),
url(r'^create$', ElectionCreateView.as_view(), name='create'),
url(r'^list/create$', ElectionListCreateView.as_view(), name='create_list'),
+ url(r'^role/create$', RoleCreateView.as_view(), name='create_role'),
+ url(r'^(?P[0-9]+)/candidate$', CandidatureCreateView.as_view(), name='candidate'),
url(r'^(?P[0-9]+)/detail$', ElectionDetailView.as_view(), name='detail'),
]
diff --git a/election/views.py b/election/views.py
index 1561789b..d253e58d 100644
--- a/election/views.py
+++ b/election/views.py
@@ -1,4 +1,4 @@
-from django.shortcuts import render
+from django.shortcuts import redirect
from django.views.generic import ListView, DetailView, RedirectView
from django.views.generic.edit import UpdateView, CreateView, DeleteView, FormView
from django.core.urlresolvers import reverse_lazy, reverse
@@ -62,8 +62,57 @@ class ElectionDetailView(CanViewMixin, DetailView):
kwargs['candidate_form'] = CandidateForm(self.get_object().id)
return kwargs
+
+# Form view
+
+class CandidatureCreateView(CanCreateMixin, FormView):
+ """
+ View dedicated to a cundidature creation
+ """
+ form_class = CandidateForm
+ template_name = 'core/page_prop.jinja'
+
+ def dispatch(self, request, *arg, **kwargs):
+ self.election_id = kwargs['election_id']
+ return super(CandidatureCreateView, self).dispatch(request, *arg, **kwargs)
+
+ def get_form_kwargs(self):
+ kwargs = super(CandidatureCreateView, self).get_form_kwargs()
+ kwargs['election_id'] = self.election_id
+ return kwargs
+
+ def create_candidature(self, data):
+ cand = Candidature(
+ role=data['role'],
+ user=data['user'],
+ election_list=data['election_list'],
+ program=data['program']
+ )
+ cand.save()
+
+ def form_valid(self, form):
+ """
+ Verify that the selected user is in candidate group
+ """
+ data = form.clean()
+ res = super(FormView, self).form_valid(form)
+ data['election'] = Election.objects.get(id=self.election_id)
+ if data['user'].is_root:
+ self.create_candidature(data)
+ return res
+ for grp in data['election'].candidature_groups.all():
+ if data['user'].is_in_group(grp):
+ self.create_candidature(data)
+ return res
+ return res
+
+ def get_success_url(self, **kwargs):
+ return reverse_lazy('election:detail', kwargs={'election_id': self.election_id})
+
+
# Create views
+
class ElectionCreateView(CanCreateMixin, CreateView):
model = Election
form_class = modelform_factory(Election,
@@ -86,6 +135,30 @@ class ElectionCreateView(CanCreateMixin, CreateView):
return reverse_lazy('election:detail', kwargs={'election_id': self.object.id})
+class RoleCreateView(CanCreateMixin, CreateView):
+ model = Role
+ form_class = modelform_factory(Role,
+ fields=['title', 'election', 'title', 'description', 'max_choice'])
+ template_name = 'core/page_prop.jinja'
+
+ def form_valid(self, form):
+ """
+ Verify that the user can edit proprely
+ """
+ obj = form.instance
+ res = super(CreateView, self).form_valid
+ if self.request.user.is_root:
+ return res(form)
+ if obj.election:
+ 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})
+
+
class ElectionListCreateView(CanCreateMixin, CreateView):
model = ElectionList
form_class = modelform_factory(ElectionList,
@@ -99,6 +172,8 @@ class ElectionListCreateView(CanCreateMixin, CreateView):
obj = form.instance
res = super(CreateView, self).form_valid
if obj.election:
+ if self.request.user.is_root:
+ return res(form)
for grp in obj.election.candidature_groups.all():
if self.request.user.is_in_group(grp):
return res(form)