Aplikasi Django yang menyediakan fungsionalitas untuk membuat sinyal melalui panel admin yang akan mengirim email berdasarkan beberapa perubahan pada beberapa model.
Aplikasi ini memungkinkan Anda untuk menetapkan kendala dan templat email Anda sendiri dan bertujuan untuk mencapai ini dengan konfigurasi minimal.
Admin dapat mengatur sinyal/email itu sendiri
Jika pengguna admin telah meminta email untuk dikirim ketika sesuatu terjadi pada database, apa yang kita lakukan? Kami pengembang membuat sinyal baru, menetapkan kendala apa pun, membuat templat email, menyatukan semuanya, membuat tes unit dan kemudian menggunakan. Relatif sederhana, tetapi masih memakan waktu terutama ketika ada beberapa sinyal untuk mengatur berbagai perubahan. Ini dengan cepat menjadi proses yang cukup panjang.
Aplikasi ini bertujuan untuk menyelesaikannya dengan menyediakan cara bagi admin untuk membuat sinyal -sinyal ini sendiri daripada harus meminta fitur dan menunggu penyebaran. Ini adalah cara yang bagus untuk meringankan tekanan dari pengembang sambil memberikan admin kemampuan untuk mendapatkan hasil dengan cepat.
Bagaimana admin mengetahui bidang apa yang harus dimasukkan untuk params? Aplikasi memvalidasi formulir sebelum menyimpan tetapi juga memberikan Autocomplete untuk bidang.
Prototipe dengan cepat dan menguji template email
Membuat dan menguji templat untuk beberapa tim yang lebih besar dapat menjadi proses yang memakan waktu. Ini terutama benar ketika permintaan tersebut berasal dari seseorang yang karena alasan apa pun tidak dapat melihat layar Anda dan mengandalkan Anda menggunakan lingkungan pengujian untuk dapat menguji templat.
Prosesnya kemudian bisa menjadi sedikit membosankan. Pernah berada dalam skenario di mana Anda menggunakan beberapa kode untuk diuji, sudah ditinjau, harus mengubah beberapa kode, menggunakan kembali, dan sudah diulangi beberapa kali?
Aplikasi ini bertujuan untuk menyelesaikannya dengan menyediakan cara bagi admin untuk membuat konten HTML sendiri menggunakan editor teks yang kaya. Ini memungkinkan admin untuk dengan cepat membuat prototipe dan menguji konten email itu sendiri. Setelah siap, yang perlu mereka lakukan adalah mengklik "Tampilkan Kode Sumber", dan kirim kode sumber manis itu kepada Anda.
Mari kita bayangkan bahwa kita ingin memberi tahu tim tertentu setiap kali pesanan baru ditempatkan di situs web kita.
Kami akan memulai dengan mengatur sinyal berikut: 
Di tangkapan layar ini kami melihat beberapa hal.
Model telah diatur ke "sampel_app | order". Untuk contoh ini kami telah membuat model pesanan (dapat ditemukan di example/sample_app/models.py ) dan kami telah mengatur tipe sinyal untuk memposting simpan .
Ini berarti bahwa kami membuat sinyal simpan pos pada model pesanan.
Dalam contoh ini, kami telah memasukkan nilai untuk bidang teks biasa dan konten HTML. Anda akan melihat bahwa seperti yang kami lakukan dengan templat, kami dapat menambahkan placeholder untuk konteks menggunakan kawat gigi keriting.
Kami telah menggunakan ini dengan cara berikut:
Order ID: {{ instance.id }}
Customer Name {{ instance.customer.id }}
Customer Email {{ instance.customer.email }} Karena sinyal ini berkaitan dengan model Order , instance mewakili instance Order tunggal.
Ketika email dikirim, placeholder akan diganti dengan nilai konteks aktual.
Penting untuk dicatat bahwa satu -satunya konteks yang tersedia adalah instance , sehingga konteks lain harus dapat diakses melalui objek instance .
Ini adalah salah satu cara untuk memberikan konteks template. Jika Anda lebih suka, Anda malah dapat memberikan nilai untuk bidang template yang merupakan jalur ke file template.
Kami juga dapat melihat bahwa kami telah menetapkan milis ke new_order_mailing_list . Dalam model pesanan kami, kami memiliki metode new_order_mailing_list yang sesuai yang mengembalikan daftar email. Ini berarti, email khusus ini akan dikirim ke email yang dikembalikan dengan Order.new_order_mailing_list . Dengan membuat berbagai metode yang berisi daftar email yang berbeda, kami secara efektif memiliki cara untuk membuat milis yang berbeda. Atau, kami bisa menggunakan daftar email yang terpisah koma untuk milis.
Sebelum kita mulai menambahkan kendala apa pun, kita tidak akan menyimpan sinyal. Ini akan membuat pengatur kendala sinyal mudah karena akan memungkinkan fitur AutoComplete untuk membantu kami. Jika Anda khawatir tentang waktu antara menyimpan sinyal dan mengatur kendala sinyal, Anda selalu dapat mengatur bendera aktif menjadi false sebelumnya. Ini akan mencegah email dari dikirim.
Kami sekarang dapat mengatur kendala untuk sinyal. Kami akan membuat dua kendala:
created == True ).customer.id > 10). 
Salah satu pemeriksaan umum saat membuat sinyal post_save adalah untuk memeriksa adalah instance adalah instance baru. Ini dapat dilakukan dengan mengatur parameter untuk created dan perbandingan dengan "benar".
Model pesanan kami memiliki bidang customer yang merupakan kunci asing bagi model customer . Kami dapat melintasi objek customer untuk mendapatkan id pelanggan. Kami kemudian dapat memeriksa apakah customer.id > 10 .
Aplikasi ini memiliki fitur pelengkapan otomatis yang akan membantu Anda melintasi bidang model dan setiap properti yang di -cache. Jangan khawatir membuat kesalahan karena ada validasi untuk menolak parameter apa pun yang tidak dapat diakses.
Menyimpan sinyal ini sekarang akan memastikan bahwa sinyal hanya akan dikirim ketika pesanan adalah instance baru dan ID pelanggan lebih besar dari 10.
Untuk menginstal aplikasi, jalankan perintah berikut:
pip install django-email-signals
Perintah pemasangan PIP akan menjadi semua yang diperlukan untuk kebanyakan orang, namun jika Anda ingin melihat di bawah kap dan melihat apa yang terjadi, Anda dapat mengkloning direktori sumber:
git clone https://github.com/Salaah01/django-email-signals.git
1. Tambahkan ke INSTALLED_APPS i. Tambahkan Tambahkan tinymce ke INSTALLED_APPS Anda di file settings.py Anda.
INSTALLED_APPS = [
' app_1 `,
' app_2 `,
'...' ,
'tinymce' ,
] ii. Tambahkan email_signals ke INSTALLED_APPS Anda di file settings.py Anda. Ini harus ditambahkan setelah aplikasi apa pun yang berisi model yang ingin Anda buat sinyal menggunakan aplikasi ini.
INSTALLED_APPS = [
' app_1 `,
' app_2 `,
'...' ,
'tinymce' ,
' email_signals `
]2. Jalankan migrasi dan kumpulkan statis
python manage.py migrate
python manage.py collectstatic
3. Perbarui URL (Opsional) Perbarui file root urls.py Anda untuk memasukkan yang berikut:
from django . urls import include
url_patterns = [
path ( 'email-signals/' , include ( 'email_signals.urls' )),
path ( 'tinymce/' , include ( 'tinymce.urls' )),
]Kami merekomendasikan mengubah URL menjadi sesuatu yang sedikit lebih sulit untuk ditebak, hanya untuk membuat hidup lebih sulit bagi pengintai sial itu. Semua jalur aplikasi mengharuskan pengguna untuk menjadi anggota staf untuk dapat mengakses tautan.
Meskipun langkah ini opsional, kami sarankan melakukannya karena akan membuat batasan pengaturan di area admin jauh lebih mudah. URL diperlukan untuk memberikan dropdown dengan opsi saat membangun kendala Anda.
4. Tambahkan email default (opsional) Tambahkan EMAIL_SIGNAL_DEFAULT_SENDER ke pengaturan Anda. Misalnya: EMAIL_SIGNAL_DEFAULT_SENDER = '[email protected] Jika Anda tidak ingin secara eksplisit menentukan email pengirim untuk setiap sinyal yang Anda tentukan, Anda dapat mengatur EMAIL_SIGNAL_DEFAULT_SENDER di settings.py proyek Anda.
5. Tambahkan Model Mixin pada model yang ingin Anda tingkatkan sinyal, Anda perlu menambahkan mixin berikut sebagai ketergantungan pada model: email_signals.models.EmailSignalMixin .
Contoh: Misalkan Anda memiliki model berikut.
from django . db import models
class Customer ( models . Model ):
name = models . CharField ( max_length = 200 , null = True )
email = models . CharField ( max_length = 200 )Anda perlu mengubah model ini menjadi berikut:
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. Tambahkan penerima tergantung pada perubahan data, Anda mungkin ingin mengirim email ke orang yang berbeda. Kami memfasilitasi ini dengan menyiapkan berbagai kemungkinan milis ke dalam model itu sendiri. Yang ini lebih mudah ditampilkan terlebih dahulu kemudian menjelaskan:
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]' ] Kami telah membuat dua fungsi yang disebut customer_emails dan management_mailing_list yang masing -masing mengembalikan kumpulan alamat email. Kemudian, ketika kami mengatur sinyal, kami akan diminta untuk mengatur milis untuk digunakan untuk setiap sinyal. Di sinilah kami akan memasukkan nama fungsi kami `` customer_emails or manajemen_mailing_list`.
Oleh karena itu, ini memungkinkan kami untuk mengatur milis yang berbeda dalam model kami.
Sekarang setelah pengaturan selesai, sinyal dapat ditambahkan melalui admin (atau dengan memperbarui database secara langsung).
Kami akan membayangkan saya menjalankan situs di LocalHost sehingga panel admin dapat ditemukan dengan menavigasi ke http: // localhost: 8000/admin/. Sinyal kemudian dapat diakses dengan menavigasi ke http: // localhost: 8000/admin/email_signals/sinyal/. Kami akan mulai dengan menambahkan beberapa sinyal. Klik "Tambahkan Sinyal" untuk memulai.
Seorang pria bijak mengajari saya lebih baik terdengar konyol sejenak daripada tidak tahu sesuatu dan merasa bodoh selamanya . Jadi, dalam nada itu, meskipun mungkin tampak jelas, kita akan melalui opsi dalam formulir dan mendiskusikan apa yang bertanggung jawab atas setiap opsi.
| Label bidang | Nama Lapangan | Keterangan |
|---|---|---|
| Nama | nama | Nama untuk sinyal Anda, hanya untuk membuatnya lebih mudah dibedakan dari catatan lain. |
| Keterangan | keterangan | (Opsional) Deskripsi untuk sinyal Anda. |
| Model (tabel) | content_type | Pilih dari drop down model yang berhubungan dengan sinyal ini. |
| Konten teks biasa | Plain_message | (Opsional) Email teks biasa untuk dikirim. |
| Konten html | html_message | (Opsional) Email html untuk dikirim. |
| Subjek | subjek | Subjek email |
| Dari email | from_email | (Opsional) Pengirim email. Default ke settings.EMAIL_SIGNAL_DEFAULT_SENDER . |
| Milis | mailing_list | Daftar penerima tempat teks yang Anda masukkan, sesuai dengan metode yang dipanggil di kelas model dengan nama yang sama. EG: Jika Anda memasukkan customer_mails , maka perlu ada metode yang disebut customer_mails yang mengembalikan kumpulan email di kelas model. Atau, ini bisa berupa daftar email yang dipisahkan oleh koma. Misalnya: [email protected],[email protected] akan mengirim email ke kedua email ini. |
| Templat | templat | Jalur (opsional) ke templat, jika Anda ingin membuat email dari templat. Ini menggunakan loader template Django, sehingga nilai yang Anda berikan di sini harus relatif terhadap settings.TEMPLATES[i]['DIRS'] . |
| Tipe sinyal | sinyal_type | Jenis sinyal untuk menaikkan catatan ini. |
| Aktif | aktif | Sakelar untuk menghidupkan dan mematikan sinyal ini. |
Kendala Sinyal Model inline ini adalah tempat Anda dapat menetapkan beberapa kendala yang akan menentukan apakah sinyal harus dinaikkan berdasarkan kasus per kasus.
| Label bidang | Nama Lapangan | Keterangan |
|---|---|---|
| Parameter 1 | param_1 | Parameter pertama yang digunakan saat menguji kendala. Parameter ini harus ada di sinyal kwargs atau contoh model. |
| Perbandingan | perbandingan | Tentukan cara membandingkan parameter. EG: Parameter 1 lebih besar dari parameter 2. |
| Parameter 1 | param_1 | (Opsional) Parameter kedua untuk digunakan saat menguji batasan. Parameter ini dapat dibiarkan kosong ketika kendala adalah sesuatu yang masuk akal. Misalnya, jika kendala adalah "benar" maka tidak perlu untuk parameter 2. Tetapi jika kendala adalah, "lebih besar dari", maka parameter 2 diperlukan. Parameter 2 juga bisa menjadi tipe primitif seperti 'A', '1', '1.1'. Aplikasi akan mencoba untuk mengubah string menjadi angka jika bisa. |
Parameter adalah dalam kedua parameter 1 dan 2 memungkinkan Anda untuk mencari jauh di dalam objek. Misalkan kita memiliki struktur dan sinyal berikut telah menerima contoh CustomerOrder .
ClassDiagram
Pengguna <| -- Pelanggan
Pelanggan <| - Pesan Pelanggan
Pengguna kelas {
pengenal
first_name
last_name
e-mail
}
Pelanggan kelas {
pengenal
pengguna
fav_ ganguage
}
CLASSER CUSTOMERORDER {
pengenal
pelanggan
order_id
total
}
Diberikan contoh CustomerOrder (kami akan menyebut order variabel ini), kami dapat mengatur yang berikut dalam kendala kami:
| # | Parameter 1 | Perbandingan | Parameter 2 |
|---|---|---|---|
| 1 | 'customer.user.id' | Lebih besar dari | '5' |
| 2 | 'customer.user.first_name' | Sama dengan | 'customer.user.last_name' |
Kendala 1 akan memeriksa yang berikut:
order . customer . user . id > 5Demikian pula, kendala 2 akan memeriksa yang berikut:
order . customer . user . first_name == order . customer . user . last_nameHanya ketika semua kendala dipenuhi email akan dikirim.
Repositori dilengkapi dengan contoh proyek untuk memulai. Jika Anda lebih suka menguji aplikasi ini sendiri maka saya sarankan mengkloning repositori.
Menavigasi untuk example dan menjalankan proyek Django di dalam.
Jika Anda memiliki saran atau perbaikan, jangan ragu untuk membuka masalah atau menarik permintaan.
Jika Anda ingin menyumbangkan kode, silakan ikuti langkah -langkah berikut:
npm install untuk menginstal dependensi untuk proyek contohnpm start untuk memulai server WebPack Dev. Ini akan menonton perubahan dan mengkompilasi ulang file. Jika tidak, jalankan npm run build untuk mengkompilasi file sekali.Saat berkontribusi, harap pastikan bahwa Anda telah menambahkan tes untuk perubahan Anda dan semua tes Anda lulus (lihat pengujian). Harap juga memastikan bahwa kode Anda diformat dengan benar dan kode Anda melewati serat.
Kami menggunakan black dan flake8 untuk memformat dan memasukkan kode kami. Jika Anda telah make instal, Anda dapat menjalankan yang berikut untuk memformat dan memasukkan kode Anda:
make format
make lintAtau, Anda dapat menjalankan perintah berikut:
black email_signals
flake8 --exclude=migrations email_signals Repositori ini menggunakan tox untuk menjalankan tes terhadap beberapa versi Python dan Django. Jika Anda telah make , Anda dapat menjalankan tes dengan menjalankan make tox . Jika tidak, Anda dapat menjalankan tes dengan menjalankan tox -s di akar repositori.
Jika Anda ingin menjalankan tes hanya untuk versi python Anda saat ini, Anda dapat menjalankan tox -e py atau python3 runtests.py .