Browse Source

filtrage des IP par préfixe

Élie Bouttier 8 years ago
parent
commit
52ed1db8db

+ 1 - 0
requirements.txt

@@ -1,2 +1,3 @@
 django<1.12
 django-bootstrap3
+ipaddress

+ 4 - 1
services/admin.py

@@ -119,7 +119,10 @@ class ServiceAdmin(admin.ModelAdmin):
 
 class IPResourceAdmin(admin.ModelAdmin):
     list_display = ('__str__', 'in_use_display')
-    list_filter = (ResourceInUseFilter,)
+    list_filter = (
+        ResourceInUseFilter,
+        ('prefixes', admin.RelatedOnlyFieldListFilter),
+    )
     fields = ('ip',)
     readonly_fields = ('ip',)
     search_fields = ('ip',)

+ 3 - 0
services/apps.py

@@ -4,3 +4,6 @@ from django.apps import AppConfig
 class ServicesConfig(AppConfig):
     name = 'services'
     verbose_name = 'Services'
+
+    def ready(self):
+        import services.signals  # noqa

+ 27 - 0
services/migrations/0023_auto_20170516_2338.py

@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2017-05-16 21:38
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('services', '0022_auto_20170514_2302'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='IPPrefix',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('prefix', models.CharField(max_length=128)),
+            ],
+        ),
+        migrations.AddField(
+            model_name='ipresource',
+            name='prefixes',
+            field=models.ManyToManyField(to='services.IPPrefix', verbose_name='préfixes'),
+        ),
+    ]

+ 8 - 0
services/models.py

@@ -14,8 +14,16 @@ from adhesions.models import Adhesion
 from banking.models import Payment
 
 
+class IPPrefix(models.Model):
+    prefix = models.CharField(max_length=128)
+
+    def __str__(self):
+        return self.prefix
+
+
 class IPResource(models.Model):
     ip = models.GenericIPAddressField(verbose_name='IP', primary_key=True)
+    prefixes = models.ManyToManyField(IPPrefix, verbose_name='préfixes')
     reserved = models.BooleanField(default=False)
 
     @property

+ 29 - 0
services/signals.py

@@ -0,0 +1,29 @@
+from django.dispatch import receiver
+from django.db.models.signals import post_save
+
+from .models import IPPrefix, IPResource
+
+from ipaddress import ip_address, ip_network
+
+
+@receiver(post_save, sender=IPPrefix, dispatch_uid='ip_prefix')
+def ip_prefix(sender, instance, created, **kwargs):
+    network = ip_network(instance.prefix)
+    for ip in IPResource.objects.all():
+        address = ip_address(ip.ip)
+        if address in network:
+            ip.prefixes.add(instance)
+        else:
+            ip.prefixes.remove(instance)
+
+
+
+@receiver(post_save, sender=IPResource, dispatch_uid='ip_resource')
+def ip_resource(sender, instance, created, **kwargs):
+    address = ip_address(instance.ip)
+    for prefix in IPPrefix.objects.all():
+        network = ip_network(prefix.prefix)
+        if address in network:
+            instance.prefixes.add(prefix)
+        else:
+            instance.prefixes.remove(prefix)