Browse Source

improve antenna admin

Élie Bouttier 7 years ago
parent
commit
cf24df374d
2 changed files with 60 additions and 24 deletions
  1. 31 6
      services/admin.py
  2. 29 18
      services/forms.py

+ 31 - 6
services/admin.py

@@ -1,5 +1,4 @@
 from django.contrib import admin
-from django.contrib.gis import admin as geo_admin
 from django.db import models
 from django.db.models import Q
 from django.forms import ModelForm, BaseInlineFormSet
@@ -15,7 +14,6 @@ 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
@@ -26,6 +24,7 @@ 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
 from .utils import notify_allocation
+from .forms import AntennaForm
 
 
 ### Filters
@@ -86,6 +85,25 @@ class AntennaPrefixFilter(admin.SimpleListFilter):
         return queryset
 
 
+class AntennaPositionFilter(admin.SimpleListFilter):
+    title = 'géolocalisation'
+    parameter_name = 'position'
+
+    def lookups(self, request, model_admin):
+        return (
+            ('1', 'Connue'),
+            ('0', 'Inconnue'),
+        )
+
+    def queryset(self, request, queryset):
+        query = Q(position__isnull=True)
+        if self.value() == '0':
+            return queryset.filter(query)
+        if self.value() == '1':
+            return queryset.exclude(query)
+        return queryset
+
+
 class ActiveTunnelFilter(admin.SimpleListFilter):
     title = 'status'
     parameter_name = 'active'
@@ -378,16 +396,18 @@ class ServiceTypeAdmin(admin.ModelAdmin):
         return False
 
 
-class AntennaAdmin(geo_admin.OSMGeoAdmin):
+class AntennaAdmin(admin.ModelAdmin):
     inlines = (AntennaAllocationInline,)
     list_filter = (
         AntennaPrefixFilter,
+        AntennaPositionFilter,
         'mode',
-        ('ssid', AllValuesFieldListFilter),
+        'ssid',
     )
     list_display_links = ('id', 'label')
     search_fields = ('=id', 'label', 'notes', 'ssid')
     raw_id_fields = ('contact',)
+    form = AntennaForm
 
     def get_queryset(self, request):
         qs = super().get_queryset(request)
@@ -412,7 +432,12 @@ class AntennaAdmin(geo_admin.OSMGeoAdmin):
         # 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')
+        return ('id', 'label', 'mode', ssid_display, 'position_display', 'ip_display')
+
+    def position_display(self, obj):
+        return obj.position is not None
+    position_display.short_description = 'Géolocalisé'
+    position_display.boolean = True
 
     def ip_display(self, obj):
         if connection.vendor == 'postgresql':
@@ -465,4 +490,4 @@ admin.site.register(IPPrefix, IPPrefixAdmin)
 admin.site.register(IPResource, IPResourceAdmin)
 admin.site.register(Route, RouteAdmin)
 admin.site.register(Tunnel, TunnelAdmin)
-geo_admin.site.register(Antenna, AntennaAdmin)
+admin.site.register(Antenna, AntennaAdmin)

+ 29 - 18
services/forms.py

@@ -1,25 +1,36 @@
-from django.forms import ModelForm
-from django.utils import timezone
+from django import forms
+from django.contrib.gis.geos import Point
 
-from django_select2.forms import Select2Widget
+from .models import Antenna
 
-from .models import Service, ResourceAllocation
 
+class AntennaForm(forms.ModelForm):
+    longitude = forms.FloatField(
+        min_value=-180,
+        max_value=180,
+        required=False,
+    )
+    latitude = forms.FloatField(
+        min_value=-90,
+        max_value=90,
+        required=False,
+    )
 
-class ServiceForm(ModelForm):
     class Meta:
-        model = Service
-        fields = ('adhesion', 'service_type', 'label', 'notes', 'active',)
-        widgets = {
-            'adhesion': Select2Widget(),
-        }
+        model = Antenna
+        fields = ('label', 'mode', 'ssid', 'mac', 'longitude', 'latitude', 'orientation', 'contact', 'notes', 'position')
+        widgets = {'position': forms.HiddenInput}
 
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+        coordinates = self.initial.get('position', self.instance.position)
+        if isinstance(coordinates, Point):
+            self.initial['longitude'], self.initial['latitude'] = coordinates.tuple
 
-class ResourceAllocationForm(ModelForm):
-    class Meta:
-        model = ResourceAllocation
-        fields = ('service', 'resource', 'route')
-        widgets = {
-            'service': Select2Widget(),
-            'resource': Select2Widget(),
-        }
+    def clean(self):
+        data = super().clean()
+        latitude = data.get('latitude')
+        longitude = data.get('longitude')
+        if latitude and longitude:
+            data['position'] = Point(longitude, latitude)
+        return data