Commit 1b803cb4 authored by Staś Kycia's avatar Staś Kycia
Browse files

added retry failed mails button

parent fe3161fc
Loading
Loading
Loading
Loading
+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
    
+5 −5
Changes for mails/tasks.py: 5 added lines, 5 removed lines.
Original line number Diff line number Diff line
@@ -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)
@@ -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 = []
@@ -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
+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
+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
+4 −1
Changes for vote/models.py: 4 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -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