from django.conf import settings from django.utils.module_loading import import_string class BaseMessagingBackend: backend_id = "SOMEID" label = "The Backend" short_label = "Backend" available_for_use = False templater = None template_fields = ("title", "message", "image_url") skip_default_template_fields = False def __init__(self, *args, **kwargs): self.notification_channel_id = kwargs.get("notification_channel_id") def get_templater_class(self): if self.templater: return import_string(self.templater) def validate_channel_filter_data(self, organization, data): """Validate JSON channel data for a channel filter update. Ensure the required/expected data is provided as needed by the backend. """ return data def generate_channel_verification_code(self, organization): """Return a verification code for a channel registration.""" raise NotImplementedError("generate_channel_verification_code method missing implementation") def generate_user_verification_code(self, user): """Return a verification code to link a user with an account.""" raise NotImplementedError("generate_user_verification_code method missing implementation") def unlink_user(self, user): """Remove backend link to user account.""" return @staticmethod def is_enabled_for_organization(organization): return True def is_configured_for_organization(self, organization): return True def serialize_user(self, user): """Return a serialized backend user representation.""" raise NotImplementedError("serialize_user method missing implementation") def notify_user(self, user, alert_group, notification_policy): """Send user a notification for the given alert group. The notification policy links to the backend as the notification channel. """ raise NotImplementedError("notify_user method missing implementation") @property def slug(self): return self.backend_id.lower() @property def customizable_templates(self): """ customizable_templates indicates if templates for messaging backend can be changes by user """ return True def load_backend(path, *args, **kwargs): return import_string(path)(*args, **kwargs) def get_messaging_backends(): global _messaging_backends if _messaging_backends is None: _messaging_backends = {} for backend_path, notification_channel_id in settings.EXTRA_MESSAGING_BACKENDS: backend = load_backend(backend_path, notification_channel_id=notification_channel_id) _messaging_backends[backend.backend_id] = backend return _messaging_backends.items() def get_messaging_backend_from_id(backend_id): return _messaging_backends.get(backend_id) _messaging_backends = None