Django Signal Notification
a django app to send any notifications(sms, email, rocketchat and any media) after triggered a signal. you can add new "media" and new "handler". also you can customize your template messages directly in python handler class or in a django template file.
Setup
Requirements
- Python >= 3.4
- Django >= 2.0
Installation
- Install django-signal-notifier by pip:
$ pip install django-signal-notification - Add "signal_notification" at the end of INSTALLED_APPS setting like this
INSTALLED_APPS = [ 'django.contrib.auth', 'django.contrib.contenttypes', ... 'signal_notification', ] python manage.py migrate- goto admin panel to add new NotificationSetting records.
Settings
# Disable signal notification completely if set as True
SIGNAL_NOTIFICATION_DISABLED = False
# Add your custom media classes path here.
SIGNAL_NOTIFICATION_MEDIA_CLASSES = [
'signal_notification.notify_media.EmailMedia',
'signal_notification.notify_media.SMSMedia',
]
# set your custom NotifyManager class path here
SIGNAL_NOTIFICATION_MANAGER_CLASS = 'signal_notification.notify_manager.NotifyManager'
# Add your handlers class path here.
SIGNAL_NOTIFICATION_HANDLER_CLASSES = [
'signal_notification.notify_handlers.UserLoggedInHandler',
'signal_notification.notify_handlers.UserLoginFailedHandler',
'signal_notification.notify_handlers.NewUserHandler',
]
Add new Media class
- You should add a new class inherited from "signal_notification.notify_media.NotifyMedia".
- set unique "name" field of that class
- override and implement the "send" method
- set PARAMS_SCHEMA_VALIDATOR field for that class
from signal_notification.notify_media import NotifyMedia
class NewMedia(NotifyMedia):
name = 'new_media'
PARAMS_SCHEMA_VALIDATOR = {
'to': {'type': 'string', 'nullable': False, 'required': True, 'empty': False}
}
def send(self, message, subject=None):
to = self.kwargs['to']
# ...
- append path of this class to "SIGNAL_NOTIFICATION_MEDIA_CLASSES" setting
SIGNAL_NOTIFICATION_MEDIA_CLASSES = [
...
'foo.bar.NewMedia'
]
Add new Handler class
- You should add a new class inherited from "signal_notification.notify_handlers.NotifyHandler".
- set unique "name" field of that class
- set subject and message templates(directly in class or as a django templates file)
from django.contrib.auth import user_logged_out
from signal_notification.notify_handlers import NotifyHandler
class StaffUserLoggedOut(NotifyHandler):
'''Send a notification when an Staff user logged out'''
name = 'staff_user_logged_out'
signal = user_logged_out
subject_template = 'User Exited'
message_template = 'Staff User "{{user}}" Logged out.'
def is_triggered(self, notification_args):
'''Using this method to ignore notification by checking some conditions'''
user = notification_args.get('user')
if not user.is_staff:
return False
return super().is_triggered(notification_args)
- append path of this class to "SIGNAL_NOTIFICATION_HANDLER_CLASSES" setting
SIGNAL_NOTIFICATION_HANDLER_CLASSES = [
...
'foo.bar.StaffUserLoggedOut'
]
How to customize the message template of handler?
You have 2 options:
- define subject and message directly in Handler class by setting this fields of class:
- subject_template
- message_template
- define subject and message in templates path as a django template file.
- add a subject file in this templates path:
- signal_notification/<handler_name>/subject-<media_name>.html # this is for specific media
- signal_notification/<handler_name>/subject.html # this is for all media
- add a message file in this templates path:
- signal_notification/<handler_name>/message-<media_name>.html # this is for specific media
- signal_notification/<handler_name>/message.html # this is for all media
- add a subject file in this templates path:
Notice: the priorities for templates are:
- media template: signal_notification/<handler_name>/message-<media_name>.html
- general template: signal_notification/<handler_name>/message.html
- class template fields: message_template
Signals
- You can use predefined django signals(like, post_save, pre_save, ..)
- You can add your signals and use that in Handler
# in foo/bar/signals.py
from django.dispatch import Signal
test_signal = Signal()
add Custom NotifyManager
some times you want to have your custom manger. for example you want notifications be handled in a background task using celery, apscheduler, huey.
- You need to add a new class inherited from signal_notification.notify_manager.NotifyManager
- override the "handle_notification" class method.(use "_handle_notification" in your method as a final endpoint of handler method)
import traceback
from signal_notification.notify_manager import NotifyManager
class APSchedulerNotifyManager(NotifyManager):
@classmethod
def handle_notification(cls, handler_cls, notification_args):
apscheduler_client = '<apscheduler_client object>'
try:
apscheduler_client.root.add_job(
'foo.bar:APSchedulerNotifyManager._handle_notification', 'date',
args=(handler_cls, notification_args)
)
except Exception:
traceback.print_exc()
- set path of this class for SIGNAL_NOTIFICATION_MANAGER_CLASS setting
SIGNAL_NOTIFICATION_MANAGER_CLASS = 'foo.bar.APSchedulerNotifyManager'
Demo
cd django_signal_notification/demopython manage.py migratepython manage.py createsuperuserpython manage.py runserver- goto http://127.0.0.1:8000/admin
- navigate to /admin/signal_notification/notificationsetting/ and add your NotificationSettings records
Metadata
Release files for django-signal-notification 0.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| django-signal-notification-0.0.1.tar.gz | 13.4 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| django_signal_notification-0.0.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 29.2 kB
Release files / django-signal-notification-0.0.1.tar.gz
| Download URL | django-signal-notification-0.0.1.tar.gz |
|---|---|
| Size | 13.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ffaf9824b6d0f85860367e2baf0ea88243e5ec91bd39ed7fc0bae547292e385b
|
|
BLAKE2b-256 checksum How to use checksums |
41a4d92f21d3bc787328263f572c2683f1c1544fa6c90aee7ca64b0a2e23237a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.0 CPython/3.8.5
|
Release files / django_signal_notification-0.0.1-py3-none-any.whl
| Download URL | django_signal_notification-0.0.1-py3-none-any.whl |
|---|---|
| Size | 15.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
20c10afef40abcba477a8f237e1ce28b3f8f7e303ed39572c7dfbbcc0a2d1567
|
|
BLAKE2b-256 checksum How to use checksums |
e990e49b5051fec18f1afea0e92ec2be99aa1e8982b4af1e60050898a7ad08de
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.0 CPython/3.8.5
|
Security for django-signal-notification 0.0.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.