Рассылка писем из админки django

категория: Django
Наконец-то нашел время для описания одной из топиков, которые просили объяснить. Сегодня будет про обычную рассылку писем с помощью команд во встроенной админке django для множества моделей. К примеру будут модели: банк и страховая компания, у каждой модели есть поле email. Настройку сервиса отправки не будут описывать - тут все зависит от предпочтений, я использую mandrill. 1. Создаем обычную модель, в которой будут сохраняться тексты сообщений models.py
class Delivery(models.Model):
    message = models.TextField(u'Текст сообщения')
2. Создаем функцию send_message, которая будет принимать письма, выбранные чекбоксами в админке queryset и класс получателя письма cls. Вытягиваются все email(если поле заполнено) из модели получателя письма и отправляются все эти письма всем получателям в цикле. Для примера использовал самый обычный механизм, чтоб понятно было. Сохраняем функцию в какой-то helpers.py или можно прям в admin.py.
def send_message(self, request, queryset, cls):
    # Get all email from objects except blank strings
    recipient_list = filter(None, cls.objects.values_list('email', flat=True))
    #
    # Send mail to checked messages in admin
    for obj in queryset:
        send_mail(u'Сообщение от администрации', obj.message, 'мой email', 
                  recipient_list)
    self.message_user(request, u'сообшения были успешно отправлены')
3. В админке теперь просто подключаем модель с письмами Delivery и прописываем, в нашем примере, два действия: отправка банкам и отправка писем кредитным компаниям
from django.contrib import admin
from django.core.mail import send_mail
#
from banks.models import Bank, Creditor
from .models import Delivery
#
#
@admin.register(Delivery)
class DeliveryAdmin(admin.ModelAdmin):
    '''
        Admin View for Delivery
    '''
    list_display = ('message',)
    actions = ['send_bank_message', 'send_creditor_message']
#
    def send_bank_message(self, request, queryset):
        send_message(self, request, queryset, Bank)
#
    def send_creditor_message(self, request, queryset):
        send_message(self, request, queryset, Creditor)
#
    send_bank_message.short_description = u'Отправить банкам'
    send_creditor_message.short_description = u'Отправить страховым'
4. В админке в "Действиях" в разделе Delivery должны появится варианты "Отправить банкам" и "Отправить страховым". Создаем письма и отправляем.


blog comments powered by Disqus