Вопрос по дизайну: Существует ли специфический для Django способ выбора пользователей для получения уведомлений при отправке формы?

У меня есть приложение Django, и мне нужно отправлять уведомления по электронной почте определенным пользователям в определенные моменты моих процессов без добавления каких-либо внешних библиотек. Например, если любой пользователь отправляет определенную форму, мне нужно отправить уведомление определенному набору пользователей.

Я думаю использовать пользовательские разрешения модели для каждой модели, относящейся к определенной форме. Затем гипотетически добавить пользователей в уникальные группы аутентификации, которые имеют эти конкретные разрешения.

Тогда я бы создал класс Notifier с методом notify_users_by_email, который мог бы принимать группу авторизации и тип причины. Пусть каждый тип причины будет 1 к 1 с разрешениями, определенными на уровне модели. Затем мы можем просто отфильтровать группу для пользователей в группе и отправить письмо.

Я бы также добавил модель уведомлений, которую можно использовать для записи того, кто отправил уведомления, кто был предполагаемым получателем, времени отправки и причины уведомления (опять же связанной с разрешением).

В целом, является ли такой способ подходящим, или есть более чистый способ сделать это в Django?

class Notifier:

    @classmethod
    def notify_group_by_email(cls, group_id: int, reason: str):
        users_in_group = Group.objects.get(id=group_id).user_set.all()
        for user in users_in_group:
            cls.notify_user_by_email(user_id=user.id, reason=reason)
            user = User.objects.get(id=user.id)
            email_string = f"{user.username}@gmail.com"
            print(f"Notified user {email_string} re: {reason}")

    @classmethod
    def notify_user_by_email(cls, reason: str, user_id: int):
        assert isinstance(reason, str)
        assert isinstance(user_id, int)

Класс уведомлений:

class Notification(DateUserFieldsAbstract):
    id = models.BigAutoField(
        auto_created=True,
        primary_key=True,
        serialize=False,
        verbose_name='ID')
    sender_id = models.ForeignKey('User', on_delete=models.PROTECT)
    receiver_id = models.ForeignKey('User', on_delete=models.PROTECT)
    reason = models.CharField(max_length=100)
    type = models.CharField(max_length=100)

Вернуться на верх