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 。