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 import admin
-from django.contrib.gis import admin as geo_admin
 from django.db import models
 from django.db import models
 from django.db.models import Q
 from django.db.models import Q
 from django.forms import ModelForm, BaseInlineFormSet
 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.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 urllib.parse import urlencode
 
 
 from djgeojson.views import GeoJSONLayerView
 from djgeojson.views import GeoJSONLayerView
@@ -26,6 +24,7 @@ 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
 from .utils import notify_allocation
 from .utils import notify_allocation
+from .forms import AntennaForm
 
 
 
 
 ### Filters
 ### Filters
@@ -86,6 +85,25 @@ class AntennaPrefixFilter(admin.SimpleListFilter):
         return queryset
         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):
 class ActiveTunnelFilter(admin.SimpleListFilter):
     title = 'status'
     title = 'status'
     parameter_name = 'active'
     parameter_name = 'active'
@@ -378,16 +396,18 @@ class ServiceTypeAdmin(admin.ModelAdmin):
         return False
         return False
 
 
 
 
-class AntennaAdmin(geo_admin.OSMGeoAdmin):
+class AntennaAdmin(admin.ModelAdmin):
     inlines = (AntennaAllocationInline,)
     inlines = (AntennaAllocationInline,)
     list_filter = (
     list_filter = (
         AntennaPrefixFilter,
         AntennaPrefixFilter,
+        AntennaPositionFilter,
         'mode',
         'mode',
-        ('ssid', AllValuesFieldListFilter),
+        'ssid',
     )
     )
     list_display_links = ('id', 'label')
     list_display_links = ('id', 'label')
     search_fields = ('=id', 'label', 'notes', 'ssid')
     search_fields = ('=id', 'label', 'notes', 'ssid')
     raw_id_fields = ('contact',)
     raw_id_fields = ('contact',)
+    form = AntennaForm
 
 
     def get_queryset(self, request):
     def get_queryset(self, request):
         qs = super().get_queryset(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 needs request to access query string and preserve filters
         ssid_display = partial(self.ssid_display, request=request)
         ssid_display = partial(self.ssid_display, request=request)
         update_wrapper(ssid_display, self.ssid_display)
         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):
     def ip_display(self, obj):
         if connection.vendor == 'postgresql':
         if connection.vendor == 'postgresql':
@@ -465,4 +490,4 @@ admin.site.register(IPPrefix, IPPrefixAdmin)
 admin.site.register(IPResource, IPResourceAdmin)
 admin.site.register(IPResource, IPResourceAdmin)
 admin.site.register(Route, RouteAdmin)
 admin.site.register(Route, RouteAdmin)
 admin.site.register(Tunnel, TunnelAdmin)
 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:
     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