Files
bitcoin_monitor/monitor/admin.py
2026-01-16 22:20:18 +03:00

131 lines
4.4 KiB
Python

from django.contrib import admin
from .models import BitcoinPrice, MarketAnalysis, SystemStatus, NotificationPreference, EmailNotification
@admin.register(BitcoinPrice)
class BitcoinPriceAdmin(admin.ModelAdmin):
list_display = ('timestamp', 'price_usd', 'volume', 'market_cap')
list_filter = ('timestamp',)
search_fields = ('price_usd',)
date_hierarchy = 'timestamp'
@admin.register(MarketAnalysis)
class MarketAnalysisAdmin(admin.ModelAdmin):
list_display = ('timestamp', 'period', 'status', 'current_price', 'average_price')
list_filter = ('period', 'status', 'is_event')
search_fields = ('status', 'event_type')
date_hierarchy = 'timestamp'
fieldsets = (
('Basic Info', {
'fields': ('timestamp', 'period', 'status')
}),
('Prices', {
'fields': ('current_price', 'average_price', 'min_price', 'max_price')
}),
('Analysis', {
'fields': ('threshold_percent', 'lower_threshold', 'upper_threshold')
}),
('Events', {
'fields': ('is_event', 'event_type')
}),
)
@admin.register(SystemStatus)
class SystemStatusAdmin(admin.ModelAdmin):
list_display = ('timestamp', 'is_healthy', 'is_stale', 'current_price')
list_filter = ('is_healthy', 'is_stale')
readonly_fields = ('timestamp',)
date_hierarchy = 'timestamp'
fieldsets = (
('Status', {
'fields': ('timestamp', 'is_healthy', 'is_stale')
}),
('Updates', {
'fields': ('last_hourly_update', 'last_successful_fetch')
}),
('Current State', {
'fields': ('current_price',)
}),
('Errors', {
'fields': ('last_error',),
'classes': ('collapse',)
}),
)
@admin.register(NotificationPreference)
class NotificationPreferenceAdmin(admin.ModelAdmin):
list_display = ('email_address', 'is_active', 'receive_event_alerts',
'receive_system_alerts', 'receive_daily_digest', 'created_at')
list_filter = ('is_active', 'receive_event_alerts', 'receive_system_alerts',
'receive_daily_digest')
search_fields = ('email_address',)
list_editable = ('is_active', 'receive_event_alerts', 'receive_system_alerts',
'receive_daily_digest')
fieldsets = (
('Email Settings', {
'fields': ('email_address', 'is_active')
}),
('Notification Types', {
'fields': ('receive_event_alerts', 'receive_system_alerts', 'receive_daily_digest'),
'classes': ('collapse',)
}),
('Timestamps', {
'fields': ('created_at', 'updated_at'),
'classes': ('collapse',)
}),
)
readonly_fields = ('created_at', 'updated_at')
@admin.register(EmailNotification)
class EmailNotificationAdmin(admin.ModelAdmin):
list_display = ('recipient', 'subject', 'notification_type', 'status',
'sent_at', 'created_at')
list_filter = ('notification_type', 'status', 'recipient')
search_fields = ('recipient', 'subject', 'error_message')
readonly_fields = ('created_at', 'sent_at', 'retry_count')
fieldsets = (
('Basic Info', {
'fields': ('recipient', 'subject', 'notification_type', 'status')
}),
('Content', {
'fields': ('content_text', 'content_html'),
'classes': ('collapse',)
}),
('Delivery Info', {
'fields': ('sent_at', 'retry_count', 'error_message')
}),
('Timestamps', {
'fields': ('created_at',),
'classes': ('collapse',)
}),
)
actions = ['resend_failed_emails']
def resend_failed_emails(self, request, queryset):
"""Resend failed emails."""
from monitor.services.email_service import EmailService
email_service = EmailService()
resend_count = 0
for email in queryset.filter(status='failed'):
try:
# Create a copy of the email and send
email_service._send_single_email(email, '', {})
resend_count += 1
except Exception as e:
self.message_user(request, f"Failed to resend to {email.recipient}: {e}", level='error')
self.message_user(request, f"Resent {resend_count} email(s)")
resend_failed_emails.short_description = "Resend selected failed emails"