""" Сигналы для домашних заданий. """ from django.db.models.signals import post_save, pre_save, post_delete from django.dispatch import receiver from django.utils import timezone from .models import Homework, HomeworkSubmission import logging logger = logging.getLogger(__name__) @receiver(post_save, sender=Homework) def homework_post_save(sender, instance, created, **kwargs): """ Обработчик после сохранения домашнего задания. """ if created: # При создании нового задания обновляем статистику instance.update_statistics() logger.info(f"Создано новое домашнее задание: {instance.id} - {instance.title}") @receiver(post_save, sender=HomeworkSubmission) def homework_submission_post_save(sender, instance, created, **kwargs): """ Обработчик после сохранения решения домашнего задания. """ if created: # При создании нового решения проверяем опоздание instance.check_if_late() # Обновляем статистику задания instance.homework.update_statistics() logger.info(f"Создано новое решение ДЗ: {instance.id} для задания {instance.homework.id}") # При изменении статуса или черновика от ИИ — обновляем статистику задания (в т.ч. ai_draft_submissions) if not created: update_fields = kwargs.get('update_fields') if update_fields is not None: if 'status' in update_fields or 'ai_checked_at' in update_fields: instance.homework.update_statistics() @receiver(pre_save, sender=HomeworkSubmission) def homework_submission_pre_save(sender, instance, **kwargs): """ Обработчик перед сохранением решения домашнего задания. Автоматически переводит в статус 'checking' если включена автоматическая проверка. """ # Если решение создается впервые и у задания включена автоматическая проверка if not instance.pk and instance.homework.auto_check_enabled: instance.status = 'checking' @receiver(post_delete, sender=HomeworkSubmission) def homework_submission_post_delete(sender, instance, **kwargs): """ После удаления решения — обновить статистику задания, чтобы колонки канбана (Ожидают / На проверке и т.д.) отображались верно. """ try: homework = Homework.objects.get(id=instance.homework_id) homework.update_statistics() except Homework.DoesNotExist: pass