""" Signal handlers for automation_orchestration app """ from django.db.models.signals import post_save, pre_save from django.dispatch import receiver from django.utils import timezone from .models import ( RunbookExecution, AutoRemediationExecution, MaintenanceWindow, ) @receiver(post_save, sender=RunbookExecution) def update_runbook_statistics(sender, instance, created, **kwargs): """Update runbook statistics when execution is completed""" if instance.status in ['COMPLETED', 'FAILED', 'CANCELLED', 'TIMEOUT']: runbook = instance.runbook runbook.execution_count += 1 if instance.status == 'COMPLETED': # Update success rate total_executions = runbook.execution_count successful_executions = RunbookExecution.objects.filter( runbook=runbook, status='COMPLETED' ).count() runbook.success_rate = successful_executions / total_executions if total_executions > 0 else 0.0 runbook.last_executed_at = instance.started_at runbook.save(update_fields=['execution_count', 'success_rate', 'last_executed_at']) @receiver(post_save, sender=AutoRemediationExecution) def update_auto_remediation_statistics(sender, instance, created, **kwargs): """Update auto-remediation statistics when execution is completed""" if instance.status in ['COMPLETED', 'FAILED', 'CANCELLED', 'TIMEOUT']: remediation = instance.auto_remediation remediation.execution_count += 1 if instance.status == 'COMPLETED': remediation.success_count += 1 remediation.last_executed_at = instance.triggered_at remediation.save(update_fields=['execution_count', 'success_count', 'last_executed_at']) @receiver(pre_save, sender=MaintenanceWindow) def validate_maintenance_window(sender, instance, **kwargs): """Validate maintenance window before saving""" if instance.start_time and instance.end_time: if instance.start_time >= instance.end_time: raise ValueError("Start time must be before end time") # Auto-update status based on current time now = timezone.now() if instance.start_time and instance.end_time: if instance.start_time <= now <= instance.end_time: if instance.status == 'SCHEDULED': instance.status = 'ACTIVE' elif instance.end_time < now: if instance.status in ['SCHEDULED', 'ACTIVE']: instance.status = 'COMPLETED'