""" Admin configuration for analytics_predictive_insights app """ from django.contrib import admin from django.utils.html import format_html from django.urls import reverse from django.utils.safestring import mark_safe from .models import ( KPIMetric, KPIMeasurement, IncidentRecurrenceAnalysis, PredictiveModel, AnomalyDetection, CostImpactAnalysis, DashboardConfiguration, HeatmapData, PredictiveInsight ) @admin.register(KPIMetric) class KPIMetricAdmin(admin.ModelAdmin): """Admin interface for KPI metrics""" list_display = [ 'name', 'metric_type', 'aggregation_type', 'is_active', 'is_system_metric', 'created_by', 'created_at' ] list_filter = [ 'metric_type', 'aggregation_type', 'is_active', 'is_system_metric', 'created_at' ] search_fields = ['name', 'description'] readonly_fields = ['id', 'created_at', 'updated_at'] fieldsets = ( ('Basic Information', { 'fields': ('id', 'name', 'description', 'metric_type', 'aggregation_type') }), ('Targeting Criteria', { 'fields': ('incident_categories', 'incident_severities', 'incident_priorities') }), ('Configuration', { 'fields': ('calculation_formula', 'time_window_hours', 'is_active', 'is_system_metric') }), ('Metadata', { 'fields': ('created_by', 'created_at', 'updated_at'), 'classes': ('collapse',) }) ) @admin.register(KPIMeasurement) class KPIMeasurementAdmin(admin.ModelAdmin): """Admin interface for KPI measurements""" list_display = [ 'metric', 'value', 'unit', 'incident_count', 'measurement_period_start', 'calculated_at' ] list_filter = [ 'metric__metric_type', 'unit', 'calculated_at' ] search_fields = ['metric__name'] readonly_fields = ['id', 'calculated_at'] fieldsets = ( ('Measurement Details', { 'fields': ('id', 'metric', 'value', 'unit') }), ('Time Period', { 'fields': ('measurement_period_start', 'measurement_period_end') }), ('Context', { 'fields': ('incident_count', 'sample_size', 'metadata') }), ('Metadata', { 'fields': ('calculated_at',), 'classes': ('collapse',) }) ) @admin.register(IncidentRecurrenceAnalysis) class IncidentRecurrenceAnalysisAdmin(admin.ModelAdmin): """Admin interface for incident recurrence analysis""" list_display = [ 'primary_incident', 'recurrence_type', 'confidence_score', 'recurrence_rate', 'is_resolved', 'created_at' ] list_filter = [ 'recurrence_type', 'is_resolved', 'created_at' ] search_fields = ['primary_incident__title'] readonly_fields = ['id', 'created_at', 'updated_at'] fieldsets = ( ('Analysis Details', { 'fields': ('id', 'primary_incident', 'recurring_incidents', 'recurrence_type', 'confidence_score', 'recurrence_rate') }), ('Pattern Characteristics', { 'fields': ('common_keywords', 'common_categories', 'time_pattern') }), ('Impact Analysis', { 'fields': ('total_affected_users', 'total_downtime_hours', 'estimated_cost_impact') }), ('Recommendations', { 'fields': ('prevention_recommendations', 'automation_opportunities') }), ('Status', { 'fields': ('is_resolved', 'resolution_actions') }), ('Metadata', { 'fields': ('created_at', 'updated_at', 'model_version'), 'classes': ('collapse',) }) ) @admin.register(PredictiveModel) class PredictiveModelAdmin(admin.ModelAdmin): """Admin interface for predictive models""" list_display = [ 'name', 'model_type', 'algorithm_type', 'status', 'accuracy_score', 'last_trained_at', 'created_at' ] list_filter = [ 'model_type', 'algorithm_type', 'status', 'created_at' ] search_fields = ['name', 'description'] readonly_fields = ['id', 'created_at', 'updated_at'] fieldsets = ( ('Basic Information', { 'fields': ('id', 'name', 'description', 'model_type', 'algorithm_type') }), ('Model Configuration', { 'fields': ('model_config', 'feature_columns', 'target_column') }), ('Training Configuration', { 'fields': ('training_data_period_days', 'min_training_samples') }), ('Performance Metrics', { 'fields': ('accuracy_score', 'precision_score', 'recall_score', 'f1_score') }), ('Status and Metadata', { 'fields': ('status', 'version', 'model_file_path', 'last_trained_at', 'training_duration_seconds', 'training_samples_count') }), ('Retraining Configuration', { 'fields': ('auto_retrain_enabled', 'retrain_frequency_days', 'performance_threshold') }), ('Metadata', { 'fields': ('created_by', 'created_at', 'updated_at'), 'classes': ('collapse',) }) ) @admin.register(AnomalyDetection) class AnomalyDetectionAdmin(admin.ModelAdmin): """Admin interface for anomaly detection results""" list_display = [ 'anomaly_type', 'severity', 'status', 'confidence_score', 'detected_at', 'resolved_at' ] list_filter = [ 'anomaly_type', 'severity', 'status', 'detected_at' ] search_fields = ['description', 'model__name'] readonly_fields = ['id', 'detected_at'] fieldsets = ( ('Detection Details', { 'fields': ('id', 'model', 'anomaly_type', 'severity', 'status') }), ('Detection Metrics', { 'fields': ('confidence_score', 'anomaly_score', 'threshold_used') }), ('Time Context', { 'fields': ('detected_at', 'time_window_start', 'time_window_end') }), ('Related Data', { 'fields': ('related_incidents', 'affected_services', 'affected_metrics') }), ('Analysis', { 'fields': ('description', 'root_cause_analysis', 'impact_assessment') }), ('Actions', { 'fields': ('actions_taken', 'resolved_at', 'resolved_by') }), ('Metadata', { 'fields': ('metadata',), 'classes': ('collapse',) }) ) @admin.register(CostImpactAnalysis) class CostImpactAnalysisAdmin(admin.ModelAdmin): """Admin interface for cost impact analysis""" list_display = [ 'incident', 'cost_type', 'cost_amount', 'currency', 'is_validated', 'created_at' ] list_filter = [ 'cost_type', 'currency', 'is_validated', 'created_at' ] search_fields = ['incident__title', 'business_unit'] readonly_fields = ['id', 'created_at', 'updated_at'] fieldsets = ( ('Cost Details', { 'fields': ('id', 'incident', 'cost_type', 'cost_amount', 'currency') }), ('Calculation Details', { 'fields': ('calculation_method', 'calculation_details') }), ('Impact Metrics', { 'fields': ('downtime_hours', 'affected_users', 'revenue_impact') }), ('Business Context', { 'fields': ('business_unit', 'service_tier') }), ('Validation', { 'fields': ('is_validated', 'validated_by', 'validated_at', 'validation_notes') }), ('Metadata', { 'fields': ('created_at', 'updated_at'), 'classes': ('collapse',) }) ) @admin.register(DashboardConfiguration) class DashboardConfigurationAdmin(admin.ModelAdmin): """Admin interface for dashboard configurations""" list_display = [ 'name', 'dashboard_type', 'is_active', 'is_public', 'auto_refresh_enabled', 'created_by', 'created_at' ] list_filter = [ 'dashboard_type', 'is_active', 'is_public', 'auto_refresh_enabled', 'created_at' ] search_fields = ['name', 'description'] readonly_fields = ['id', 'created_at', 'updated_at'] fieldsets = ( ('Basic Information', { 'fields': ('id', 'name', 'description', 'dashboard_type') }), ('Configuration', { 'fields': ('layout_config', 'widget_configs') }), ('Access Control', { 'fields': ('is_public', 'allowed_users', 'allowed_roles') }), ('Refresh Configuration', { 'fields': ('auto_refresh_enabled', 'refresh_interval_seconds') }), ('Status', { 'fields': ('is_active',) }), ('Metadata', { 'fields': ('created_by', 'created_at', 'updated_at'), 'classes': ('collapse',) }) ) @admin.register(HeatmapData) class HeatmapDataAdmin(admin.ModelAdmin): """Admin interface for heatmap data""" list_display = [ 'name', 'heatmap_type', 'time_granularity', 'aggregation_method', 'created_at' ] list_filter = [ 'heatmap_type', 'time_granularity', 'aggregation_method', 'created_at' ] search_fields = ['name'] readonly_fields = ['id', 'created_at', 'updated_at'] fieldsets = ( ('Basic Information', { 'fields': ('id', 'name', 'heatmap_type') }), ('Time Configuration', { 'fields': ('time_period_start', 'time_period_end', 'time_granularity') }), ('Data Configuration', { 'fields': ('data_points', 'color_scheme', 'aggregation_method') }), ('Metadata', { 'fields': ('created_at', 'updated_at'), 'classes': ('collapse',) }) ) @admin.register(PredictiveInsight) class PredictiveInsightAdmin(admin.ModelAdmin): """Admin interface for predictive insights""" list_display = [ 'title', 'insight_type', 'confidence_level', 'confidence_score', 'is_acknowledged', 'is_validated', 'generated_at' ] list_filter = [ 'insight_type', 'confidence_level', 'is_acknowledged', 'is_validated', 'generated_at' ] search_fields = ['title', 'description', 'model__name'] readonly_fields = ['id', 'generated_at'] fieldsets = ( ('Insight Details', { 'fields': ('id', 'model', 'insight_type', 'title', 'description', 'confidence_level', 'confidence_score') }), ('Prediction Details', { 'fields': ('predicted_value', 'prediction_horizon', 'prediction_date') }), ('Context', { 'fields': ('input_features', 'supporting_evidence', 'related_incidents', 'affected_services') }), ('Recommendations', { 'fields': ('recommendations', 'risk_assessment') }), ('Status', { 'fields': ('is_acknowledged', 'acknowledged_by', 'acknowledged_at') }), ('Validation', { 'fields': ('is_validated', 'actual_value', 'validation_accuracy') }), ('Metadata', { 'fields': ('generated_at', 'expires_at'), 'classes': ('collapse',) }) )