Отправлять уведомления о выполнении заданий по электронной почте?(Django)
Я работаю над проектом канбан. Когда создается задача, я хочу отправить письмо с уведомлением сотрудникам, назначенным на эту задачу. Когда в мою модель приходит сигнал регистрации, я перехватываю его и получаю данные о назначенных сотрудниках из информации о созданной задаче, но эти данные возвращаются пустыми. Когда я проверяю через Django Admin, данные вроде бы существуют. Когда я проверяю с помощью Breakpoint, данные приходят, но в процессе, который я делаю с помощью захвата сигнала, их нет. Проведя небольшое исследование, я узнал, что это может быть вызвано такой проблемой, как данные о назначенцах приходят не сразу, но я не смог найти ничего о решении. Если у кого-то есть идеи, я жду, я поделился с вами участками своего кода.
models.py
from django.db import models
from account.models import User
from django.dispatch import receiver
from django.db.models.signals import post_save
from inupmt_be.utils import send_task_email
class Priority(models.TextChoices):
LOW = 'low', 'Düşük'
MEDIUM = 'medium', 'Orta'
HIGH = 'hight', 'Yüksek'
class Column(models.Model):
title = models.CharField(max_length=100)
priority = models.PositiveSmallIntegerField()
def __str__(self):
return self.title
class Labels(models.Model):
title = models.CharField(max_length=100)
def __str__(self):
return f'{self.title}'
class Task(models.Model):
reporter = models.ForeignKey(User, related_name='reported_tasks', on_delete=models.CASCADE)
assignees = models.ManyToManyField(User, related_name='assigned_tasks')
column = models.ForeignKey(Column, related_name='tasks', on_delete=models.CASCADE, null=True)
name = models.CharField(null=True, max_length=128)
labels = models.ManyToManyField(Labels, related_name='labels_task',blank=True)
comments = models.ManyToManyField(User, related_name='comments_task',blank=True)
start_date = models.DateField(null=True, blank=True)
end_date = models.DateField(null=True, blank=True)
create_time = models.DateTimeField(auto_now_add=True)
priority = models.TextField(choices=Priority.choices)
description = models.TextField(null=True, blank=True)
attachments = models.FileField(upload_to='attachments/', blank=True, null=True)
def __str__(self):
return f'{self.reporter} - {self.labels}'
@receiver(post_save, sender=Task)
def send_task_email_on_create_update(sender, instance, created, **kwargs):
if created:
assigned_users_emails = instance.assignees.values_list('email', flat=True)
send_task_email(
task=instance,
subject='New Task',
message='New Task',
recipient_list=list(assigned_users_emails)
)
else:
assigned_users_emails = instance.assignees.values_list('email', flat=True)
send_task_email(
task=instance,
subject='Update Task',
message='Update Task',
recipient_list=list(assigned_users_emails)
)
class Comment(models.Model):
task = models.ForeignKey(Task, related_name='task_comments', on_delete=models.CASCADE, null=True)
author = models.ForeignKey(User, related_name='comments', on_delete=models.CASCADE, null=True)
content = models.TextField()
create_time = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f'{self.author} - {self.task}'
Поскольку метод сигнала не сработал, я хотел попробовать, смогу ли я получить данные с помощью функции сохранения в модели задачи, но я так и не смог достичь результата, она возвращала пустоту.
models.py с функцией self
from django.db import models
from account.models import User
class Priority(models.TextChoices):
LOW = 'low', 'Düşük'
MEDIUM = 'medium', 'Orta'
HIGH = 'hight', 'Yüksek'
class Column(models.Model):
title = models.CharField(max_length=100)
priority = models.PositiveSmallIntegerField()
def __str__(self):
return self.title
class Labels(models.Model):
title = models.CharField(max_length=100)
def __str__(self):
return f'{self.title}'
class Task(models.Model):
reporter = models.ForeignKey(User, related_name='reported_tasks', on_delete=models.CASCADE)
assignees = models.ManyToManyField(User, related_name='assigned_tasks')
column = models.ForeignKey(Column, related_name='tasks', on_delete=models.CASCADE, null=True)
name = models.CharField(null=True, max_length=128)
labels = models.ManyToManyField(Labels, related_name='labels_task',blank=True)
comments = models.ManyToManyField(User, related_name='comments_task',blank=True)
start_date = models.DateField(null=True, blank=True)
end_date = models.DateField(null=True, blank=True)
create_time = models.DateTimeField(auto_now_add=True)
priority = models.TextField(choices=Priority.choices)
description = models.TextField(null=True, blank=True)
attachments = models.FileField(upload_to='attachments/', blank=True, null=True)
def save(self, *args, **kwargs):
if not self.pk:
super().save(*args, **kwargs)
assignees_emails = [assignee.email for assignee in self.assignees.all()]
print("Assignees e-mail addresses:", assignees_emails)
else:
super().save(*args, **kwargs)
def __str__(self):
return f'{self.reporter} - {self.name}'
class Comment(models.Model):
task = models.ForeignKey(Task, related_name='task_comments', on_delete=models.CASCADE, null=True)
author = models.ForeignKey(User, related_name='comments', on_delete=models.CASCADE, null=True)
content = models.TextField()
create_time = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f'{self.author} - {self.task}'