Приложение Django, которое предоставляет функциональность для создания сигналов через панель администратора, которая будет отправлять электронные письма на основе некоторых изменений в некоторые модели.
Приложение позволяет вам устанавливать свои собственные ограничения и шаблоны электронной почты и стремится достичь этого с минимальной конфигурацией.
Администраторы могут сами настраивать сигналы/электронные письма
Если пользователь администратора попросил отправить электронное письмо, когда что -то происходит в базе данных, что мы делаем? Мы разработчики создаем новый сигнал, устанавливаем любые ограничения, создаем шаблоны электронной почты, собираем все вместе, создаете модульные тесты, а затем развертывают. Относительно простые, но все еще трудоемкие, особенно когда есть несколько сигналов для настройки для различных изменений. Это быстро становится довольно длительным процессом.
Это приложение направлено на то, чтобы решить это, предоставив администратора возможность создавать эти сигналы сами, а не запрашивать эту функцию и ждать развертывания. Это отличный способ ослабить давление с разработчиков, давая администратору способность быстро получить результаты.
Как администратор узнает, какие поля ввести для параметров? Приложение проверяет форму перед сохранением, но также предоставляет автозаполнение для полей.
Быстро прототипирование и тестирование шаблона электронной почты
Создание и тестирование шаблонов для некоторых более крупных команд может быть трудоемким процессом. Это особенно верно, когда запрос от кого -то, кто по какой -либо причине не может просматривать ваш экран и полагается на то, что вы развертываете в тестовой среде, чтобы иметь возможность проверить шаблон.
Затем процесс может стать немного утомительным. Вы когда -нибудь были в сценарии, в котором вы развертываете какой -то код для тестирования, просмотрели его, должны изменить код, переделывать его и повторять процесс несколько раз?
Это приложение направлено на то, чтобы решить это, предоставив администратору способ создать контент HTML, используя богатый текстовый редактор. Это позволяет администраторам быстро прототипить и проверять контент по электронной почте сами. После готовности все, что им нужно сделать, это нажать «Показать исходный код» и отправить вам этот сладкий исходный код.
Давайте представим, что мы хотим уведомить конкретную команду всякий раз, когда новый заказ размещается на нашем веб -сайте.
Мы начнем с установки следующего сигнала: 
На этом скриншоте мы замечаем пару вещей.
Модель была установлена на «Образец_апп | Порядок». Для этого примера мы создали модель заказа (можно найти в example/sample_app/models.py ), и мы установили тип сигнала для публикации сохранения .
Это означает, что мы создаем сигнал сохранения поста на модели заказа.
В этом примере мы ввели значения для простого текста и HTML -контента. Вы заметите, что, как и мы с шаблонами, мы можем добавить заполнители для контекста, используя вьющиеся скобки.
Мы использовали это следующим образом:
Order ID: {{ instance.id }}
Customer Name {{ instance.customer.id }}
Customer Email {{ instance.customer.email }} Поскольку этот сигнал относится к модели Order , instance представляет собой один экземпляр Order .
Когда электронное письмо будет отправлено, заполнители будут заменены фактическими значениями контекста.
Важно отметить, что единственным доступным контекстом является instance , и поэтому любой другой контекст должен быть доступен через объект instance .
Это один из способов обеспечения контекста шаблона. Если вы предпочитаете, вместо этого вы можете предоставить значение для шаблона , которое является путем к файлу шаблона.
Мы также можем видеть, что мы установили список рассылки на new_order_mailing_list . В нашей модели заказа у нас есть соответствующий метод new_order_mailing_list , который возвращает список электронных писем. Это означает, что это конкретное письмо будет отправлено в электронные письма, возвращаемые Order.new_order_mailing_list . Создавая различные методы, содержащие различные списки электронных писем, у нас эффективно есть способ создания различных списков рассылки. В качестве альтернативы, мы можем просто использовать список разделенных запятых электронных писем для списка рассылки.
Прежде чем мы начнем добавлять какие -либо ограничения, мы не должны сохранить сигнал. Это облегчит настройку ограничений сигнала, поскольку это позволит нам помочь. Если вы обеспокоены временем между сохранением сигнала и установкой ограничений сигнала, вы всегда можете установить активный флаг на ложный заранее. Это предотвратит отправку любого электронного письма.
Теперь мы можем установить ограничения для сигнала. Мы создадим два ограничения:
created == True ).customer.id > 10). 
Одна общая проверка при создании сигнала post_save состоит в том, чтобы проверить, что экземпляр является новым экземпляром. Это можно сделать, установив параметр для created , и сравнение с «верно».
Наша модель заказа имеет поле customer , которая является иностранным ключом к модели customer . Мы можем пройти через объект customer , чтобы получить id клиента. Затем мы можем проверить, если customer.id > 10 .
Приложение имеет удобную функцию автозаполнения, которая поможет вам пройти через поля модели и любые кэшированные свойства. Не беспокойтесь о том, чтобы делать какие -либо ошибки, так как существует валидация, чтобы отклонить какие -либо параметры, которые не могут быть доступны.
Сохранение этого сигнала теперь гарантирует, что сигнал будет отправлен только тогда, когда заказ является новым экземпляром, а идентификатор клиента превышает 10.
Чтобы установить приложение, запустите следующую команду:
pip install django-email-signals
Команда установки PIP будет всем, что требуется для большинства людей, однако, если вы хотите посмотреть под капот и посмотреть, что происходит, вы можете клонировать справочный каталог:
git clone https://github.com/Salaah01/django-email-signals.git
1. Добавить в INSTALLED_APPS i. Добавьте tinymce в свой файл INSTALLED_APPS в вашем файле settings.py .
INSTALLED_APPS = [
' app_1 `,
' app_2 `,
'...' ,
'tinymce' ,
] II Добавьте email_signals в свой файл INSTALLED_APPS в вашем файле settings.py . Это должно быть добавлено после любых приложений, которые содержат модели, для которых вы хотели бы создавать сигналы, используя это приложение.
INSTALLED_APPS = [
' app_1 `,
' app_2 `,
'...' ,
'tinymce' ,
' email_signals `
]2. Запустите миграции и собирайте статические
python manage.py migrate
python manage.py collectstatic
3. Обновить URL -адреса (необязательно) Обновите файл root urls.py , чтобы включить следующее:
from django . urls import include
url_patterns = [
path ( 'email-signals/' , include ( 'email_signals.urls' )),
path ( 'tinymce/' , include ( 'tinymce.urls' )),
]Мы рекомендуем изменить URL -адрес на что -то немного сложнее, чтобы угадать, просто чтобы сделать жизнь труднее для этих надоедливых Snoopers. Все пути приложения требуют, чтобы пользователь был сотрудником, чтобы иметь возможность получить доступ к ссылкам.
Хотя этот шаг не является обязательным, мы рекомендуем сделать это, поскольку он будет намного проще ограничения настройки в области администратора. URL -адреса необходимы для предоставления раскрывающихся вариантов при создании ваших ограничений.
4. Добавьте электронное письмо по умолчанию (необязательно) Добавить EMAIL_SIGNAL_DEFAULT_SENDER в ваши настройки. Например: EMAIL_SIGNAL_DEFAULT_SENDER = '[email protected] Если вы не хотите явно указывать электронное письмо отправителя для каждого определения сигнала, который вы определяете, вы можете установить EMAIL_SIGNAL_DEFAULT_SENDER в вашем проекте settings.py .
5. Добавьте модельный микшин в модели, которые вы хотите поднять сигналы, вам нужно будет добавить следующий миксин в качестве зависимости к моделям: email_signals.models.EmailSignalMixin .
Пример: давайте предположим, что у вас есть следующая модель.
from django . db import models
class Customer ( models . Model ):
name = models . CharField ( max_length = 200 , null = True )
email = models . CharField ( max_length = 200 )Вам нужно изменить эту модель на следующее:
from email_signals . models import EmailSignalMixin
class Customer ( models . Model , EmailSignalMixin ):
name = models . CharField ( max_length = 200 , null = True )
email = models . CharField ( max_length = 200 )6. Добавьте получателей в зависимости от изменения данных, вы можете отправить электронное письмо разным людям. Мы облегчаем это, установив различные возможные списки рассылки в саму модель. Сначала это легче показать, а затем объяснить:
from email_signals . models import EmailSignalMixin
class Customer ( models . Model , EmailSignalMixin ):
name = models . CharField ( max_length = 200 , null = True )
email = models . CharField ( max_length = 200 )
def customer_emails ( self ):
"""Recipient is the customer."""
return [ self . email ]
def management_mailing_list ( self ):
"""Recipient list includes management."""
return [ '[email protected]' , '[email protected]' ] Мы создали две функции, называемые customer_emails и management_mailing_list , каждый из которых возвращает коллекцию адресов электронной почты. Позже, когда мы настроем сигналы, нас попросят установить список рассылки для использования для каждого сигнала. Здесь мы введем имена наших функций `` customer_emails or Management_mailing_list`.
Поэтому это позволяет нам настраивать различные списки рассылки в наших моделях.
Теперь, когда настройка завершена, сигналы могут быть добавлены через администрацию (или путем напряжения обновления базы данных).
Мы представляем, что я запускаю сайт на Localhost, и поэтому администратор может быть найдена путем навигации по http: // localhost: 8000/admin/. Затем можно получить доступ к навигации по http: // localhost: 8000/admin/email_signals/signal/. Мы начнем с добавления некоторых сигналов. Нажмите «Добавить сигнал», чтобы начать.
Мудрый человек научил меня , что лучше на мгновение звучать глупо, чем не знать что -то и чувствовать себя глупо навсегда . Итак, в этом духе, хотя это может показаться очевидным, мы рассмотрим варианты в форме и обсудим, за что отвечает каждый вариант.
| Полевой ярлык | Имя поля | Описание |
|---|---|---|
| Имя | имя | Имя для вашего сигнала, просто чтобы облегчить отличие от других записей. |
| Описание | описание | (Необязательно) Описание для вашего сигнала. |
| Модель (таблица) | content_type | Выберите из выпадения модели, к которой относится этот сигнал. |
| Простой текстовый контент | plain_message | (Необязательно) Простая текстовая электронная почта для отправки. |
| Контент HTML | html_message | (Необязательно) HTML электронное письмо на отправку. |
| Предмет | предмет | Электронная почта |
| По электронной почте | from_email | (Необязательно) отправитель электронной почты. По умолчанию на settings.EMAIL_SIGNAL_DEFAULT_SENDER . |
| Список рассылки | mailing_list | Список получателей, в который вводится текст, соответствует методу, вызванному в классе модели с тем же именем. Например: если вы введете customer_mails , то должен быть метод, который называется customer_mails , который возвращает коллекцию электронных писем в классе модели. В качестве альтернативы, это может быть список электронных писем, разделенных запятой. Например: [email protected],[email protected] отправит электронное письмо в обе эти электронные письма. |
| Шаблон | шаблон | (Необязательно) Путь к шаблону, если вы хотите отобразить электронное письмо из шаблона. Это использует шаблонный загрузчик Django, поэтому, поскольку значение, которое вы здесь предоставляете, должно быть относительно settings.TEMPLATES[i]['DIRS'] . |
| Тип сигнала | Signal_type | Тип сигнала для повышения для этой записи. |
| Активный | активный | Переключатель, чтобы включить и выключать этот сигнал. |
Ограничения сигнала Эта встроенная модель - это то, где вы можете установить некоторые ограничения, которые будут определять, должен ли сигнал быть поднят на случай.
| Полевой ярлык | Имя поля | Описание |
|---|---|---|
| Параметр 1 | PARAM_1 | Первый параметр для использования при тестировании ограничения. Этот параметр должен существовать в сигнале Kwargs или в экземпляре модели. |
| Сравнение | сравнение | Определите, как сравнить параметры. Например: параметр 1 больше, чем параметр 2. |
| Параметр 1 | PARAM_1 | (Необязательно) Второй параметр для использования при тестировании ограничения. Этот параметр можно оставить пустым, когда ограничение является чем -то разумным. Например, если ограничение «является истинным», то нет необходимости в параметре 2. Но если ограничение является «больше, чем», то необходим параметр 2. Параметр 2 также может быть примитивным типом, таким как «A», «1», «1.1». Приложение попытается преобразовать строки в числа, если это возможно. |
Параметры являются глубокими параметрами 1 и 2 позволяют искать глубоко внутри объекта. Давайте предположим, что у нас есть следующая структура, и сигнал получил экземпляр CustomerOrder .
ClassDiagram
Пользователь <| -- Клиент
Клиент <| - Customerorder
пользователь класса {
идентификатор
имя
фамилия
электронная почта
}
Класс Клиент {
идентификатор
пользователь
fav_language
}
класс Customerorder {
идентификатор
клиент
order_id
общий
}
Учитывая экземпляр CustomerOrder (мы назваем этот order переменной), мы можем установить следующее в наших ограничениях:
| # | Параметр 1 | Сравнение | Параметр 2 |
|---|---|---|---|
| 1 | 'customer.user.id' | Больше | '5' |
| 2 | 'customer.user.first_name' | Равен | 'customer.user.last_name' |
Ограничение 1 проверит следующее:
order . customer . user . id > 5Точно так же ограничение 2 проверит следующее:
order . customer . user . first_name == order . customer . user . last_nameТолько когда будут удовлетворены все ограничения, будет отправлено электронное письмо.
Репозиторий поставляется с примером проекта, чтобы начать вас. Если вы предпочитаете проверить это приложение самостоятельно, я рекомендую клонировать репозиторий.
Навигация по example и запуск проекта Django внутри.
Если у вас есть какие -либо предложения или улучшения, пожалуйста, не стесняйтесь открывать проблему или привлечь запрос.
Если вы хотите внести код, пожалуйста, выполните следующие шаги:
npm install для установки зависимостей для примера проектаnpm start запустите Dev WebPack Dev. Это будет следить за изменениями и перекомпилировать файлы. В противном случае запустите npm run build , чтобы разместить файлы один раз.При вклад, пожалуйста, убедитесь, что вы добавили тесты для ваших изменений и что все ваши тесты проходят (см. Тестирование). Пожалуйста, также убедитесь, что ваш код отформатируется правильно и что ваш код проходит в личинке.
Мы используем black и flake8 , чтобы форматировать и заполнить наш код. Если у вас есть make , вы можете запустить следующее для форматирования и приготовления кода:
make format
make lintВ качестве альтернативы, вы можете запустить следующие команды:
black email_signals
flake8 --exclude=migrations email_signals Этот репозиторий использует tox для запуска тестов против нескольких версий Python и Django. Если вы make установленные, вы можете просто запустить тесты, запустив make tox . В противном случае вы можете запустить тесты, запустив tox -s в корне репозитория.
Если вы хотите запустить тесты только для вашей текущей версии Python, вы можете либо запустить tox -e py или python3 runtests.py .