Eine Django -Anwendung, die Funktionen zum Erstellen von Signalen über das Administratorbereich bietet, das E -Mails anhand einiger Änderungen an einigen Modellen sendet.
Mit der Anwendung können Sie Ihre eigenen Einschränkungen und E -Mail -Vorlagen festlegen, und zielt darauf ab, dies mit minimaler Konfiguration zu erreichen.
Administratoren können selbst Signale/E -Mails einrichten
Wenn ein Administrator für eine E -Mail angefordert hat, die gesendet werden soll, wenn etwas in der Datenbank passiert, was tun wir dann? Wir Entwickler erstellen ein neues Signal, stellen alle Einschränkungen fest, erstellen die E -Mail -Vorlagen, stellen Sie alles zusammen, erstellen Sie Unit -Tests und stellen Sie dann bereit. Relativ einfach, aber noch zeitaufwändig, insbesondere wenn mehrere Signale für verschiedene Änderungen eingerichtet werden. Dies wird schnell zu einem ziemlich langen Prozess.
Diese Anwendung zielt darauf ab, dies zu lösen, indem Administratoren eine Möglichkeit bieten, diese Signale selbst zu erstellen, anstatt die Funktion anzufordern und auf die Bereitstellung zu warten. Dies ist eine großartige Möglichkeit, den Druck aus Entwicklern zu lindern und Administratoren die Möglichkeit zu geben, schnell Ergebnisse zu erzielen.
Wie würde ein Administrator wissen, welche Felder für die Paramente eingeben sollen? Die Anwendung validiert das Formular vor dem Speichern, bietet aber auch automatische Vervollständigung für die Felder.
Schnelles Prototyping und Testen einer E -Mail -Vorlage
Das Erstellen und Testen von Vorlagen für einige größere Teams kann ein zeitaufwändiger Prozess sein. Dies gilt insbesondere dann, wenn die Anfrage von jemandem stammt, der aus irgendeinem Grund Ihren Bildschirm nicht anzeigen kann und sich darauf verlassen kann, dass Sie in einer Testumgebung bereitstellen, um die Vorlage zu testen.
Der Prozess kann dann etwas langweilig werden. Waren Sie schon einmal in einem Szenario, in dem Sie einen Code zum Testen bereitstellen, ihn überprüft haben, einen Code optimieren, ihn neu anwenden und den Vorgang einige Male wiederholen müssen?
Diese Anwendung zielt darauf ab, dies zu lösen, indem Administratoren die HTML -Inhalte selbst mit einem reichen Texteditor erstellen können. Auf diese Weise können Administratoren den E -Mail -Inhalt selbst schnell prototypisieren und testen. Sobald sie fertig sind, müssen sie nur auf "Quellcode anzeigen" klicken und diesen süßen Quellcode an Sie senden.
Stellen wir uns vor, wir möchten ein bestimmtes Team mitteilen, wenn eine neue Bestellung auf unserer Website aufgegeben wird.
Wir würden mit dem folgenden Signal beginnen: 
In diesem Screenshot bemerken wir ein paar Dinge.
Das Modell wurde auf "sample_app | order" eingestellt. In diesem Beispiel haben wir ein Bestellmodell erstellt (kann in example/sample_app/models.py gefunden werden) und haben Signalart zum Speichern von Signal eingestellt.
Dies bedeutet, dass wir ein Post -Save -Signal für das Bestellmodell erstellen.
In diesem Beispiel haben wir Werte für die Felder der einfachen Text- und HTML -Inhaltsfelder eingegeben. Sie werden feststellen, dass wir genau wie mit Vorlagen Platzhalter für den Kontext mithilfe der lockigen Klammern hinzufügen können.
Wir haben diese auf folgende Weise verwendet:
Order ID: {{ instance.id }}
Customer Name {{ instance.customer.id }}
Customer Email {{ instance.customer.email }} Da sich dieses Signal auf das Order bezieht, stellt instance eine einzelne Order dar.
Wenn die E -Mail gesendet wird, werden die Platzhalter durch die tatsächlichen Kontextwerte ersetzt.
Es ist wichtig zu beachten, dass der einzige verfügbare Kontext instance ist, und daher muss ein anderer Kontext über das instance zugänglich sein.
Dies ist eine Möglichkeit, einen Vorlagenkontext bereitzustellen. Wenn Sie es vorziehen, können Sie stattdessen einen Wert für Vorlagenfeld angeben, der ein Pfad zu einer Vorlagendatei ist.
Wir können auch sehen, dass wir die Mailingliste auf new_order_mailing_list gesetzt haben. In unserem Bestellmodell haben wir eine entsprechende Methode von new_order_mailing_list , die eine Liste von E -Mails zurückgibt. Dies bedeutet, dass diese bestimmte E -Mail an die per Order.new_order_mailing_list zurückgegebenen E -Mails gesendet wird. Durch das Erstellen verschiedener Methoden mit verschiedenen E -Mail -Listen haben wir effektiv eine Möglichkeit, verschiedene Mailinglisten zu erstellen. Alternativ können wir einfach eine Liste von von Kommas getrennten E -Mails für die Mailingliste verwenden.
Bevor wir anfangen, irgendwelche Einschränkungen hinzuzufügen, werden wir geboren, um das Signal zu speichern. Auf diese Weise erleichtert die Einschränkungen der Einstellungssignale, da die automatische Funktionsfunktion uns hilft. Wenn Sie sich Sorgen über die Zeit zwischen dem Speichern des Signals und dem Einstellen der Signalbeschränkungen machen, können Sie das aktive Flag immer im Voraus auf False einstellen. Dies verhindert, dass jede E -Mail gesendet wird.
Wir können jetzt die Einschränkungen für das Signal einstellen. Wir werden zwei Einschränkungen erstellen:
created == True ).customer.id > 10). 
Eine übliche Überprüfung beim Erstellen eines post_save -Signals ist, dass die Instanz eine neue Instanz ist. Dies kann durch Einstellen des Parameters auf created und der Vergleich zu "wahr" festgelegt werden.
Unser Bestellmodell verfügt über ein customer , das ein ausländischer Schlüssel zum customer ist. Wir können das customer durchqueren, um die id des Kunden zu erhalten. Wir können dann prüfen, ob customer.id > 10 .
Die App verfügt über eine praktische automatische Funktion, mit der Sie durch Modellfelder und zwischengespeicherte Eigenschaften durchqueren können. Machen Sie sich keine Sorgen, dass Sie Fehler machen, da eine Validierung vorhanden ist, um alle Parameter abzulehnen, auf die nicht zugegriffen werden kann.
Durch das Speichern dieses Signals wird nun sichergestellt, dass das Signal nur dann gesendet wird, wenn die Bestellung eine neue Instanz ist und die Kunden -ID größer als 10 ist.
Führen Sie den folgenden Befehl aus, um die Anwendung zu installieren:
pip install django-email-signals
Der Befehl pip install ist alles, was für die meisten Menschen erforderlich ist. Wenn Sie jedoch unter die Motorhaube schauen und sehen möchten, was los ist, können Sie das Quellverzeichnis klonen:
git clone https://github.com/Salaah01/django-email-signals.git
1. Hinzufügen zu INSTALLED_APPS i. Fügen Sie Ihren INSTALLED_APPS in Ihrer Datei settings.py tinymce .
INSTALLED_APPS = [
' app_1 `,
' app_2 `,
'...' ,
'tinymce' ,
] ii. Fügen INSTALLED_APPS email_signals Ihrer Datei settings.py hinzu. Dies sollte nach Apps hinzugefügt werden, die Modelle enthalten, für die Sie mit dieser Anwendung Signale erstellen möchten.
INSTALLED_APPS = [
' app_1 `,
' app_2 `,
'...' ,
'tinymce' ,
' email_signals `
]2. Führen Sie Migrationen durch und sammeln Sie statische
python manage.py migrate
python manage.py collectstatic
3. Aktualisieren Sie URLs (optional) Aktualisieren Sie Ihre Root urls.py -Datei, um Folgendes anzuschließen:
from django . urls import include
url_patterns = [
path ( 'email-signals/' , include ( 'email_signals.urls' )),
path ( 'tinymce/' , include ( 'tinymce.urls' )),
]Wir empfehlen, die URL in etwas schwereres zu wechseln, um diesen lästigen Schnupfen das Leben zu machen. Bei der Anwendungspfade muss der Benutzer ein Mitarbeiter sein, um auf die Links zugreifen zu können.
Obwohl dieser Schritt optional ist, empfehlen wir dies, dies zu tun, da die Einstellungsbeschränkungen im Verwaltungsbereich erheblich erleichtert werden. Die URLs werden benötigt, um beim Erstellen Ihrer Einschränkungen einen Dropdown mit Optionen zu bieten.
4. Fügen Sie Ihren Einstellungen eine Standard EMAIL_SIGNAL_DEFAULT_SENDER -Mail hinzu (optional) . EG: EMAIL_SIGNAL_DEFAULT_SENDER = '[email protected] Wenn Sie nicht explizit eine Sender -E -Mail für jedes von Ihnen definierte Signal angeben möchten, können Sie EMAIL_SIGNAL_DEFAULT_SENDER in Ihren settings.py festlegen.
5. Fügen Sie das Modellmixin zu den Modellen hinzu, die Sie email_signals.models.EmailSignalMixin anheben möchten.
Beispiel: Nehmen wir an, Sie haben das folgende Modell.
from django . db import models
class Customer ( models . Model ):
name = models . CharField ( max_length = 200 , null = True )
email = models . CharField ( max_length = 200 )Sie müssten dieses Modell in Folgendes ändern:
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. Fügen Sie Empfänger hinzu , abhängig von der Änderung der Daten möchten Sie möglicherweise eine E -Mail an verschiedene Personen senden. Wir erleichtern dies, indem wir die verschiedenen möglichen Mailinglisten in das Modell selbst einrichten. Dieser ist zuerst einfacher zu zeigen als zu erklären, dann zu erklären:
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]' ] Wir haben zwei Funktionen genannt customer_emails und management_mailing_list erstellt, die jeweils eine Sammlung von E -Mail -Adressen zurückgeben. Später werden wir beim Einrichten der Signale gebeten, die Mailingliste für jedes Signal so festzulegen. Hier würden wir unsere Funktionsnamen `` customer_emails or Management_mailing_list` eingeben.
Dies ermöglicht uns daher, verschiedene Mailinglisten in unseren Modellen einzurichten.
Nachdem das Setup abgeschlossen ist, können Signale über den Administrator (oder durch direktes Aktualisieren der Datenbank) hinzugefügt werden.
Wir werden mir vorstellen, dass ich eine Site auf Localhost ausführe, und so kann das Admin -Panel gefunden werden, indem Sie zu http: // localhost: 8000/admin/navigiert. Die Signale können dann zugegriffen werden, indem Sie zu http: // localhost: 8000/admin/E -Mail_signals/Signal/zugegriffen werden. Wir werden zunächst einige Signale hinzufügen. Klicken Sie auf "Signal hinzufügen", um loszulegen.
Ein weiser Mann hat mir beigebracht , dass es besser ist, einen Moment albern zu klingen, als etwas nicht zu wissen und für immer dumm zu sein . In diesem Sinne, obwohl es offensichtlich erscheint, werden wir die Optionen in der Form durchgehen und diskutieren, wofür jede Option verantwortlich ist.
| Feldetikett | Feldname | Beschreibung |
|---|---|---|
| Name | Name | Ein Name für Ihr Signal, nur um es einfacher zu machen, von anderen Datensätzen zu unterscheiden. |
| Beschreibung | Beschreibung | (Optional) Beschreibung für Ihr Signal. |
| Modell (Tabelle) | content_type | Wählen Sie aus dem Dropdown -Modell das Modell, auf das dieses Signal bezieht. |
| Einfacher Textinhalt | Plain_Message | (Optional) Klartext -E -Mail zum Senden. |
| HTML -Inhalt | html_message | (Optional) HTML -E -Mail zum Senden. |
| Thema | Thema | E -Mail -Betreff |
| Aus E -Mail | von_email | (Optional) Der E -Mail -Absender. Standardeinstellungen zu settings.EMAIL_SIGNAL_DEFAULT_SENDER . |
| Mailingliste | mailing_list | Die Empfängerliste, in der der von Ihnen eingegebene Text einer in der Modellklasse genannten Methode mit demselben Namen entspricht. ZB: Wenn Sie customer_mails eingeben, muss eine Methode namens customer_mails vorhanden sein, die eine Sammlung von E -Mails in der Modellklasse zurückgibt. Alternativ kann dies eine Liste von E -Mails sein, die von einem Komma getrennt sind. [email protected],[email protected] |
| Vorlage | Vorlage | (Optional) Pfad zu einer Vorlage, falls Sie eine E -Mail aus einer Vorlage abgeben möchten. Dadurch wird Djangos Vorlagenloader verwendet. Wenn der Wert, den Sie hier bereitstellen, sollten Sie relativ zu settings.TEMPLATES[i]['DIRS'] sein. |
| Signalart | Signal_type | Art des Signals für diesen Datensatz zu erhöhen. |
| Aktiv | aktiv | Ein Schalter zum Ein- und Ausschalten dieses Signals. |
Signalbeschränkungen In diesem Inline -Modell können Sie einige Einschränkungen festlegen, die feststellen, ob das Signal von Fall zu Fall angehoben werden sollte.
| Feldetikett | Feldname | Beschreibung |
|---|---|---|
| Parameter 1 | param_1 | Der erste Parameter, der beim Testen einer Einschränkung verwendet wird. Dieser Parameter muss im Signal -KWARGS oder in der Modellinstanz vorhanden sein. |
| Vergleich | Vergleich | Definieren Sie, wie Sie die Parameter vergleichen. ZB: Parameter 1 ist größer als Parameter 2. |
| Parameter 1 | param_1 | (Optional) Der zweite Parameter, der beim Testen einer Einschränkung verwendet wird. Dieser Parameter kann leer gelassen werden, wenn die Einschränkung etwas Sinnvolles ist. Wenn beispielsweise die Einschränkung "ist wahr" ist, ist kein Parameter 2 erforderlich. Wenn die Einschränkung jedoch "größer als" ist, ist Parameter 2 erforderlich. Parameter 2 kann auch ein primitiver Typ sein, wie "a", "1", "1.1". Die Anwendung versucht, Strings in Zahlen umzuwandeln, wenn sie kann. |
Die Parameter sind tiefe Parameter 1 und 2 ermöglichen es Ihnen, tief in einem Objekt zu suchen. Nehmen wir an, wir haben die folgende Struktur und Signal hat eine CustomerOrder erhalten.
ClassDiagram
Benutzer <| -- Kunde
Kunde <| - Kundenorder
Klassenbenutzer {
Ausweis
First_Name
last_name
E-Mail
}
Klassenkunde {
Ausweis
Benutzer
fav_klanguage
}
Klasse CustomerOrder {
Ausweis
Kunde
order_id
gesamt
}
Angesichts einer CustomerOrder (wir werden diese variable order nennen) können wir Folgendes in unseren Einschränkungen festlegen:
| # | Parameter 1 | Vergleich | Parameter 2 |
|---|---|---|---|
| 1 | 'customer.user.id' | Größer als | '5' |
| 2 | 'customer.user.first_name' | Gleich | 'customer.user.last_name' |
Die Einschränkung 1 wird Folgendes überprüfen:
order . customer . user . id > 5In ähnlicher Weise wird die Einschränkung 2 Folgendes überprüfen:
order . customer . user . first_name == order . customer . user . last_nameNur wenn alle Einschränkungen erfüllt sind, wird die E -Mail gesendet.
Das Repository wird mit einem Beispielprojekt geliefert, um Ihnen den Einstieg zu erleichtern. Wenn Sie diese Anwendung bevorzugen, empfehle ich, das Repository zu klonen.
Navigieren zu example und Ausführen des Django -Projekts im Inneren.
Wenn Sie Vorschläge oder Verbesserungen haben, können Sie bitte ein Problem eröffnen oder Anfrage anziehen.
Wenn Sie Code beitragen möchten, befolgen Sie bitte die folgenden Schritte:
npm install aus, um die Abhängigkeiten für das Beispielprojekt zu installierennpm start um den WebPack Dev Server zu starten. Dies wird nach Änderungen beobachten und die Dateien neu kompilieren. Andernfalls führen Sie npm run build um die Dateien einmal zu kompilieren.Stellen Sie beim Beitrag sicher, dass Sie Tests für Ihre Änderungen hinzugefügt haben und dass alle Ihre Tests bestehen (siehe Tests). Bitte versichern Sie auch, dass Ihr Code korrekt formatiert ist und dass Ihr Code das Leinen übergeht.
Wir verwenden black und flake8 um unseren Code zu formatieren und abzuspiegeln. Wenn Sie make haben, können Sie Folgendes ausführen, um Ihren Code zu formatieren und abzugeben:
make format
make lintAlternativ können Sie die folgenden Befehle ausführen:
black email_signals
flake8 --exclude=migrations email_signals In diesem Repository wird tox verwendet, um Tests gegen mehrere Versionen von Python und Django auszuführen. Wenn Sie make haben, können Sie die Tests einfach durch Ausführen von make tox ausführen. Andernfalls können Sie die Tests ausführen, indem Sie tox -s im Stammwurzel des Repositorys ausführen.
Wenn Sie die Tests nur für Ihre aktuelle Python -Version durchführen möchten, können Sie entweder tox -e py oder python3 runtests.py ausführen.