"""
Executive Summary Admin - Django admin interface for executive summary models
"""
from django.contrib import admin
from django.utils.html import format_html
from django.urls import reverse
from django.utils import timezone
from .models import ExecutiveMetric, ExecutiveReport, PredictiveInsight, AIRecommendation
@admin.register(ExecutiveMetric)
class ExecutiveMetricAdmin(admin.ModelAdmin):
list_display = [
'metric_type', 'metric_value', 'variance_display',
'metric_date', 'hospital', 'created_at'
]
list_filter = ['metric_type', 'metric_date', 'hospital']
date_hierarchy = 'metric_date'
search_fields = ['metric_type', 'hospital__name']
ordering = ['-metric_date']
def variance_display(self, obj):
if obj.variance is None:
return "-"
arrow = "↑" if obj.variance_direction == "up" else "↓" if obj.variance_direction == "down" else "→"
color = "#10b981" if obj.variance_direction == "up" else "#ef4444" if obj.variance_direction == "down" else "#6b7280"
return format_html(
'{} {}%',
color, arrow, obj.variance
)
variance_display.short_description = "Variance"
@admin.register(ExecutiveReport)
class ExecutiveReportAdmin(admin.ModelAdmin):
list_display = [
'report_type', 'status', 'start_date', 'end_date',
'generation_time_display', 'created_at', 'pdf_link'
]
list_filter = ['report_type', 'status', 'created_at']
date_hierarchy = 'created_at'
readonly_fields = ['created_at', 'updated_at']
ordering = ['-created_at']
def generation_time_display(self, obj):
if obj.generation_time_ms:
return f"{obj.generation_time_ms / 1000:.2f}s"
return "-"
generation_time_display.short_description = "Gen Time"
def pdf_link(self, obj):
if obj.pdf_file:
return format_html('Download PDF', obj.pdf_file.url)
return "-"
pdf_link.short_description = "PDF"
@admin.register(PredictiveInsight)
class PredictiveInsightAdmin(admin.ModelAdmin):
list_display = [
'title_en', 'severity_badge', 'insight_type',
'status', 'hospital', 'created_at', 'acknowledged_by_display'
]
list_filter = ['severity', 'status', 'insight_type', 'hospital', 'created_at']
search_fields = ['title_en', 'description_en', 'hospital__name']
date_hierarchy = 'created_at'
ordering = ['-severity', '-created_at']
readonly_fields = ['created_at', 'updated_at', 'acknowledged_at']
def severity_badge(self, obj):
colors = {
'low': '#3b82f6',
'medium': '#f59e0b',
'high': '#f97316',
'critical': '#ef4444',
}
color = colors.get(obj.severity, '#6b7280')
return format_html(
'{}',
color, obj.get_severity_display()
)
severity_badge.short_description = "Severity"
def acknowledged_by_display(self, obj):
if obj.acknowledged_by:
return obj.acknowledged_by.get_full_name() or obj.acknowledged_by.email
return "-"
acknowledged_by_display.short_description = "Acknowledged By"
@admin.register(AIRecommendation)
class AIRecommendationAdmin(admin.ModelAdmin):
list_display = [
'title_en', 'category', 'priority_badge',
'status', 'hospital', 'created_at'
]
list_filter = ['category', 'priority', 'status', 'hospital', 'created_at']
search_fields = ['title_en', 'description_en', 'hospital__name']
date_hierarchy = 'created_at'
ordering = ['-priority', '-created_at']
readonly_fields = ['created_at', 'updated_at']
def priority_badge(self, obj):
colors = {
'low': '#3b82f6',
'medium': '#f59e0b',
'high': '#f97316',
'urgent': '#ef4444',
}
color = colors.get(obj.priority, '#6b7280')
return format_html(
'{}',
color, obj.get_priority_display()
)
priority_badge.short_description = "Priority"