Commit 3fb5bc2a authored by Staś Kycia's avatar Staś Kycia
Browse files

allowed entering invalid local votes for supported elections

parent bc07fa95
Loading
Loading
Loading
Loading
+18 −15
Changes for hybrid/admin.py: 18 added lines, 15 removed lines.
Original line number Diff line number Diff line
@@ -14,7 +14,7 @@ from django.utils.decorators import method_decorator
from elections.models import Election
from voters.models import Voter
from vote.models import Participation
from .models import HybridElectionVoter, EnterHybridVotesElection
from .models import IssueCards, EnterVotes
from .forms import LocalVotesForm

class ElectionContextFilter(admin.SimpleListFilter):
@@ -30,14 +30,14 @@ class ElectionContextFilter(admin.SimpleListFilter):
        val = self.value()
        return queryset.annotate(election_id=Value(val if val else "", output_field=CharField()))

class HybridElectionVoterAdmin(admin.ModelAdmin):
class IssueCardAdmin(admin.ModelAdmin):
    list_display = ['first_name', 'last_name', 'username', 'group', 'issue_card', 'card_issued_by']
    exclude = ['token', 'token_generation_date', 'last_email_date']
    search_fields = ['first_name', 'last_name', 'username', 'group']
    list_filter = ['group', ElectionContextFilter]
    search_fields = ['first_name', 'last_name', 'username'] 
    
    change_list_template = 'admin/hybrid_election_voter_list.html'
    change_list_template = 'admin/issue_card_list.html'

    def changelist_view(self, request, extra_context = None):
        extra_context = extra_context or {}
@@ -101,11 +101,11 @@ class HybridElectionVoterAdmin(admin.ModelAdmin):
        
        if not election.is_hybrid or not election.is_active:
            messages.error(request, 'Kartę można wydać tylko dla trwających wyborów hybrydowych')
            return HttpResponseRedirect(reverse('admin:hybrid_hybridelectionvoter_changelist')+'?election_id='+str(election_id))
            return HttpResponseRedirect(reverse('admin:hybrid_issuecards_changelist')+'?election_id='+str(election_id))
        
        if Participation.objects.filter(election=election, voter=voter).exists():
            messages.error(request, 'Ta osoba już zagłosowała w tych wyborach.')
            return HttpResponseRedirect(reverse('admin:hybrid_hybridelectionvoter_changelist')+'?election_id='+str(election_id))
            return HttpResponseRedirect(reverse('admin:hybrid_issuecards_changelist')+'?election_id='+str(election_id))


        if request.POST.get('post') == 'yes':
@@ -113,7 +113,7 @@ class HybridElectionVoterAdmin(admin.ModelAdmin):
            participation.save()
            
            messages.success(request, 'Pomyślnie zapisano wydanie karty')
            return HttpResponseRedirect(reverse('admin:hybrid_hybridelectionvoter_changelist')+'?election_id='+str(election_id))
            return HttpResponseRedirect(reverse('admin:hybrid_issuecards_changelist')+'?election_id='+str(election_id))
        
        context = admin.site.each_context(request)
        
@@ -135,8 +135,8 @@ class HybridElectionVoterAdmin(admin.ModelAdmin):
    def has_delete_permission(self, request, obj = None):
        return False
    
class EnterHybridVotesElectionAdmin(admin.ModelAdmin):
    list_display = ['name', 'start_date', 'end_date', 'local_votes_action']
class EnterVotesAdmin(admin.ModelAdmin):
    list_display = ['name', 'local_votes_action']
    ordering = ['-created_at', '-updated_at']

    exclude = ['invalid_votes', 'local_votes_entered']
