Custom backends and providers¶
Double backend example¶
A simple example of sending alerts by SMS and TTS.
from dbmail.backends.sms import Sender as SmsSender
from dbmail.backends.tts import Sender as TtsSender
class Sender(object):
def __init__(self, *args, **kwargs):
self.args = args
self.kwargs = kwargs
def send(self, is_celery=True):
SmsSender(*self.args, **self.kwargs).send(is_celery)
TtsSender(*self.args, **self.kwargs).send(is_celery)
return 'OK'
class SenderDebug(Sender):
def send(self, is_celery=True):
print(self.args)
print(self.kwargs)
print({'is_celery': is_celery})
def send_double_notification(*args, **kwargs):
from dbmail import db_sender
kwargs['backend'] = 'demo.custom_backends.double'
db_sender(*args, **kwargs)
Let’s try:
from demo.custom_backends.double import send_double_notification
send_double_notification('welcome', '+79031234567')
Slack backend example¶
You’re own backend, which send message to Slack channel.
from dbmail.backends.mail import Sender as SenderBase
from dbmail import import_module
class Sender(SenderBase):
"""
Specify new backend when you want to change standard backends behavior
More examples you can find at ./dbmail/backends directory
"""
# you're custom provider will be defined here.
# now we use standard provider
provider = 'dbmail.providers.slack.push'
# channels/recipients processing
def _get_recipient_list(self, recipient):
if isinstance(recipient, list):
return recipient
return map(lambda x: x.strip(), recipient.split(','))
# send message
def _send(self):
module = import_module(self.provider)
for recipient in self._recipient_list:
module.send(recipient, self._message)
class SenderDebug(Sender):
"""
Print message to stdout when DEBUG is True
"""
def _send(self):
self.debug('Message', self._message)
# helper function, which will be used on code
def send_db_slack(slug, *args, **kwargs):
from dbmail import db_sender
kwargs['backend'] = 'demo.custom_backends.slack'
db_sender(slug, *args, **kwargs)
Slack settings
SLACK_USERNAME = 'robot'
SLACK_HOOCK_URL = 'https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXX'
SLACK_CHANNEL = 'main'
Let’s try:
from demo.custom_backends.slack import send_db_slack
send_db_slack('welcome', {'username': 'GoTLiuM'})
Own provider¶
Create new file which will be implemented simple function below
def send(recipient, message, **kwargs):
# some named args from send_db function
custom_field = kwargs.pop('my_field', 'default value')
...
# Some part of code, which will be send message over some protocol
...
return True
Add necessary settings into settings.py
SOME_URL = '...'
Configure one of built-in backend to use your own provider
DB_MAILER_SMS_PROVIDER = 'apps.sms'
DB_MAILER_TTS_PROVIDER = 'apps.tts'
DB_MAILER_PUSH_PROVIDER = 'apps.push'
or write own function to use your provider
def send_over_own_provider(slug, *args, **kwargs):
from dbmail import db_sender
# can be one of built-in, or custom backend
# kwargs['backend'] = 'dbmail.backends.sms'
kwargs['provider'] = 'apps.sms'
db_sender(slug, *args, **kwargs)