""" Admin registration for Automation models """ from django.contrib import admin from django.contrib import messages from unfold.admin import ModelAdmin from igny8_core.admin.base import AccountAdminMixin, Igny8ModelAdmin from .models import AutomationConfig, AutomationRun from import_export.admin import ExportMixin from import_export import resources class AutomationConfigResource(resources.ModelResource): """Resource class for exporting Automation Configs""" class Meta: model = AutomationConfig fields = ('id', 'site__domain', 'is_enabled', 'frequency', 'scheduled_time', 'within_stage_delay', 'between_stage_delay', 'last_run_at', 'created_at') export_order = fields @admin.register(AutomationConfig) class AutomationConfigAdmin(ExportMixin, AccountAdminMixin, Igny8ModelAdmin): resource_class = AutomationConfigResource list_display = ('site', 'is_enabled', 'frequency', 'scheduled_time', 'within_stage_delay', 'between_stage_delay', 'last_run_at') list_filter = ('is_enabled', 'frequency') search_fields = ('site__domain',) actions = [ 'bulk_enable', 'bulk_disable', 'bulk_update_frequency', 'bulk_update_delays', ] def bulk_enable(self, request, queryset): """Enable selected automation configs""" updated = queryset.update(is_enabled=True) self.message_user(request, f'{updated} automation config(s) enabled.', messages.SUCCESS) bulk_enable.short_description = 'Enable selected automations' def bulk_disable(self, request, queryset): """Disable selected automation configs""" updated = queryset.update(is_enabled=False) self.message_user(request, f'{updated} automation config(s) disabled.', messages.SUCCESS) bulk_disable.short_description = 'Disable selected automations' def bulk_update_frequency(self, request, queryset): """Update frequency for selected automation configs""" from django import forms if 'apply' in request.POST: frequency = request.POST.get('frequency') if frequency: updated = queryset.update(frequency=frequency) self.message_user(request, f'{updated} automation config(s) updated to frequency: {frequency}', messages.SUCCESS) return FREQUENCY_CHOICES = [ ('hourly', 'Hourly'), ('daily', 'Daily'), ('weekly', 'Weekly'), ] class FrequencyForm(forms.Form): frequency = forms.ChoiceField( choices=FREQUENCY_CHOICES, label="Select Frequency", help_text=f"Update frequency for {queryset.count()} automation config(s)" ) from django.shortcuts import render return render(request, 'admin/bulk_action_form.html', { 'title': 'Update Automation Frequency', 'queryset': queryset, 'form': FrequencyForm(), 'action': 'bulk_update_frequency', }) bulk_update_frequency.short_description = 'Update frequency' def bulk_update_delays(self, request, queryset): """Update delay settings for selected automation configs""" from django import forms if 'apply' in request.POST: within_delay = int(request.POST.get('within_stage_delay', 0)) between_delay = int(request.POST.get('between_stage_delay', 0)) updated = queryset.update( within_stage_delay=within_delay, between_stage_delay=between_delay ) self.message_user(request, f'{updated} automation config(s) delay settings updated.', messages.SUCCESS) return class DelayForm(forms.Form): within_stage_delay = forms.IntegerField( min_value=0, initial=10, label="Within Stage Delay (minutes)", help_text="Delay between operations within the same stage" ) between_stage_delay = forms.IntegerField( min_value=0, initial=60, label="Between Stage Delay (minutes)", help_text="Delay between different stages" ) from django.shortcuts import render return render(request, 'admin/bulk_action_form.html', { 'title': 'Update Automation Delays', 'queryset': queryset, 'form': DelayForm(), 'action': 'bulk_update_delays', }) bulk_update_delays.short_description = 'Update delay settings' class AutomationRunResource(resources.ModelResource): """Resource class for exporting Automation Runs""" class Meta: model = AutomationRun fields = ('id', 'run_id', 'site__domain', 'status', 'current_stage', 'started_at', 'completed_at', 'created_at') export_order = fields @admin.register(AutomationRun) class AutomationRunAdmin(ExportMixin, AccountAdminMixin, Igny8ModelAdmin): resource_class = AutomationRunResource list_display = ('run_id', 'site', 'status', 'current_stage', 'started_at', 'completed_at') list_filter = ('status', 'current_stage') search_fields = ('run_id', 'site__domain') actions = [ 'bulk_retry_failed', 'bulk_cancel_running', 'bulk_delete_old_runs', ] def bulk_retry_failed(self, request, queryset): """Retry failed automation runs""" failed_runs = queryset.filter(status='failed') count = failed_runs.update(status='pending', current_stage='keyword_research') self.message_user(request, f'{count} failed run(s) marked for retry.', messages.SUCCESS) bulk_retry_failed.short_description = 'Retry failed runs' def bulk_cancel_running(self, request, queryset): """Cancel running automation runs""" running = queryset.filter(status__in=['pending', 'running']) count = running.update(status='failed') self.message_user(request, f'{count} running automation(s) cancelled.', messages.SUCCESS) bulk_cancel_running.short_description = 'Cancel running automations' def bulk_delete_old_runs(self, request, queryset): """Delete automation runs older than 30 days""" from django.utils import timezone from datetime import timedelta cutoff_date = timezone.now() - timedelta(days=30) old_runs = queryset.filter(created_at__lt=cutoff_date) count = old_runs.count() old_runs.delete() self.message_user(request, f'{count} old automation run(s) deleted (older than 30 days).', messages.SUCCESS) bulk_delete_old_runs.short_description = 'Delete old runs (>30 days)'