uchill/backend/apps/homework/signals.py

70 lines
3.0 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
Сигналы для домашних заданий.
"""
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