Loading mails/admin.py +35 −0 Changes for mails/admin.py: 35 added lines, 0 removed lines. Original line number Diff line number Diff line from django.contrib import admin from django.urls import path from django.contrib import messages from django.shortcuts import render from django.http import HttpResponseRedirect from django.urls import reverse from .models import Mail from .tasks import send_mail_batch_task class MailAdmin(admin.ModelAdmin): change_list_template = 'admin/change_list_mail.html' list_display = ['voter', 'status', 'error_message', 'created_at', 'last_try_date'] ordering = ['-created_at'] list_filter = ['status'] def get_urls(self): urls = super().get_urls() custom_urls = [ path( 'retry_failed/', self.admin_site.admin_view(self.retry_failed_view), name='retry_failed_mails' ) ] return custom_urls + urls def retry_failed_view(self, request): if request.POST.get('post') == 'yes': send_mail_batch_task.enqueue(base_status='ERROR') messages.info(request, 'Rozpoczęto wysyłanie ponowne wysyłanie niedostarczonych wiadomości.') return HttpResponseRedirect(reverse('admin:mails_mail_changelist')) context = admin.site.each_context(request) context.update({ 'action_checkbox_name': admin.helpers.ACTION_CHECKBOX_NAME, 'title' : 'Ponowne wysyłanie maili' }) return render(request, 'admin/retry_failed_mails_confirmation.html', context) def has_add_permission(self, request): return False Loading mails/tasks.py +5 −5 Changes for mails/tasks.py: 5 added lines, 5 removed lines. Original line number Diff line number Diff line Loading @@ -15,10 +15,10 @@ from functools import partial import time @task(queue_name='email_batch') def send_mail_batch_task(): def send_mail_batch_task(base_status='PENDING'): with transaction.atomic(): ids_to_update = list( Mail.objects.filter(status='PENDING') Mail.objects.filter(status=base_status) .select_for_update(skip_locked=True) [:settings.EMAIL_BATCH_SIZE] .values_list('pk', flat=True) Loading @@ -37,8 +37,8 @@ def send_mail_batch_task(): connection.open() except: Mail.objects.filter(pk__in=ids_to_update).update(status='ERROR', error_message='Nie udało się nawiązać połączenia z serwerem SMTP') if Mail.objects.filter(status='PENDING').exists(): send_mail_batch_task.enqueue() if Mail.objects.filter(status=base_status).exists(): send_mail_batch_task.enqueue(base_status=base_status) return emails_to_send = [] Loading Loading @@ -88,7 +88,7 @@ def send_mail_batch_task(): if Mail.objects.filter(status='PENDING').exists(): send_mail_batch_task.enqueue() send_mail_batch_task.enqueue(base_status=base_status) @task Loading mails/templates/admin/change_list_mail.html 0 → 100644 +8 −0 Changes for mails/templates/admin/change_list_mail.html: 8 added lines, 0 removed lines. Original line number Diff line number Diff line {% extends 'admin/change_list.html' %} {% block object-tools-items %} {{ block.super }} <li> <a href="{% url 'admin:retry_failed_mails' %}">Ponów nieudane</a> </li> {% endblock %} No newline at end of file mails/templates/admin/retry_failed_mails_confirmation.html 0 → 100644 +21 −0 Changes for mails/templates/admin/retry_failed_mails_confirmation.html: 21 added lines, 0 removed lines. Original line number Diff line number Diff line {% extends 'admin/base_site.html' %} {% load admin_urls %} {% block title %} {{ title }} | {{ site_title }}{% endblock %} {% block content %} <div class="delete-confirmation delete-selected-confirmation"> <p>Czy na pewno chcesz ponowić próbę wysłania wszystkich niedostarczonych maili?</p> <form method="post"> {% csrf_token %} <div> <input type="hidden" name="post" value="yes"> <input type="submit" value="Tak, na pewno"> <a role="button" onclick="window.history.back()" class="button cancel-link">Nie, zabierz mnie stąd</a> </div> </form> <br class="clear"> </div> {% endblock %} No newline at end of file vote/models.py +4 −1 Changes for vote/models.py: 4 added lines, 1 removed line. Original line number Diff line number Diff line Loading @@ -8,11 +8,14 @@ User = get_user_model() class Participation(models.Model): voter = models.ForeignKey(Voter, on_delete=models.CASCADE) voter = models.ForeignKey(Voter, on_delete=models.PROTECT) election = models.ForeignKey(Election, on_delete=models.CASCADE) is_remote = models.BooleanField(default=True) card_issued_by = models.ForeignKey(User, blank=True, null=True, on_delete=models.PROTECT) def __str__(self): return f'Udział wyborcy {self.voter.first_name} {self.voter.last_name} ({self.voter.username}) w wyborach {self.election.name}. Jedynym sposobem usunięcia jest usunięcie tego głosowania.' class Meta: unique_together = ['voter', 'election'] Loading Loading
mails/admin.py +35 −0 Changes for mails/admin.py: 35 added lines, 0 removed lines. Original line number Diff line number Diff line from django.contrib import admin from django.urls import path from django.contrib import messages from django.shortcuts import render from django.http import HttpResponseRedirect from django.urls import reverse from .models import Mail from .tasks import send_mail_batch_task class MailAdmin(admin.ModelAdmin): change_list_template = 'admin/change_list_mail.html' list_display = ['voter', 'status', 'error_message', 'created_at', 'last_try_date'] ordering = ['-created_at'] list_filter = ['status'] def get_urls(self): urls = super().get_urls() custom_urls = [ path( 'retry_failed/', self.admin_site.admin_view(self.retry_failed_view), name='retry_failed_mails' ) ] return custom_urls + urls def retry_failed_view(self, request): if request.POST.get('post') == 'yes': send_mail_batch_task.enqueue(base_status='ERROR') messages.info(request, 'Rozpoczęto wysyłanie ponowne wysyłanie niedostarczonych wiadomości.') return HttpResponseRedirect(reverse('admin:mails_mail_changelist')) context = admin.site.each_context(request) context.update({ 'action_checkbox_name': admin.helpers.ACTION_CHECKBOX_NAME, 'title' : 'Ponowne wysyłanie maili' }) return render(request, 'admin/retry_failed_mails_confirmation.html', context) def has_add_permission(self, request): return False Loading
mails/tasks.py +5 −5 Changes for mails/tasks.py: 5 added lines, 5 removed lines. Original line number Diff line number Diff line Loading @@ -15,10 +15,10 @@ from functools import partial import time @task(queue_name='email_batch') def send_mail_batch_task(): def send_mail_batch_task(base_status='PENDING'): with transaction.atomic(): ids_to_update = list( Mail.objects.filter(status='PENDING') Mail.objects.filter(status=base_status) .select_for_update(skip_locked=True) [:settings.EMAIL_BATCH_SIZE] .values_list('pk', flat=True) Loading @@ -37,8 +37,8 @@ def send_mail_batch_task(): connection.open() except: Mail.objects.filter(pk__in=ids_to_update).update(status='ERROR', error_message='Nie udało się nawiązać połączenia z serwerem SMTP') if Mail.objects.filter(status='PENDING').exists(): send_mail_batch_task.enqueue() if Mail.objects.filter(status=base_status).exists(): send_mail_batch_task.enqueue(base_status=base_status) return emails_to_send = [] Loading Loading @@ -88,7 +88,7 @@ def send_mail_batch_task(): if Mail.objects.filter(status='PENDING').exists(): send_mail_batch_task.enqueue() send_mail_batch_task.enqueue(base_status=base_status) @task Loading
mails/templates/admin/change_list_mail.html 0 → 100644 +8 −0 Changes for mails/templates/admin/change_list_mail.html: 8 added lines, 0 removed lines. Original line number Diff line number Diff line {% extends 'admin/change_list.html' %} {% block object-tools-items %} {{ block.super }} <li> <a href="{% url 'admin:retry_failed_mails' %}">Ponów nieudane</a> </li> {% endblock %} No newline at end of file
mails/templates/admin/retry_failed_mails_confirmation.html 0 → 100644 +21 −0 Changes for mails/templates/admin/retry_failed_mails_confirmation.html: 21 added lines, 0 removed lines. Original line number Diff line number Diff line {% extends 'admin/base_site.html' %} {% load admin_urls %} {% block title %} {{ title }} | {{ site_title }}{% endblock %} {% block content %} <div class="delete-confirmation delete-selected-confirmation"> <p>Czy na pewno chcesz ponowić próbę wysłania wszystkich niedostarczonych maili?</p> <form method="post"> {% csrf_token %} <div> <input type="hidden" name="post" value="yes"> <input type="submit" value="Tak, na pewno"> <a role="button" onclick="window.history.back()" class="button cancel-link">Nie, zabierz mnie stąd</a> </div> </form> <br class="clear"> </div> {% endblock %} No newline at end of file
vote/models.py +4 −1 Changes for vote/models.py: 4 added lines, 1 removed line. Original line number Diff line number Diff line Loading @@ -8,11 +8,14 @@ User = get_user_model() class Participation(models.Model): voter = models.ForeignKey(Voter, on_delete=models.CASCADE) voter = models.ForeignKey(Voter, on_delete=models.PROTECT) election = models.ForeignKey(Election, on_delete=models.CASCADE) is_remote = models.BooleanField(default=True) card_issued_by = models.ForeignKey(User, blank=True, null=True, on_delete=models.PROTECT) def __str__(self): return f'Udział wyborcy {self.voter.first_name} {self.voter.last_name} ({self.voter.username}) w wyborach {self.election.name}. Jedynym sposobem usunięcia jest usunięcie tego głosowania.' class Meta: unique_together = ['voter', 'election'] Loading