Browse Source

amélioration status des tunnels

Élie Bouttier 7 years ago
parent
commit
fb11920176
3 changed files with 68 additions and 2 deletions
  1. 28 1
      services/admin.py
  2. 26 0
      services/migrations/0034_auto_20170613_1327.py
  3. 14 1
      services/models.py

+ 28 - 1
services/admin.py

@@ -75,6 +75,25 @@ class AntennaPrefixFilter(admin.SimpleListFilter):
         return queryset
 
 
+class ActiveTunnelFilter(admin.SimpleListFilter):
+    title = 'status'
+    parameter_name = 'active'
+
+    def lookups(self, request, model_admin):
+        return (
+            ('1', 'Actif'),
+            ('0', 'Désactivé'),
+        )
+
+    def queryset(self, request, queryset):
+        query = Q(ended__isnull=True)
+        if self.value() == '0':
+            return queryset.exclude(query)
+        if self.value() == '1':
+            return queryset.filter(query)
+        return queryset
+
+
 ### Inlines
 
 class AllocationInlineFormSet(BaseInlineFormSet):
@@ -256,7 +275,15 @@ class RouteAdmin(admin.ModelAdmin):
 
 
 class TunnelAdmin(RouteAdmin):
-    list_display = ('name', 'description',)
+    list_display = ('name', 'description', 'created', 'active')
+    list_filter = (
+        ActiveTunnelFilter,
+    )
+
+    def active(self, obj):
+        return not obj.ended
+    active.short_description = 'Actif'
+    active.boolean = True
 
 
 class ServiceTypeAdmin(admin.ModelAdmin):

+ 26 - 0
services/migrations/0034_auto_20170613_1327.py

@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2017-06-13 11:27
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.utils.timezone
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('services', '0033_tunnel_created'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='tunnel',
+            name='ended',
+            field=models.DateTimeField(blank=True, null=True, verbose_name='Date de désactivation'),
+        ),
+        migrations.AlterField(
+            model_name='tunnel',
+            name='created',
+            field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='Date de création'),
+        ),
+    ]

+ 14 - 1
services/models.py

@@ -180,13 +180,26 @@ class Route(models.Model):
 
 class Tunnel(Route):
     description = models.CharField(max_length=128, blank=True)
-    created = models.DateTimeField(auto_now_add=True)
+    created = models.DateTimeField(default=timezone.now, verbose_name='Date de création')
+    ended = models.DateTimeField(null=True, blank=True, verbose_name='Date de désactivation')
     port = models.IntegerField(null=True, blank=True)
     local_ip = models.GenericIPAddressField(null=True, blank=True, verbose_name='IP locale')
     remote_ip = models.GenericIPAddressField(null=True, blank=True, verbose_name='IP distante')
     networks = models.ManyToManyField(IPPrefix, blank=True, verbose_name='Réseaux')
     notes = models.TextField(blank=True, default='')
 
+    def clean(self):
+        super().clean()
+        if self.ended:
+            # Vérification de la cohérence des champs created et ended
+            if self.created > self.ended:
+                raise ValidationError({'ended': "La date de désactivation doit être postérieur "
+                                                "à la date de création du tunnel."})
+        elif self.port:
+            # Vérification de l’unicité d’un tunnel actif avec un port donné
+            if Tunnel.objects.exclude(pk=self.pk).filter(port=self.port, ended__isnull=True).exists():
+                raise ValidationError({'port': "Ce numéro de port est déjà utilisé par un autre tunnel."})
+
 
 class Allocation(models.Model):
     start = models.DateTimeField(verbose_name='Début de la période d’allocation', default=timezone.now)