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.db import connection
 from django.core.cache import cache
+from django.contrib.admin.filters import AllValuesFieldListFilter
+from urllib.parse import urlencode
 
 from djgeojson.views import GeoJSONLayerView
 
+from functools import partial, update_wrapper
+
 from djadhere.utils import get_active_filter
 from adhesions.models import Adhesion
 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):
-    list_display = ('id', 'label', 'ip_display')
     inlines = (AntennaAllocationInline,)
     list_filter = (
         AntennaPrefixFilter,
+        ('ssid', AllValuesFieldListFilter),
     )
-    search_fields = ('=id', 'label', 'notes',)
+    search_fields = ('=id', 'label', 'notes', 'ssid')
     raw_id_fields = ('contact',)
 
     def get_queryset(self, request):
@@ -402,6 +406,12 @@ class AntennaAdmin(geo_admin.OSMGeoAdmin):
                 )
         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):
         if connection.vendor == 'postgresql':
             return obj.ip
@@ -411,6 +421,16 @@ class AntennaAdmin(geo_admin.OSMGeoAdmin):
             return ', '.join(allocations.values_list('resource__ip', flat=True)) or '-'
     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):
         actions = super().get_actions(request)
         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):
+    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='')
+    mode = models.IntegerField(choices=MODE_CHOICES, default=MODE_UNKNOWN)
+    ssid = models.CharField(max_length=64, blank=True, default='', verbose_name='SSID')
     mac = models.CharField(
             blank=True,
             default='',