django app to send notifications using signals
Project description
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/demo
python manage.py migrate
python manage.py createsuperuser
python manage.py runserver
- goto http://127.0.0.1:8000/admin
- navigate to /admin/signal_notification/notificationsetting/ and add your NotificationSettings records
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file django-signal-notification-0.0.1.tar.gz
.
File metadata
- Download URL: django-signal-notification-0.0.1.tar.gz
- Upload date:
- Size: 13.4 kB
- Tags: Source
- Uploaded using 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
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | ffaf9824b6d0f85860367e2baf0ea88243e5ec91bd39ed7fc0bae547292e385b |
|
MD5 | 99369795736a431d187b05387c79591e |
|
BLAKE2b-256 | 41a4d92f21d3bc787328263f572c2683f1c1544fa6c90aee7ca64b0a2e23237a |
File details
Details for the file django_signal_notification-0.0.1-py3-none-any.whl
.
File metadata
- Download URL: django_signal_notification-0.0.1-py3-none-any.whl
- Upload date:
- Size: 15.8 kB
- Tags: Python 3
- Uploaded using 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
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 20c10afef40abcba477a8f237e1ce28b3f8f7e303ed39572c7dfbbcc0a2d1567 |
|
MD5 | e55be91627d8370a8ceae84180c01dc5 |
|
BLAKE2b-256 | e990e49b5051fec18f1afea0e92ec2be99aa1e8982b4af1e60050898a7ad08de |