Commit d3fbc65c authored by Sli's avatar Sli
Browse files

Pep8 for elections

parent 969d5699
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.utils import timezone from django.utils import timezone
from django.conf import settings
from datetime import timedelta
from core.models import User, Group from core.models import User, Group
...@@ -13,16 +11,26 @@ class Election(models.Model): ...@@ -13,16 +11,26 @@ class Election(models.Model):
""" """
title = models.CharField(_('title'), max_length=255) title = models.CharField(_('title'), max_length=255)
description = models.TextField(_('description'), null=True, blank=True) description = models.TextField(_('description'), null=True, blank=True)
start_candidature = models.DateTimeField(_('start candidature'), blank=False) start_candidature = models.DateTimeField(
_('start candidature'), blank=False)
end_candidature = models.DateTimeField(_('end candidature'), blank=False) end_candidature = models.DateTimeField(_('end candidature'), blank=False)
start_date = models.DateTimeField(_('start date'), blank=False) start_date = models.DateTimeField(_('start date'), blank=False)
end_date = models.DateTimeField(_('end date'), blank=False) end_date = models.DateTimeField(_('end date'), blank=False)
edit_groups = models.ManyToManyField(Group, related_name="editable_elections", verbose_name=_("edit groups"), blank=True) edit_groups = models.ManyToManyField(
view_groups = models.ManyToManyField(Group, related_name="viewable_elections", verbose_name=_("view groups"), blank=True) Group, related_name="editable_elections",
vote_groups = models.ManyToManyField(Group, related_name="votable_elections", verbose_name=_("vote groups"), blank=True) verbose_name=_("edit groups"), blank=True)
candidature_groups = models.ManyToManyField(Group, related_name="candidate_elections", verbose_name=_("candidature groups"), blank=True) view_groups = models.ManyToManyField(
voters = models.ManyToManyField(User, verbose_name=('voters'), related_name='voted_elections') Group, related_name="viewable_elections",
verbose_name=_("view groups"), blank=True)
vote_groups = models.ManyToManyField(
Group, related_name="votable_elections",
verbose_name=_("vote groups"), blank=True)
candidature_groups = models.ManyToManyField(
Group, related_name="candidate_elections",
verbose_name=_("candidature groups"), blank=True)
voters = models.ManyToManyField(User, verbose_name=(
'voters'), related_name='voted_elections')
def __str__(self): def __str__(self):
return self.title return self.title
...@@ -39,7 +47,8 @@ class Election(models.Model): ...@@ -39,7 +47,8 @@ class Election(models.Model):
@property @property
def is_candidature_active(self): def is_candidature_active(self):
now = timezone.now() now = timezone.now()
return bool(now <= self.end_candidature and now >= self.start_candidature) return bool(now <= self.end_candidature and
now >= self.start_candidature)
@property @property
def is_vote_editable(self): def is_vote_editable(self):
...@@ -77,7 +86,8 @@ class Role(models.Model): ...@@ -77,7 +86,8 @@ class Role(models.Model):
""" """
This class allows to create a new role avaliable for a candidature This class allows to create a new role avaliable for a candidature
""" """
election = models.ForeignKey(Election, related_name='roles', verbose_name=_("election")) election = models.ForeignKey(
Election, related_name='roles', verbose_name=_("election"))
title = models.CharField(_('title'), max_length=255) title = models.CharField(_('title'), max_length=255)
description = models.TextField(_('description'), null=True, blank=True) description = models.TextField(_('description'), null=True, blank=True)
max_choice = models.IntegerField(_('max choice'), default=1) max_choice = models.IntegerField(_('max choice'), default=1)
...@@ -88,11 +98,13 @@ class Role(models.Model): ...@@ -88,11 +98,13 @@ class Role(models.Model):
non_blank = 0 non_blank = 0
for candidature in self.candidatures.all(): for candidature in self.candidatures.all():
cand_results = {} cand_results = {}
cand_results['vote'] = self.votes.filter(candidature=candidature).count() cand_results['vote'] = self.votes.filter(
candidature=candidature).count()
if total_vote == 0: if total_vote == 0:
cand_results['percent'] = 0 cand_results['percent'] = 0
else: else:
cand_results['percent'] = cand_results['vote'] * 100 / total_vote cand_results['percent'] = cand_results[
'vote'] * 100 / total_vote
non_blank += cand_results['vote'] non_blank += cand_results['vote']
results[candidature.user.username] = cand_results results[candidature.user.username] = cand_results
results['total vote'] = total_vote results['total vote'] = total_vote
...@@ -100,7 +112,8 @@ class Role(models.Model): ...@@ -100,7 +112,8 @@ class Role(models.Model):
results['blank vote'] = {'vote': 0, 'percent': 0} results['blank vote'] = {'vote': 0, 'percent': 0}
else: else:
results['blank vote'] = {'vote': total_vote - non_blank, results['blank vote'] = {'vote': total_vote - non_blank,
'percent': (total_vote - non_blank) * 100 / total_vote} 'percent': (total_vote -
non_blank) * 100 / total_vote}
return results return results
@property @property
...@@ -116,7 +129,8 @@ class ElectionList(models.Model): ...@@ -116,7 +129,8 @@ class ElectionList(models.Model):
To allow per list vote To allow per list vote
""" """
title = models.CharField(_('title'), max_length=255) title = models.CharField(_('title'), max_length=255)
election = models.ForeignKey(Election, related_name='election_lists', verbose_name=_("election")) election = models.ForeignKey(
Election, related_name='election_lists', verbose_name=_("election"))
def __str__(self): def __str__(self):
return self.title return self.title
...@@ -126,10 +140,14 @@ class Candidature(models.Model): ...@@ -126,10 +140,14 @@ class Candidature(models.Model):
""" """
This class is a component of responsability This class is a component of responsability
""" """
role = models.ForeignKey(Role, related_name='candidatures', verbose_name=_("role")) role = models.ForeignKey(
user = models.ForeignKey(User, verbose_name=_('user'), related_name='candidates', blank=True) Role, related_name='candidatures', verbose_name=_("role"))
user = models.ForeignKey(User, verbose_name=_(
'user'), related_name='candidates', blank=True)
program = models.TextField(_('description'), null=True, blank=True) program = models.TextField(_('description'), null=True, blank=True)
election_list = models.ForeignKey(ElectionList, related_name='candidatures', verbose_name=_('election list')) election_list = models.ForeignKey(
ElectionList, related_name='candidatures',
verbose_name=_('election list'))
def can_be_edited_by(self, user): def can_be_edited_by(self, user):
return (user == self.user) or user.can_edit(self.role.election) return (user == self.user) or user.can_edit(self.role.election)
...@@ -142,8 +160,10 @@ class Vote(models.Model): ...@@ -142,8 +160,10 @@ class Vote(models.Model):
""" """
This class allows to vote for candidates This class allows to vote for candidates
""" """
role = models.ForeignKey(Role, related_name='votes', verbose_name=_("role")) role = models.ForeignKey(
candidature = models.ManyToManyField(Candidature, related_name='votes', verbose_name=_("candidature")) Role, related_name='votes', verbose_name=_("role"))
candidature = models.ManyToManyField(
Candidature, related_name='votes', verbose_name=_("candidature"))
def __str__(self): def __str__(self):
return "Vote" return "Vote"
\ No newline at end of file
from django.test import Client, TestCase from django.test import TestCase
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.contrib.auth.models import Group from django.contrib.auth.models import Group
from django.core.management import call_command from django.core.management import call_command
from django.conf import settings from django.conf import settings
from datetime import date, datetime
from core.models import User, Group from core.models import User
from election.models import Election from election.models import Election
...@@ -15,8 +14,10 @@ class MainElection(TestCase): ...@@ -15,8 +14,10 @@ class MainElection(TestCase):
self.election = Election.objects.all().first() self.election = Election.objects.all().first()
self.public_group = Group.objects.get(id=settings.SITH_GROUP_PUBLIC_ID) self.public_group = Group.objects.get(id=settings.SITH_GROUP_PUBLIC_ID)
self.subscriber_group = Group.objects.get(name=settings.SITH_MAIN_MEMBERS_GROUP) self.subscriber_group = Group.objects.get(
self.ae_board_group = Group.objects.get(name=settings.SITH_MAIN_BOARD_GROUP) name=settings.SITH_MAIN_MEMBERS_GROUP)
self.ae_board_group = Group.objects.get(
name=settings.SITH_MAIN_BOARD_GROUP)
self.sli = User.objects.get(username='sli') self.sli = User.objects.get(username='sli')
self.subscriber = User.objects.get(username='subscriber') self.subscriber = User.objects.get(username='subscriber')
self.public = User.objects.get(username='public') self.public = User.objects.get(username='public')
...@@ -29,9 +30,9 @@ class ElectionDetailTest(MainElection): ...@@ -29,9 +30,9 @@ class ElectionDetailTest(MainElection):
self.election.save() self.election.save()
self.client.login(username=self.public.username, password='plop') self.client.login(username=self.public.username, password='plop')
response_get = self.client.get(reverse('election:detail', response_get = self.client.get(reverse('election:detail',
args=str(self.election.id))) args=str(self.election.id)))
response_post = self.client.get(reverse('election:detail', response_post = self.client.get(reverse('election:detail',
args=str(self.election.id))) args=str(self.election.id)))
self.assertTrue(response_get.status_code == 403) self.assertTrue(response_get.status_code == 403)
self.assertTrue(response_post.status_code == 403) self.assertTrue(response_post.status_code == 403)
self.election.view_groups.remove(self.subscriber_group) self.election.view_groups.remove(self.subscriber_group)
...@@ -41,9 +42,9 @@ class ElectionDetailTest(MainElection): ...@@ -41,9 +42,9 @@ class ElectionDetailTest(MainElection):
def test_permisson_granted(self): def test_permisson_granted(self):
self.client.login(username=self.public.username, password='plop') self.client.login(username=self.public.username, password='plop')
response_get = self.client.get(reverse('election:detail', response_get = self.client.get(reverse('election:detail',
args=str(self.election.id))) args=str(self.election.id)))
response_post = self.client.post(reverse('election:detail', response_post = self.client.post(reverse('election:detail',
args=str(self.election.id))) args=str(self.election.id)))
self.assertFalse(response_get.status_code == 403) self.assertFalse(response_get.status_code == 403)
self.assertFalse(response_post.status_code == 403) self.assertFalse(response_post.status_code == 403)
self.assertTrue('La roue tourne' in str(response_get.content)) self.assertTrue('La roue tourne' in str(response_get.content))
...@@ -53,8 +54,8 @@ class ElectionUpdateView(MainElection): ...@@ -53,8 +54,8 @@ class ElectionUpdateView(MainElection):
def test_permission_denied(self): def test_permission_denied(self):
self.client.login(username=self.subscriber.username, password='plop') self.client.login(username=self.subscriber.username, password='plop')
response_get = self.client.get(reverse('election:update', response_get = self.client.get(reverse('election:update',
args=str(self.election.id))) args=str(self.election.id)))
response_post = self.client.post(reverse('election:update', response_post = self.client.post(reverse('election:update',
args=str(self.election.id))) args=str(self.election.id)))
self.assertTrue(response_get.status_code == 403) self.assertTrue(response_get.status_code == 403)
self.assertTrue(response_post.status_code == 403) self.assertTrue(response_post.status_code == 403)
...@@ -5,14 +5,24 @@ from election.views import * ...@@ -5,14 +5,24 @@ from election.views import *
urlpatterns = [ urlpatterns = [
url(r'^$', ElectionsListView.as_view(), name='list'), url(r'^$', ElectionsListView.as_view(), name='list'),
url(r'^add$', ElectionCreateView.as_view(), name='create'), url(r'^add$', ElectionCreateView.as_view(), name='create'),
url(r'^(?P<election_id>[0-9]+)/edit$', ElectionUpdateView.as_view(), name='update'), url(r'^(?P<election_id>[0-9]+)/edit$',
url(r'^(?P<election_id>[0-9]+)/list/add$', ElectionListCreateView.as_view(), name='create_list'), ElectionUpdateView.as_view(), name='update'),
url(r'^(?P<election_id>[0-9]+)/role/create$', RoleCreateView.as_view(), name='create_role'), url(r'^(?P<election_id>[0-9]+)/list/add$',
url(r'^(?P<role_id>[0-9]+)/role/edit$', RoleUpdateView.as_view(), name='update_role'), ElectionListCreateView.as_view(), name='create_list'),
url(r'^(?P<role_id>[0-9]+)/role/delete$', RoleDeleteView.as_view(), name='delete_role'), url(r'^(?P<election_id>[0-9]+)/role/create$',
url(r'^(?P<election_id>[0-9]+)/candidate/add$', CandidatureCreateView.as_view(), name='candidate'), RoleCreateView.as_view(), name='create_role'),
url(r'^(?P<candidature_id>[0-9]+)/candidate/edit$', CandidatureUpdateView.as_view(), name='update_candidate'), url(r'^(?P<role_id>[0-9]+)/role/edit$',
url(r'^(?P<candidature_id>[0-9]+)/candidate/delete$', CandidatureDeleteView.as_view(), name='delete_candidate'), RoleUpdateView.as_view(), name='update_role'),
url(r'^(?P<election_id>[0-9]+)/vote$', VoteFormView.as_view(), name='vote'), url(r'^(?P<role_id>[0-9]+)/role/delete$',
url(r'^(?P<election_id>[0-9]+)/detail$', ElectionDetailView.as_view(), name='detail'), RoleDeleteView.as_view(), name='delete_role'),
url(r'^(?P<election_id>[0-9]+)/candidate/add$',
CandidatureCreateView.as_view(), name='candidate'),
url(r'^(?P<candidature_id>[0-9]+)/candidate/edit$',
CandidatureUpdateView.as_view(), name='update_candidate'),
url(r'^(?P<candidature_id>[0-9]+)/candidate/delete$',
CandidatureDeleteView.as_view(), name='delete_candidate'),
url(r'^(?P<election_id>[0-9]+)/vote$',
VoteFormView.as_view(), name='vote'),
url(r'^(?P<election_id>[0-9]+)/detail$',
ElectionDetailView.as_view(), name='detail'),
] ]
from django.shortcuts import redirect, get_object_or_404 from django.shortcuts import get_object_or_404
from django.views.generic import ListView, DetailView, RedirectView from django.views.generic import ListView, DetailView
from django.views.generic.edit import UpdateView, CreateView, DeleteView, FormView from django.views.generic.edit import UpdateView, CreateView
from django.core.urlresolvers import reverse_lazy, reverse from django.views.generic.edit import DeleteView, FormView
from django.core.urlresolvers import reverse_lazy
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.forms.models import modelform_factory from django.core.exceptions import PermissionDenied
from django.core.exceptions import PermissionDenied, ObjectDoesNotExist, ImproperlyConfigured from django.db import transaction
from django.db import DataError, transaction
from django.forms import CheckboxSelectMultiple from django.forms import CheckboxSelectMultiple
from django.utils import timezone
from django.conf import settings
from django import forms from django import forms
from core.views import CanViewMixin, CanEditMixin, CanEditPropMixin, CanCreateMixin from core.views import CanViewMixin, CanEditMixin, CanCreateMixin
from django.db.models.query import QuerySet from django.db.models.query import QuerySet
from django.views.generic.edit import FormMixin
from core.views.forms import SelectDateTime from core.views.forms import SelectDateTime
from election.models import Election, Role, Candidature, ElectionList, Vote from election.models import Election, Role, Candidature, ElectionList, Vote
...@@ -27,12 +24,16 @@ class LimitedCheckboxField(forms.ModelMultipleChoiceField): ...@@ -27,12 +24,16 @@ class LimitedCheckboxField(forms.ModelMultipleChoiceField):
Used to replace ModelMultipleChoiceField but with Used to replace ModelMultipleChoiceField but with
automatic backend verification automatic backend verification
""" """
def __init__(self, queryset, max_choice, required=True, widget=None, label=None,
initial=None, help_text='', *args, **kwargs): def __init__(self, queryset, max_choice, required=True, widget=None,
label=None, initial=None, help_text='', *args, **kwargs):
self.max_choice = max_choice self.max_choice = max_choice
widget = forms.CheckboxSelectMultiple() widget = forms.CheckboxSelectMultiple()
super(LimitedCheckboxField, self).__init__(queryset, None, required, widget, label, super(LimitedCheckboxField, self).__init__(queryset,
initial, help_text, *args, **kwargs) None, required,
widget, label,
initial, help_text,
*args, **kwargs)
def clean(self, value): def clean(self, value):
qs = super(LimitedCheckboxField, self).clean(value) qs = super(LimitedCheckboxField, self).clean(value)
...@@ -41,7 +42,8 @@ class LimitedCheckboxField(forms.ModelMultipleChoiceField): ...@@ -41,7 +42,8 @@ class LimitedCheckboxField(forms.ModelMultipleChoiceField):
def validate(self, qs): def validate(self, qs):
if qs.count() > self.max_choice: if qs.count() > self.max_choice:
raise forms.ValidationError(_("You have selected too much candidates."), code='invalid') raise forms.ValidationError(
_("You have selected too much candidates."), code='invalid')
# Forms # Forms
...@@ -56,15 +58,18 @@ class CandidateForm(forms.ModelForm): ...@@ -56,15 +58,18 @@ class CandidateForm(forms.ModelForm):
'program': forms.Textarea 'program': forms.Textarea
} }
user = AutoCompleteSelectField('users', label=_('User to candidate'), help_text=None, required=True) user = AutoCompleteSelectField('users', label=_(
'User to candidate'), help_text=None, required=True)
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
election_id = kwargs.pop('election_id', None) election_id = kwargs.pop('election_id', None)
can_edit = kwargs.pop('can_edit', False) can_edit = kwargs.pop('can_edit', False)
super(CandidateForm, self).__init__(*args, **kwargs) super(CandidateForm, self).__init__(*args, **kwargs)
if election_id: if election_id:
self.fields['role'].queryset = Role.objects.filter(election__id=election_id).all() self.fields['role'].queryset = Role.objects.filter(
self.fields['election_list'].queryset = ElectionList.objects.filter(election__id=election_id).all() election__id=election_id).all()
self.fields['election_list'].queryset \
= ElectionList.objects.filter(election__id=election_id).all()
if not can_edit: if not can_edit:
self.fields['user'].widget = forms.HiddenInput() self.fields['user'].widget = forms.HiddenInput()
...@@ -76,10 +81,13 @@ class VoteForm(forms.Form): ...@@ -76,10 +81,13 @@ class VoteForm(forms.Form):
for role in election.roles.all(): for role in election.roles.all():
cand = role.candidatures cand = role.candidatures
if role.max_choice > 1: if role.max_choice > 1:
self.fields[role.title] = LimitedCheckboxField(cand, role.max_choice, required=False) self.fields[role.title] = LimitedCheckboxField(
cand, role.max_choice, required=False)
else: else:
self.fields[role.title] = forms.ModelChoiceField(cand, required=False, self.fields[role.title] \
widget=forms.RadioSelect(), empty_label=_("Blank vote")) = forms.ModelChoiceField(cand, required=False,
widget=forms.RadioSelect(),
empty_label=_("Blank vote"))
class RoleForm(forms.ModelForm): class RoleForm(forms.ModelForm):
...@@ -92,33 +100,40 @@ class RoleForm(forms.ModelForm): ...@@ -92,33 +100,40 @@ class RoleForm(forms.ModelForm):
election_id = kwargs.pop('election_id', None) election_id = kwargs.pop('election_id', None)
super(RoleForm, self).__init__(*args, **kwargs) super(RoleForm, self).__init__(*args, **kwargs)
if election_id: if election_id:
self.fields['election'].queryset = Election.objects.filter(id=election_id).all() self.fields['election'].queryset = Election.objects.filter(
id=election_id).all()
def clean(self): def clean(self):
cleaned_data = super(RoleForm, self).clean() cleaned_data = super(RoleForm, self).clean()
title = cleaned_data.get('title') title = cleaned_data.get('title')
election = cleaned_data.get('election') election = cleaned_data.get('election')
if Role.objects.filter(title=title, election=election).exists(): if Role.objects.filter(title=title, election=election).exists():
raise forms.ValidationError(_("This role already exists for this election"), code='invalid') raise forms.ValidationError(
_("This role already exists for this election"),
code='invalid')
class ElectionListForm(forms.ModelForm): class ElectionListForm(forms.ModelForm):
class Meta: class Meta:
model = ElectionList model = ElectionList
fields = ('title','election') fields = ('title', 'election')
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
election_id = kwargs.pop('election_id', None) election_id = kwargs.pop('election_id', None)
super(ElectionListForm, self).__init__(*args, **kwargs) super(ElectionListForm, self).__init__(*args, **kwargs)
if election_id: if election_id:
self.fields['election'].queryset = Election.objects.filter(id=election_id).all() self.fields['election'].queryset = Election.objects.filter(
id=election_id).all()
class ElectionForm(forms.ModelForm): class ElectionForm(forms.ModelForm):
class Meta: class Meta:
model = Election model = Election
fields = ['title', 'description', 'start_candidature', 'end_candidature', 'start_date', 'end_date', fields = ['title', 'description',
'edit_groups', 'view_groups', 'vote_groups', 'candidature_groups'] 'start_candidature', 'end_candidature',
'start_date', 'end_date',
'edit_groups', 'view_groups',
'vote_groups', 'candidature_groups']
widgets = { widgets = {
'edit_groups': CheckboxSelectMultiple, 'edit_groups': CheckboxSelectMultiple,
'view_groups': CheckboxSelectMultiple, 'view_groups': CheckboxSelectMultiple,
...@@ -127,10 +142,18 @@ class ElectionForm(forms.ModelForm): ...@@ -127,10 +142,18 @@ class ElectionForm(forms.ModelForm):
'candidature_groups': CheckboxSelectMultiple 'candidature_groups': CheckboxSelectMultiple
} }
start_date = forms.DateTimeField(['%Y-%m-%d %H:%M:%S'], label=_("Start date"), widget=SelectDateTime, required=True) start_date = forms.DateTimeField(
end_date = forms.DateTimeField(['%Y-%m-%d %H:%M:%S'], label=_("End date"), widget=SelectDateTime, required=True) ['%Y-%m-%d %H:%M:%S'], label=_("Start date"),
start_candidature = forms.DateTimeField(['%Y-%m-%d %H:%M:%S'], label=_("Start candidature"), widget=SelectDateTime, required=True) widget=SelectDateTime, required=True)
end_candidature = forms.DateTimeField(['%Y-%m-%d %H:%M:%S'], label=_("End candidature"), widget=SelectDateTime, required=True) end_date = forms.DateTimeField(
['%Y-%m-%d %H:%M:%S'], label=_("End date"),
widget=SelectDateTime, required=True)
start_candidature = forms.DateTimeField(
['%Y-%m-%d %H:%M:%S'], label=_("Start candidature"),
widget=SelectDateTime, required=True)
end_candidature = forms.DateTimeField(
['%Y-%m-%d %H:%M:%S'], label=_("End candidature"),
widget=SelectDateTime, required=True)
# Display elections # Display elections
...@@ -179,7 +202,8 @@ class VoteFormView(CanCreateMixin, FormView): ...@@ -179,7 +202,8 @@ class VoteFormView(CanCreateMixin, FormView):
# If we have a multiple choice field # If we have a multiple choice field
if isinstance(election_data[role_title], QuerySet): if isinstance(election_data[role_title], QuerySet):
if election_data[role_title].count() > 0: if election_data[role_title].count() > 0:
vote = Vote(role=election_data[role_title].first().role) vote = Vote(role=election_data[
role_title].first().role)
vote.save() vote.save()
for el in election_data[role_title]: for el in election_data[role_title]:
vote.candidature.add(el) vote.candidature.add(el)
...@@ -209,7 +233,8 @@ class VoteFormView(CanCreateMixin, FormView): ...@@ -209,7 +233,8 @@ class VoteFormView(CanCreateMixin, FormView):
return res return res
def get_success_url(self, **kwargs): def get_success_url(self, **kwargs):
return reverse_lazy('election:detail', kwargs={'election_id': self.election.id}) return reverse_lazy('election:detail',
kwargs={'election_id': self.election.id})
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
""" Add additionnal data to the template """ """ Add additionnal data to the template """
...@@ -232,7 +257,8 @@ class CandidatureCreateView(CanCreateMixin, CreateView): ...@@ -232,7 +257,8 @@ class CandidatureCreateView(CanCreateMixin, CreateView):
def dispatch(self, request, *arg, **kwargs): def dispatch(self, request, *arg, **kwargs):
self.election = get_object_or_404(Election, pk=kwargs['election_id']) self.election = get_object_or_404(Election, pk=kwargs['election_id'])
return super(CandidatureCreateView, self).dispatch(request, *arg, **kwargs) return super(CandidatureCreateView,
self).dispatch(request, *arg, **kwargs)
def get_initial(self): def get_initial(self):
init = {} init = {}
...@@ -252,7 +278,8 @@ class CandidatureCreateView(CanCreateMixin, CreateView): ...@@ -252,7 +278,8 @@ class CandidatureCreateView(CanCreateMixin, CreateView):
""" """
obj = form.instance obj = form.instance
obj.election = Election.objects.get(id=self.election.id) obj.election = Election.objects.get(id=self.election.id)
if(obj.election.can_candidate(obj.user)) and (obj.user == self.request.user or self.can_edit): if(obj.election.can_candidate(obj.user)) and \
(obj.user == self.request.user or self.can_edit):
return super(CreateView, self).form_valid(form) return super(CreateView, self).form_valid(form)
raise PermissionDenied raise PermissionDenied
...@@ -262,7 +289,8 @@ class CandidatureCreateView(CanCreateMixin, CreateView): ...@@ -262,7 +289,8 @@ class CandidatureCreateView(CanCreateMixin, CreateView):
return kwargs return kwargs
def get_success_url(self, **kwargs): def get_success_url(self, **kwargs):
return reverse_lazy('election:detail', kwargs={'election_id': self.election.id}) return reverse_lazy('election:detail',
kwargs={'election_id': self.election.id})
class ElectionCreateView(CanCreateMixin, CreateView): class ElectionCreateView(CanCreateMixin, CreateView):
...@@ -273,16 +301,19 @@ class ElectionCreateView(CanCreateMixin, CreateView): ...@@ -273,16 +301,19 @@ class ElectionCreateView(CanCreateMixin, CreateView):
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
if not request.user.is_subscribed: if not request.user.is_subscribed:
raise PermissionDenied raise PermissionDenied
return super(ElectionCreateView, self).dispatch(request, *args, **kwargs) return super(ElectionCreateView,
self).dispatch(request, *args, **kwargs)