Отправлять уведомления о выполнении заданий по электронной почте?(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}'

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