Files
ETB/ETB-API/analytics_predictive_insights/admin.py
Iliyan Angelov 6b247e5b9f Updates
2025-09-19 11:58:53 +03:00

338 lines
11 KiB
Python

"""
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',)
})
)