Вопрос по дизайну: Существует ли специфический для 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)