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