from django.contrib import admin from django.templatetags.static import static from django.utils.formats import localize from django.utils.html import format_html from django.utils.timesince import timeuntil from django.utils.timezone import localtime, is_aware from django.utils.translation import ugettext_lazy as _ from django_healthchecks.models import HeartbeatMonitor @admin.register(HeartbeatMonitor) class HeartbeatMonitorAdmin(admin.ModelAdmin): """Give an overview of heartbeats.""" list_display = ('name', 'enabled', 'timeout', 'last_beat_column') list_filter = ('enabled',) readonly_fields = ('last_beat_column', 'remaining_time') fieldsets = ( (None, { 'fields': ( 'name', 'timeout', 'enabled', ('last_beat_column', 'remaining_time'), ) }), ) def has_add_permission(self, request): # Only code calling HeartbeatMonitor.update() can add objects return False def last_beat_column(self, object): last_beat = object.last_beat if is_aware(last_beat): # Only for USE_TZ=True last_beat = localtime(last_beat) last_beat_str = localize(last_beat) if object.is_expired: # Make clearly visible alert_icon = static('admin/img/icon-alert.svg') return format_html( '<div style="vertical-align: middle; display: inline-block;">' ' <img src="{}" style="vertical-align: middle;"> ' ' <span style="color: #efb80b; vertical-align: middle;">{}</span>' '</div>', alert_icon, last_beat_str ) else: return last_beat_str last_beat_column.admin_order_field = 'last_beat' last_beat_column.short_description = _("Last beat") def remaining_time(self, object): return timeuntil(object.expires_at) remaining_time.short_description = _("Time remaining")