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 %} -
{{candidate_form}}
+
{{candidate_form}} + {% csrf_token %} +
{% 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)