一部のモデルのいくつかの変更に基づいて電子メールを送信する管理パネルを介して信号を作成する機能を提供するDjangoアプリケーション。
アプリケーションを使用すると、独自の制約と電子メールテンプレートを設定し、最小限の構成でこれを達成することを目指しています。
管理者は自分で信号/電子メールをセットアップすることができます
管理者ユーザーがデータベースで何かが発生したときに電子メールの送信を要求した場合、私たちは何をしますか?開発者は、新しい信号を作成し、制約を設定し、電子メールテンプレートを作成し、すべてを組み合わせて、ユニットテストを作成してから展開します。比較的単純ですが、特にさまざまな変更に合わせて複数の信号がある場合は時間がかかります。これはすぐに非常に長いプロセスになります。
このアプリケーションの目的は、管理者が機能を要求して展開を待つのではなく、管理者がこれらの信号自体を作成する方法を提供することにより、これを解決することを目的としています。これは、管理者のプレッシャーを緩和するための素晴らしい方法です。
管理者はどのようなフィールドをパラメージに入力するかをどのように知るでしょうか?アプリケーションは、保存する前にフォームを検証しますが、フィールドにオートコンプリートも提供します。
電子メールテンプレートのプロトタイピングとテスト
いくつかのより大きなチームのテンプレートを作成およびテストすることは、時間のかかるプロセスになる可能性があります。これは、要求が何らかの理由で画面を表示できず、テスト環境に展開してテンプレートをテストできる人からのものである場合に特に当てはまります。
その後、プロセスは少し退屈になる可能性があります。テストしてコードを展開し、レビューし、コードを調整し、再展開し、プロセスを数回繰り返すシナリオに行ったことがありますか?
このアプリケーションは、管理者がリッチテキストエディターを使用してHTMLコンテンツ自体を作成する方法を提供することにより、これを解決することを目的としています。これにより、管理者は電子メールコンテンツ自体を迅速にプロトタイプしてテストできます。準備ができたら、「ソースコードの表示」をクリックして、その甘いソースコードを送信するだけです。
新しい注文が当社のウェブサイトに配置されたときはいつでも、特定のチームに通知したいと想像してみましょう。
次の信号を設定することから始めます。
このスクリーンショットでは、いくつかのことがわかります。
モデルは「sample_app |注文」に設定されています。この例では、注文モデル( example/sample_app/models.pyで見つけることができます)を作成しました。
これは、注文モデルにポスト保存信号を作成していることを意味します。
この例では、プレーンテキストとHTMLコンテンツフィールドの値を入力しました。テンプレートを使用するのと同じように、Curly Bracesを使用してコンテキストにプレースホルダーを追加できることに気付くでしょう。
これらを次のように使用しました。
Order ID: {{ instance.id }}
Customer Name {{ instance.customer.id }}
Customer Email {{ instance.customer.email }}この信号はOrderモデルに関連するため、 instance単一のOrderインスタンスを表します。
メールが送信されると、プレースホルダーは実際のコンテキスト値に置き換えられます。
利用可能な唯一のコンテキストはinstanceであることに注意することが重要であるため、他のコンテキストはinstanceオブジェクトからアクセスできる必要があります。
これは、テンプレートコンテキストを提供する1つの方法です。必要に応じて、テンプレートファイルへのパスであるテンプレートフィールドの値を提供することができます。
また、メーリングリストをnew_order_mailing_listに設定していることも確認できます。注文モデルには、電子メールのリストを返す対応するnew_order_mailing_listメソッドがあります。つまり、この特定の電子メールは、 Order.new_order_mailing_listによって返された電子メールに送信されます。さまざまな電子メールリストを含むさまざまな方法を作成することにより、さまざまなメーリングリストを作成する方法が効果的にあります。または、メーリングリストのコンマ分離電子メールのリストを使用することもできます。
制約を追加し始める前に、信号を保存するためにあります。これにより、AutoComplete機能が役立つため、設定信号制約が簡単になります。信号を保存して信号の制約を設定するまでの時間を心配している場合は、いつでもアクティブなフラグを事前にfalseに設定できます。これにより、メールが送信されないようになります。
これで、信号の制約を設定できます。 2つの制約を作成します。
created == True )。customer.id > 10)。 
post_save信号を作成する際の一般的なチェックの1つは、インスタンスが新しいインスタンスであることです。これは、 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。 settings.pyファイルにINSTALLED_APPSにtinymceを追加します。
INSTALLED_APPS = [
' app_1 `,
' app_2 `,
'...' ,
'tinymce' ,
] ii。 settings.pyファイルにINSTALLED_APPSにemail_signalsを追加します。これは、このアプリケーションを使用して信号を作成するモデルを含むアプリの後に追加する必要があります。
INSTALLED_APPS = [
' app_1 `,
' app_2 `,
'...' ,
'tinymce' ,
' email_signals `
]2.移行を実行し、静的を収集します
python manage.py migrate
python manage.py collectstatic
3. URLを更新します(オプション)ルートurls.pyファイルを更新して、次のことを含めます。
from django . urls import include
url_patterns = [
path ( 'email-signals/' , include ( 'email_signals.urls' )),
path ( 'tinymce/' , include ( 'tinymce.urls' )),
]これらの厄介なスヌーパーの生活を難しくするために、URLを推測が少し難しいものに変更することをお勧めします。アプリケーションパスはすべて、ユーザーがリンクにアクセスできるようにスタッフメンバーである必要があります。
このステップはオプションですが、管理領域の制約を設定するためにはるかに簡単になるため、実行することをお勧めします。 URLは、制約を構築するときにオプションをドロップダウンするために必要です。
4.デフォルトの電子メール(オプション)を追加すると、 EMAIL_SIGNAL_DEFAULT_SENDERを設定に追加します。 EG: EMAIL_SIGNAL_DEFAULT_SENDER = '[email protected]定義するたびに送信者メールを明示的に指定したくない場合は、プロジェクトsettings.pyでEMAIL_SIGNAL_DEFAULT_SENDERを設定できます。
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という2つの関数を作成しました。後で、信号をセットアップすると、各信号に使用するメーリングリストを設定するように求められます。これは、関数名「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 | 制約をテストするときに使用する最初のパラメーター。このパラメーターは、Signal Kwargsまたはモデルインスタンスに存在する必要があります。 |
| 比較 | 比較 | パラメーターを比較する方法を定義します。例:パラメーター1はパラメーター2よりも大きい。 |
| パラメーター1 | param_1 | (オプション)制約をテストするときに使用する2番目のパラメーター。制約が賢明なものである場合、このパラメーターは空のままにすることができます。たとえば、制約が「true」である場合、パラメーター2は必要ありません。しかし、制約が「より大きい」の場合、パラメーター2が必要です。パラメーター2は、「A」、「1」、「1.1」などの原始的なタイプでもあります。アプリケーションは、可能であれば文字列を数値に変換しようとします。 |
パラメーターは、パラメーター1と2の両方の深いもので、オブジェクトの奥深くで検索できます。次の構造があり、信号がCustomerOrderインスタンスを受け取ったとしましょう。
classdiagram
ユーザー<| - お客様
顧客<| - カスタマーオーダー
クラスユーザー{
id
ファーストネーム
苗字
メール
}
クラスの顧客{
id
ユーザー
fav_language
}
class customerOrder {
id
お客様
order_id
合計
}
CustomerOrderインスタンス(この変数orderを呼び出す)が与えられた場合、制約で以下を設定できます。
| # | パラメーター1 | 比較 | パラメーター2 |
|---|---|---|---|
| 1 | 'customer.user.id' | より大きい | '5' |
| 2 | 'customer.user.first_name' | に等しい | 'customer.user.last_name' |
Constraint 1は次のことを確認します。
order . customer . user . id > 5同様に、Constraint 2は以下を確認します。
order . customer . user . first_name == order . customer . user . last_nameすべての制約が満たされた場合にのみ、メールは送信されます。
リポジトリには、開始するためのサンプルプロジェクトが付属しています。自分でこのアプリケーションをテストしたい場合は、リポジトリをクローニングすることをお勧めします。
exampleに移動し、内部でDjangoプロジェクトを実行します。
提案や改善がある場合は、お気軽に問題を開いたり、リクエストをプルしたりしてください。
コードを紹介したい場合は、次の手順に従ってください。
npm install実行して、プロジェクトのサンプルの依存関係をインストールしますnpm start 。これにより、変更が監視され、ファイルが再コンパイルされます。それ以外の場合は、 npm run buildファイルを1回コンパイルします。貢献するときは、変更のテストを追加し、すべてのテストが合格していることを確認してください(テストを参照)。また、コードが正しくフォーマットされており、コードが糸くずに合格していることも確認してください。
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を実行できます。