Django应用程序,可通过管理面板提供功能来创建信号,该应用程序将根据某些模型发送电子邮件。
该应用程序允许您设置自己的约束和电子邮件模板,并旨在通过最少的配置来实现这一目标。
管理员可以自己设置信号/电子邮件
如果管理用户要求在数据库上发生某些事情时发送电子邮件,我们该怎么办?我们开发人员创建一个新信号,设置任何约束,创建电子邮件模板,将所有内容拼凑在一起,创建单元测试然后部署。相对简单,但仍然耗时,尤其是在有多个信号进行各种更改时。这很快成为一个很长的过程。
该应用程序旨在通过为管理员提供一种创建这些信号本身而不必请求功能并等待部署的方式来解决此问题。这是减轻开发人员压力的好方法,同时使管理员能够快速获得结果。
管理员将如何知道要输入哪些字段的参数?该应用程序在保存之前验证表格,但也为字段提供了自动完成。
快速原型制作和测试电子邮件模板
为某些更大的团队创建和测试模板可能是一个耗时的过程。当请求是来自某人出于任何原因无法查看您的屏幕并依靠您部署到测试环境以能够测试模板的人时,尤其如此。
然后,这个过程可能会变得有些乏味。曾经在某种情况下部署一些代码进行测试,对其进行审查,不得不调整一些代码,重新部署它并重复该过程几次?
该应用程序旨在通过为管理员提供一种使用丰富的文本编辑器来创建HTML内容本身的方法来解决此问题。这允许管理员快速原型并本身测试电子邮件内容。一旦准备就绪,他们所要做的就是单击“显示源代码”,然后将该甜蜜的源代码发送给您。
让我们想象,只要在我们的网站上下一个新订单时,我们都想通知特定团队。
我们将首先设置以下信号: 
在此屏幕截图中,我们注意到了几件事。
该模型已设置为“ sample_app | order”。在此示例中,我们创建了一个订单模型(可以在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返回的电子邮件。NEW_ORDER_MAILING_LIST。通过创建包含不同电子邮件列表的各种方法,我们实际上有一种创建不同邮件列表的方法。另外,我们可以将邮件列表的逗号分隔电子邮件列表使用。
在开始添加任何约束之前,我们会介绍以保存信号。这将使设置信号约束变得容易,因为它将允许自动完成功能帮助我们。如果您担心保存信号和设置信号约束之间的时间,则可以始终事先将活动标志设置为False。这将阻止发送任何电子邮件。
现在,我们可以为信号设置约束。我们将创建两个约束:
created == True )。customer.id > 10)。 
创建post_save信号的一个常见检查是检查实例是一个新实例。这可以通过将参数设置为created ,并与“为true”进行比较来完成。
我们的订单模型有一个customer字段,它是customer模型的外键。我们可以穿越customer对象以获取客户的id 。然后,我们可以检查customer.id > 10 。
该应用具有方便的自动完成功能,可以帮助您穿越模型字段和任何缓存的属性。不必担心犯任何错误,因为有验证可以拒绝无法访问的任何参数。
保存此信号现在将确保仅当订单为新实例并且客户ID大于10时才发送信号。
要安装应用程序,请运行以下命令:
pip install django-email-signals
PIP安装命令将是大多数人所需的全部,但是,如果您想在引擎盖下看并查看发生了什么,则可以克隆源目录:
git clone https://github.com/Salaah01/django-email-signals.git
1。添加到INSTALLED_APPS i。将tinymce添加到您的settings.py文件中的INSTALLED_APPS 。
INSTALLED_APPS = [
' app_1 `,
' app_2 `,
'...' ,
'tinymce' ,
] ii。将email_signals添加到您的settings.py文件中的INSTALLED_APPS 。应在包含您要使用此应用程序创建信号的任何模型的任何应用程序之后添加此功能。
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更改为更难猜测的东西,只是为了使那些讨厌的窥探者变得更加艰难。应用程序路径均要求用户成为工作人员能够访问链接。
尽管此步骤是可选的,但我们建议这样做,因为它将使管理区域中的设置约束更加容易。需要在构建约束时提供选项的下拉列表。
4。添加默认电子邮件(可选)将EMAIL_SIGNAL_DEFAULT_SENDER添加到您的设置中。例如: EMAIL_SIGNAL_DEFAULT_SENDER = '[email protected]如果您不想为定义的每个信号明确指定发送者电子邮件,则可以在项目settings.py中设置EMAIL_SIGNAL_DEFAULT_SENDER 。
5。将模型混合添加到要筹集信号的模型上,您需要将以下Mixin添加为模型的依赖性: 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电子邮件发送。 |
| 主题 | 主题 | 电子邮件主题 |
| 来自电子邮件 | 来自_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 | 测试约束时要使用的第一个参数。该参数必须存在于信号夸或模型实例中。 |
| 比较 | 比较 | 定义如何比较参数。例如:参数1大于参数2。 |
| 参数1 | param_1 | (可选)测试约束时要使用的第二个参数。当约束是明智的时,可以将此参数留为空。例如,如果约束是“ true”,则不需要参数2。但是,如果约束是“大于”,则需要参数2。参数2也可以是一种原始类型,例如“ A”,“ 1”,“ 1.1”。如果可以的话,该应用程序将尝试将字符串转换为数字。 |
参数是参数1和2的深度,可让您在对象内部搜索。假设我们有以下结构,并且信号已收到一个CustomerOrder实例。
classDiagram
用户<| - 顾客
客户<| - 客户订单
类用户{
ID
名
姓
电子邮件
}
班级客户{
ID
用户
fav_language
}
班级客户订单{
ID
顾客
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启动WebPack Dev Server。这将注意更改并重新编译文件。否则,运行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 。