62 lines
2.0 KiB
Python
62 lines
2.0 KiB
Python
"""
|
|
Django signals for incident intelligence
|
|
"""
|
|
from django.db.models.signals import post_save, pre_save
|
|
from django.dispatch import receiver
|
|
from django.utils import timezone
|
|
import logging
|
|
|
|
from .models import Incident
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
@receiver(post_save, sender=Incident)
|
|
def incident_post_save(sender, instance, created, **kwargs):
|
|
"""
|
|
Handle incident post-save events
|
|
"""
|
|
if created:
|
|
logger.info(f"New incident created: {instance.id}")
|
|
|
|
# Trigger AI processing for new incidents
|
|
try:
|
|
from .tasks import process_incident_ai
|
|
process_incident_ai.delay(instance.id)
|
|
except Exception as e:
|
|
logger.error(f"Failed to trigger AI processing for incident {instance.id}: {e}")
|
|
|
|
# Update resolution time if status changed to resolved
|
|
if not created and instance.status in ['RESOLVED', 'CLOSED'] and not instance.resolved_at:
|
|
instance.resolved_at = timezone.now()
|
|
instance.save(update_fields=['resolved_at'])
|
|
|
|
|
|
@receiver(pre_save, sender=Incident)
|
|
def incident_pre_save(sender, instance, **kwargs):
|
|
"""
|
|
Handle incident pre-save events
|
|
"""
|
|
# Auto-assign priority based on severity
|
|
if instance.severity and not instance.priority:
|
|
severity_priority_map = {
|
|
'EMERGENCY': 'P1',
|
|
'CRITICAL': 'P1',
|
|
'HIGH': 'P2',
|
|
'MEDIUM': 'P3',
|
|
'LOW': 'P4'
|
|
}
|
|
instance.priority = severity_priority_map.get(instance.severity, 'P3')
|
|
|
|
# Update AI processing flag if key fields changed
|
|
if instance.pk:
|
|
try:
|
|
old_instance = Incident.objects.get(pk=instance.pk)
|
|
ai_relevant_fields = ['title', 'description', 'free_text', 'category', 'subcategory', 'severity']
|
|
|
|
if any(getattr(old_instance, field) != getattr(instance, field) for field in ai_relevant_fields):
|
|
instance.ai_processed = False
|
|
instance.ai_processing_error = None
|
|
except Incident.DoesNotExist:
|
|
pass
|