danidee10/django-notifs

View on GitHub
notifications/channels/base.py

Summary

Maintainability
A
0 mins
Test Coverage
A
91%
import abc
from typing import List

from django.utils.module_loading import import_string

from notifications import default_settings as settings
from notifications.providers import BaseNotificationProvider
from notifications.utils import classproperty


class BaseNotificationChannel(metaclass=abc.ABCMeta):
    def __init__(self, notification, context=dict()):
        self.notification = notification
        self.context = context

    @abc.abstractproperty
    def name(self) -> str:
        raise NotImplementedError

    @abc.abstractproperty
    def providers(self) -> List:
        raise NotImplementedError

    @abc.abstractmethod
    def build_payload(self, provider):
        """Constructs a paylod from the notification object."""
        raise NotImplementedError

    @classproperty
    def registered_channels(cls):
        return {
            klass.name: f'{klass.__module__}.{klass.__name__}'
            for klass in cls.__subclasses__()
        }

    @property
    def provider_paths(self):
        provider_paths = dict()
        for name in self.providers:
            provider_paths[name] = BaseNotificationProvider.get_provider_class(name)

        return provider_paths

    def get_context(self, provider):
        return self.context

    def get_delivery_backend(self):
        return import_string(settings.NOTIFICATIONS_DELIVERY_BACKEND)

    def notify(self, countdown=0):
        delivery_backend = self.get_delivery_backend()
        delivery_backend(self).run(countdown)