Loading Procfile +1 −1 Changes for Procfile: 1 added line, 1 removed line. Original line number Diff line number Diff line web: uv run manage.py runserver worker: uv run manage.py rqworker default email email_batch --job-class django_tasks_rq.Job worker: uv run manage.py rqworker default email email_batch reports --job-class django_tasks_rq.Job elections/admin.py +43 −8 Changes for elections/admin.py: 43 added lines, 8 removed lines. Original line number Diff line number Diff line from django.contrib import admin from django.contrib import admin, messages from django.db.models import Q from django_admin_action_forms import action_with_form, AdminActionFormsMixin from django_no_queryset_admin_actions import optional_queryset_action, NoQuerySetAdminActionsMixin from django.shortcuts import render, get_object_or_404 from django.shortcuts import get_object_or_404, render from django.urls import reverse from django_admin_action_forms import AdminActionFormsMixin, action_with_form from django_no_queryset_admin_actions import ( NoQuerySetAdminActionsMixin, optional_queryset_action, ) from stats.tasks import generate_report from .forms import CardPrintoutActionForm, GenerateReportsActionForm from .models import Election, ElectionContributor, Option class OptionInline(admin.TabularInline): model = Option exclude = ["votes"] Loading Loading @@ -70,7 +77,6 @@ class ElectionContributorInline(admin.TabularInline): def has_view_permission(self, request, obj=None): return True from .forms import CardPrintoutActionForm class ElectionAdmin(NoQuerySetAdminActionsMixin, AdminActionFormsMixin): list_display = ["name", "start_date", "end_date", "is_active_status"] Loading @@ -97,13 +103,38 @@ class ElectionAdmin(NoQuerySetAdminActionsMixin, AdminActionFormsMixin): def is_active_status(self, obj): return obj.is_active @action_with_form(CardPrintoutActionForm, description="Wydrukuj karty papierowe", permissions=["print_cards"]) @action_with_form( CardPrintoutActionForm, description="Wydrukuj karty papierowe", permissions=["print_cards"], ) @optional_queryset_action() def card_printout(self, request, queryset, data): election = get_object_or_404(Election, pk=data["election"].id) return render(request, "printouts/card.html", context={"election":election, "iterateover":range(data["number_of_cards"]), "go_back_url":reverse("admin:elections_election_changelist"), "print_description":data["print_description"]}) return render( request, "printouts/card.html", context={ "election": election, "iterateover": range(data["number_of_cards"]), "go_back_url": reverse("admin:elections_election_changelist"), "print_description": data["print_description"], }, ) actions = ["card_printout"] @action_with_form( GenerateReportsActionForm, description="Generuj raporty", permissions=["print_reports"], ) def generate_reports(self, request, queryset, data): for election in queryset: generate_report.enqueue(election_id=election.id) messages.success( request, "Raporty dodane do kolejki. Ich przygotowanie może zająć chwilkę" ) actions = ["card_printout", "generate_reports"] def save_model(self, request, obj, form, change): if not change: Loading Loading @@ -162,5 +193,9 @@ class ElectionAdmin(NoQuerySetAdminActionsMixin, AdminActionFormsMixin): def has_print_cards_permission(self, request): return request.user.has_perm("elections.can_print_cards") def has_print_reports_permission(self, request): return request.user.has_perm("stats.can_print_reports") # Register your models here. admin.site.register(Election, ElectionAdmin) elections/forms.py +11 −1 Changes for elections/forms.py: 11 added lines, 1 removed line. Original line number Diff line number Diff line Loading @@ -3,10 +3,20 @@ from django_admin_action_forms import AdminActionForm from elections.models import Election class CardPrintoutActionForm(AdminActionForm): election = forms.ModelChoiceField(Election.objects, label="Głosowanie") number_of_cards = forms.IntegerField(label="Liczba kart", min_value=1) print_description = forms.BooleanField(label="Drukuj opis", required=False, initial=True) print_description = forms.BooleanField( label="Drukuj opis", required=False, initial=True ) class Meta: confirm_button_text = "Drukuj" class GenerateReportsActionForm(AdminActionForm): class Meta: help_text = "Czy na pewno chcesz wygenerować raporty dla tych głosowań? Raz wygenerowanego raportu nie da się usunąć z systemu!" confirm_button_text = "Generuj" list_objects = True hybrid/admin.py +11 −0 Changes for hybrid/admin.py: 11 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -146,6 +146,17 @@ class IssueCardAdmin(admin.ModelAdmin): + str(election_id) ) if voter.token is None: messages.error( request, "Ta osoba nie ma wygenerowanego tokenu, zatem nie jest uprawniona do głosowania!", ) return HttpResponseRedirect( reverse("admin:hybrid_issuecards_changelist") + "?election_id=" + str(election_id) ) if request.POST.get("post") == "yes": participation = Participation( voter=voter, Loading pyproject.toml +1 −0 Changes for pyproject.toml: 1 added line, 0 removed lines. Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ dependencies = [ "djangorestframework~=3.17.1", "gunicorn~=25.2.0", "ldap3~=2.9.1", "matplotlib>=3.11.0", "psycopg[binary]~=3.3.3", "tzdata~=2025.3", "whitenoise~=6.12.0", Loading Loading
Procfile +1 −1 Changes for Procfile: 1 added line, 1 removed line. Original line number Diff line number Diff line web: uv run manage.py runserver worker: uv run manage.py rqworker default email email_batch --job-class django_tasks_rq.Job worker: uv run manage.py rqworker default email email_batch reports --job-class django_tasks_rq.Job
elections/admin.py +43 −8 Changes for elections/admin.py: 43 added lines, 8 removed lines. Original line number Diff line number Diff line from django.contrib import admin from django.contrib import admin, messages from django.db.models import Q from django_admin_action_forms import action_with_form, AdminActionFormsMixin from django_no_queryset_admin_actions import optional_queryset_action, NoQuerySetAdminActionsMixin from django.shortcuts import render, get_object_or_404 from django.shortcuts import get_object_or_404, render from django.urls import reverse from django_admin_action_forms import AdminActionFormsMixin, action_with_form from django_no_queryset_admin_actions import ( NoQuerySetAdminActionsMixin, optional_queryset_action, ) from stats.tasks import generate_report from .forms import CardPrintoutActionForm, GenerateReportsActionForm from .models import Election, ElectionContributor, Option class OptionInline(admin.TabularInline): model = Option exclude = ["votes"] Loading Loading @@ -70,7 +77,6 @@ class ElectionContributorInline(admin.TabularInline): def has_view_permission(self, request, obj=None): return True from .forms import CardPrintoutActionForm class ElectionAdmin(NoQuerySetAdminActionsMixin, AdminActionFormsMixin): list_display = ["name", "start_date", "end_date", "is_active_status"] Loading @@ -97,13 +103,38 @@ class ElectionAdmin(NoQuerySetAdminActionsMixin, AdminActionFormsMixin): def is_active_status(self, obj): return obj.is_active @action_with_form(CardPrintoutActionForm, description="Wydrukuj karty papierowe", permissions=["print_cards"]) @action_with_form( CardPrintoutActionForm, description="Wydrukuj karty papierowe", permissions=["print_cards"], ) @optional_queryset_action() def card_printout(self, request, queryset, data): election = get_object_or_404(Election, pk=data["election"].id) return render(request, "printouts/card.html", context={"election":election, "iterateover":range(data["number_of_cards"]), "go_back_url":reverse("admin:elections_election_changelist"), "print_description":data["print_description"]}) return render( request, "printouts/card.html", context={ "election": election, "iterateover": range(data["number_of_cards"]), "go_back_url": reverse("admin:elections_election_changelist"), "print_description": data["print_description"], }, ) actions = ["card_printout"] @action_with_form( GenerateReportsActionForm, description="Generuj raporty", permissions=["print_reports"], ) def generate_reports(self, request, queryset, data): for election in queryset: generate_report.enqueue(election_id=election.id) messages.success( request, "Raporty dodane do kolejki. Ich przygotowanie może zająć chwilkę" ) actions = ["card_printout", "generate_reports"] def save_model(self, request, obj, form, change): if not change: Loading Loading @@ -162,5 +193,9 @@ class ElectionAdmin(NoQuerySetAdminActionsMixin, AdminActionFormsMixin): def has_print_cards_permission(self, request): return request.user.has_perm("elections.can_print_cards") def has_print_reports_permission(self, request): return request.user.has_perm("stats.can_print_reports") # Register your models here. admin.site.register(Election, ElectionAdmin)
elections/forms.py +11 −1 Changes for elections/forms.py: 11 added lines, 1 removed line. Original line number Diff line number Diff line Loading @@ -3,10 +3,20 @@ from django_admin_action_forms import AdminActionForm from elections.models import Election class CardPrintoutActionForm(AdminActionForm): election = forms.ModelChoiceField(Election.objects, label="Głosowanie") number_of_cards = forms.IntegerField(label="Liczba kart", min_value=1) print_description = forms.BooleanField(label="Drukuj opis", required=False, initial=True) print_description = forms.BooleanField( label="Drukuj opis", required=False, initial=True ) class Meta: confirm_button_text = "Drukuj" class GenerateReportsActionForm(AdminActionForm): class Meta: help_text = "Czy na pewno chcesz wygenerować raporty dla tych głosowań? Raz wygenerowanego raportu nie da się usunąć z systemu!" confirm_button_text = "Generuj" list_objects = True
hybrid/admin.py +11 −0 Changes for hybrid/admin.py: 11 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -146,6 +146,17 @@ class IssueCardAdmin(admin.ModelAdmin): + str(election_id) ) if voter.token is None: messages.error( request, "Ta osoba nie ma wygenerowanego tokenu, zatem nie jest uprawniona do głosowania!", ) return HttpResponseRedirect( reverse("admin:hybrid_issuecards_changelist") + "?election_id=" + str(election_id) ) if request.POST.get("post") == "yes": participation = Participation( voter=voter, Loading
pyproject.toml +1 −0 Changes for pyproject.toml: 1 added line, 0 removed lines. Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ dependencies = [ "djangorestframework~=3.17.1", "gunicorn~=25.2.0", "ldap3~=2.9.1", "matplotlib>=3.11.0", "psycopg[binary]~=3.3.3", "tzdata~=2025.3", "whitenoise~=6.12.0", Loading