Parcourir la source

Antenne : SSID et mode (AP / STA)

Élie Bouttier il y a 7 ans
Parent
commit
e035fc6921
3 fichiers modifiés avec 57 ajouts et 2 suppressions
  1. 22 2
      services/admin.py
  2. 25 0
      services/migrations/0039_auto_20180108_1355.py
  3. 10 0
      services/models.py

+ 22 - 2
services/admin.py

@@ -15,9 +15,13 @@ from django.db.models.functions import Cast
 from django.contrib.postgres.aggregates import StringAgg
 from django.contrib.postgres.aggregates import StringAgg
 from django.db import connection
 from django.db import connection
 from django.core.cache import cache
 from django.core.cache import cache
+from django.contrib.admin.filters import AllValuesFieldListFilter
+from urllib.parse import urlencode
 
 
 from djgeojson.views import GeoJSONLayerView
 from djgeojson.views import GeoJSONLayerView
 
 
+from functools import partial, update_wrapper
+
 from djadhere.utils import get_active_filter
 from djadhere.utils import get_active_filter
 from adhesions.models import Adhesion
 from adhesions.models import Adhesion
 from .models import Service, ServiceType, IPPrefix, IPResource, Route, Tunnel, ServiceAllocation, Antenna, AntennaAllocation, Allocation
 from .models import Service, ServiceType, IPPrefix, IPResource, Route, Tunnel, ServiceAllocation, Antenna, AntennaAllocation, Allocation
@@ -375,12 +379,12 @@ class ServiceTypeAdmin(admin.ModelAdmin):
 
 
 
 
 class AntennaAdmin(geo_admin.OSMGeoAdmin):
 class AntennaAdmin(geo_admin.OSMGeoAdmin):
-    list_display = ('id', 'label', 'ip_display')
     inlines = (AntennaAllocationInline,)
     inlines = (AntennaAllocationInline,)
     list_filter = (
     list_filter = (
         AntennaPrefixFilter,
         AntennaPrefixFilter,
+        ('ssid', AllValuesFieldListFilter),
     )
     )
-    search_fields = ('=id', 'label', 'notes',)
+    search_fields = ('=id', 'label', 'notes', 'ssid')
     raw_id_fields = ('contact',)
     raw_id_fields = ('contact',)
 
 
     def get_queryset(self, request):
     def get_queryset(self, request):
@@ -402,6 +406,12 @@ class AntennaAdmin(geo_admin.OSMGeoAdmin):
                 )
                 )
         return qs
         return qs
 
 
+    def get_list_display(self, request):
+        # ssid_display needs request to access query string and preserve filters
+        ssid_display = partial(self.ssid_display, request=request)
+        update_wrapper(ssid_display, self.ssid_display)
+        return ('id', 'label', 'mode', ssid_display, 'ip_display')
+
     def ip_display(self, obj):
     def ip_display(self, obj):
         if connection.vendor == 'postgresql':
         if connection.vendor == 'postgresql':
             return obj.ip
             return obj.ip
@@ -411,6 +421,16 @@ class AntennaAdmin(geo_admin.OSMGeoAdmin):
             return ', '.join(allocations.values_list('resource__ip', flat=True)) or '-'
             return ', '.join(allocations.values_list('resource__ip', flat=True)) or '-'
     ip_display.short_description = 'IP'
     ip_display.short_description = 'IP'
 
 
+    def ssid_display(self, obj, request):
+        if obj.ssid:
+            qs = request.GET.copy()
+            qs.update({'ssid': obj.ssid})
+            ssid_url = reverse('admin:services_antenna_changelist') + '?' + urlencode(qs)
+            return format_html(u'<a href="{}">{}</a>', ssid_url, obj.ssid)
+        else:
+            return None
+    ssid_display.short_description = 'SSID'
+
     def get_actions(self, request):
     def get_actions(self, request):
         actions = super().get_actions(request)
         actions = super().get_actions(request)
         if 'delete_selected' in actions:
         if 'delete_selected' in actions:

+ 25 - 0
services/migrations/0039_auto_20180108_1355.py

@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.7 on 2018-01-08 12:55
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('services', '0038_antenna_contact'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='antenna',
+            name='mode',
+            field=models.IntegerField(choices=[(0, 'Inconnu'), (1, 'AP'), (2, 'Station')], default=0),
+        ),
+        migrations.AddField(
+            model_name='antenna',
+            name='ssid',
+            field=models.CharField(blank=True, default='', max_length=64, verbose_name='SSID'),
+        ),
+    ]

+ 10 - 0
services/models.py

@@ -148,7 +148,17 @@ class Service(models.Model):
 
 
 
 
 class Antenna(models.Model):
 class Antenna(models.Model):
+    MODE_UNKNOWN = 0
+    MODE_AP = 1
+    MODE_STA = 2
+    MODE_CHOICES = (
+        (MODE_UNKNOWN, 'Inconnu'),
+        (MODE_AP, 'AP'),
+        (MODE_STA, 'Station'),
+    )
     label = models.CharField(max_length=128, blank=True, default='')
     label = models.CharField(max_length=128, blank=True, default='')
+    mode = models.IntegerField(choices=MODE_CHOICES, default=MODE_UNKNOWN)
+    ssid = models.CharField(max_length=64, blank=True, default='', verbose_name='SSID')
     mac = models.CharField(
     mac = models.CharField(
             blank=True,
             blank=True,
             default='',
             default='',