Browse Source

amélioration ping

Élie Bouttier 7 years ago
parent
commit
325494baa0
1 changed files with 29 additions and 16 deletions
  1. 29 16
      services/admin.py

+ 29 - 16
services/admin.py

@@ -55,21 +55,21 @@ class ResourcePingFilter(admin.SimpleListFilter):
 
     def lookups(self, request, model_admin):
         return (
-            (1, 'Répond au ping'),
-            (0, 'Pas de ping >1j'),
-            (-1, 'Inconnu'),
+            ('up', 'Up'),
+            ('down', 'Down'),
+            ('unknown', 'Inconnu'),
         )
 
     def queryset(self, request, queryset):
-        answer_filter = Q(last_time_up__gte=timezone.now() - timedelta(days=1))
-        if self.value() == '-1':
-            return queryset.filter(last_time_up__isnull=True)
+        known_filter = models.Q(last_time_up__isnull=False, last_check__isnull=False)
+        if self.value() == 'unknown':
+            return queryset.exclude(known_filter)
         else:
-            queryset = queryset.exclude(last_time_up__isnull=True)
-            if self.value() == '0':
-                return queryset.exclude(answer_filter)
-            if self.value() == '1':
-                return queryset.filter(answer_filter)
+            queryset = queryset.filter(known_filter)
+            if self.value() == 'up':
+                return queryset.filter(last_check__lte=models.F('last_time_up'))
+            if self.value() == 'down':
+                return queryset.filter(last_check__gt=models.F('last_time_up'))
 
 
 class ActiveServiceFilter(admin.SimpleListFilter):
@@ -274,7 +274,7 @@ class IPPrefixAdmin(admin.ModelAdmin):
 
 
 class IPResourceAdmin(admin.ModelAdmin):
-    list_display = ('__str__', 'available_display', 'last_use', 'last_time_up_display',)
+    list_display = ('__str__', 'available_display', 'last_use', 'ping',)
     list_filter = (
         'category',
         ResourceInUseFilter,
@@ -303,6 +303,14 @@ class IPResourceAdmin(admin.ModelAdmin):
                     models.When(category=0, then=models.Max('service_allocation__end')),
                     models.When(category=1, then=models.Max('antenna_allocation__end')),
                 ))
+        qs = qs.annotate(downtime=Cast(
+                    models.Case(
+                        models.When(last_check__isnull=False, last_time_up__isnull=False, last_check__lte=models.F('last_time_up'), then=timedelta(days=0)),
+                        models.When(last_check__isnull=False, last_time_up__isnull=False, then=models.F('last_check') - models.F('last_time_up')),
+                        default=None,
+                    ),
+                    models.DurationField(),
+                ))
         return qs
 
     def available_display(self, obj):
@@ -315,10 +323,15 @@ class IPResourceAdmin(admin.ModelAdmin):
     last_use.short_description = 'Dernière utilisation'
     last_use.admin_order_field = 'last_use'
 
-    def last_time_up_display(self, obj):
-        return naturaltime(obj.last_time_up)
-    last_time_up_display.short_description = 'Dernier Ping'
-    last_time_up_display.admin_order_field = 'last_time_up'
+    def ping(self, obj):
+        if obj.downtime:
+            return 'down depuis >' + str(obj.downtime)
+        elif obj.downtime == timedelta(days=0):
+            return 'UP'
+        else:
+            return None
+    ping.short_description = 'ping'
+    ping.admin_order_field = 'downtime'
 
     def get_actions(self, request):
         actions = super().get_actions(request)