58 lines
1.7 KiB
Python
58 lines
1.7 KiB
Python
#!/usr/bin/env python3
|
|
"""Force cancel stuck automation runs and clear cache locks"""
|
|
import os
|
|
import sys
|
|
import django
|
|
|
|
# Setup Django
|
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'igny8_core.settings')
|
|
django.setup()
|
|
|
|
from igny8_core.business.automation.models import AutomationRun
|
|
from django.core.cache import cache
|
|
from django.utils import timezone
|
|
|
|
print("=" * 80)
|
|
print("AUTOMATION RUN FORCE CANCEL & CLEANUP")
|
|
print("=" * 80)
|
|
|
|
# Check and cancel active runs
|
|
runs = AutomationRun.objects.filter(status__in=['running', 'paused']).order_by('-started_at')
|
|
print(f"\nFound {runs.count()} active run(s)")
|
|
|
|
if runs.count() == 0:
|
|
print(" No runs to cancel\n")
|
|
else:
|
|
for r in runs:
|
|
duration = (timezone.now() - r.started_at).total_seconds() / 60
|
|
print(f"\nRun ID: {r.run_id}")
|
|
print(f" Site: {r.site_id}")
|
|
print(f" Status: {r.status}")
|
|
print(f" Stage: {r.current_stage}")
|
|
print(f" Started: {r.started_at} ({duration:.1f}m ago)")
|
|
print(f" Credits: {r.total_credits_used}")
|
|
|
|
# Force cancel
|
|
print(f" >>> FORCE CANCELLING...")
|
|
r.status = 'cancelled'
|
|
r.save()
|
|
print(f" >>> Status: {r.status}")
|
|
|
|
# Clear cache lock
|
|
lock_key = f'automation_lock_{r.site_id}'
|
|
cache.delete(lock_key)
|
|
print(f" >>> Lock cleared: {lock_key}")
|
|
|
|
print("\n" + "=" * 40)
|
|
print("Cache lock status:")
|
|
for site_id in [5, 16]:
|
|
lock_key = f'automation_lock_{site_id}'
|
|
lock_val = cache.get(lock_key)
|
|
status = lock_val or 'UNLOCKED ✓'
|
|
print(f" Site {site_id}: {status}")
|
|
|
|
print("\n" + "=" * 80)
|
|
print("✓ CLEANUP COMPLETE - You can now start a new automation run")
|
|
print("=" * 80)
|