@@ -173,15 +173,15 @@ class EnterHybridVotesElectionAdmin(admin.ModelAdmin):
        
        if not election.is_hybrid or election.is_active:
            messages.error(request, 'Głosy stacjonarne można wprowadzić tylko dla zakończonych wyborów hybrydowych')
            return HttpResponseRedirect(reverse('admin:hybrid_enterhybridvoteselection_changelist'))
            return HttpResponseRedirect(reverse('admin:hybrid_entervotes_changelist'))
        
        if election.local_votes_entered:
            messages.error(request, 'Głosy stacjonarne zostały już wprowadzone dla tego głosowania')
            return HttpResponseRedirect(reverse('admin:hybrid_enterhybridvoteselection_changelist'))
            return HttpResponseRedirect(reverse('admin:hybrid_entervotes_changelist'))


        if request.POST.get('post') == 'yes':
            form = LocalVotesForm(request.POST, options_queryset=options_queryset, expected_votes_count=expected_votes_count)
            form = LocalVotesForm(request.POST, options_queryset=options_queryset, expected_votes_count=expected_votes_count, allow_invalid=election.allow_invalid)
            
            if form.is_valid():
                for option in options_queryset:
@@ -191,14 +191,17 @@ class EnterHybridVotesElectionAdmin(admin.ModelAdmin):
                    option.votes += votes
                    option.save()
                    
                if election.allow_invalid:
                    election.invalid_votes += form.cleaned_data.get('option_invalid')    
                
                election.local_votes_entered = True
                election.save()
                
                messages.success(request, 'Pomyślnie wprowadzono głosy stacjonarne')
                return HttpResponseRedirect(reverse('admin:hybrid_enterhybridvoteselection_changelist'))
                return HttpResponseRedirect(reverse('admin:hybrid_entervotes_changelist'))
            
        else:
            form = LocalVotesForm(options_queryset=options_queryset, expected_votes_count=expected_votes_count)
            form = LocalVotesForm(options_queryset=options_queryset, expected_votes_count=expected_votes_count, allow_invalid=election.allow_invalid)
        
        context = admin.site.each_context(request)
        context.update({
@@ -219,5 +222,5 @@ class EnterHybridVotesElectionAdmin(admin.ModelAdmin):
    def has_delete_permission(self, request, obj = None):
        return False

admin.site.register(HybridElectionVoter, HybridElectionVoterAdmin)
admin.site.register(EnterHybridVotesElection, EnterHybridVotesElectionAdmin)
 No newline at end of file
admin.site.register(IssueCards, IssueCardAdmin)
admin.site.register(EnterVotes, EnterVotesAdmin)
 No newline at end of file
+11 −0
Changes for hybrid/forms.py: 11 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -5,12 +5,17 @@ class LocalVotesForm(forms.Form):
    def __init__(self, *args, **kwargs):
        self.options_queryset = kwargs.pop('options_queryset', [])
        self.expected_votes_count = kwargs.pop('expected_votes_count', 0)
        self.allow_invalid = kwargs.pop('allow_invalid', False)
        
        super().__init__(*args, **kwargs)
        
        for option in self.options_queryset:
            field_name = f'option_{option.id}'
            self.fields[field_name] = forms.IntegerField(label=option.name, initial=0, min_value=0, required=True, widget=forms.NumberInput(attrs={'class': 'form-control'}))
            
        if self.allow_invalid:
            self.fields['option_invalid'] = forms.IntegerField(label='GŁOS NIEWAŻNY', initial=0, min_value=0, required=True, widget=forms.NumberInput(attrs={'class': 'form-control'}))
            
    def clean(self):
        cleaned_data = super().clean()
        
@@ -23,6 +28,12 @@ class LocalVotesForm(forms.Form):
            if value is not None:
                entered_votes_count += value
                
        if self.allow_invalid:
            value = cleaned_data.get('option_invalid')
            
            if value is not None:
                entered_votes_count += value
                
        if entered_votes_count != self.expected_votes_count:
            raise ValidationError(f'Otrzymano {entered_votes_count} głosów, a oczekiwano {self.expected_votes_count}')
        
+2 −2
Changes for hybrid/models.py: 2 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -3,13 +3,13 @@ from django.db import models
from voters.models import Voter
from elections.models import Election

class HybridElectionVoter(Voter):
class IssueCards(Voter):
    class Meta:
        proxy = True
        verbose_name = 'Wydaj karty'
        verbose_name_plural = 'Wydawanie kart'
        
class EnterHybridVotesElection(Election):
class EnterVotes(Election):
    class Meta:
        proxy = True
        verbose_name = 'Wprowadź głosy stacjonarne'
+1 −1

File changed.

Contains only whitespace changes.