#63 Be able to manage radio links

Ouvert
alexAubin veut fusionner 1 commits à partir de alexAubin/links-management vers FFDN/master

+ 9 - 1
wifiwithme/apps/contribmap/admin.py

@@ -4,7 +4,7 @@ from django.contrib import admin
 from django.utils.html import format_html
 
 # Register your models here.
-from .models import Contrib
+from .models import Contrib, Link
 
 
 # Kinda hackish to do that here
@@ -52,3 +52,11 @@ class ContribAdmin(admin.ModelAdmin):
             return 'non expiré'
 
     expired_string.short_description = 'Expiration'
+
+
+@admin.register(Link)
+class LinkAdmin(admin.ModelAdmin):
+    search_fields = ["node_from", "node_to", "state", "date"]
+    list_display = ("node_from", "node_to", "state", "date")
+
+    readonly_fields = ['date']

+ 33 - 0
wifiwithme/apps/contribmap/models.py

@@ -225,3 +225,36 @@ class Contrib(models.Model):
             settings.SITE_URL.strip('/'),
             reverse('manage_contrib', kwargs={'pk': self.pk}),
             token)
+
+
+class Link(models.Model):
+
+    id = models.AutoField(primary_key=True, blank=False, null=False)
+    date = models.DateTimeField("date d'enregistrement", auto_now_add=True)
+    node_from = models.ForeignKey(Contrib, on_delete=models.CASCADE, related_name="node_from")
+    node_to = models.ForeignKey(Contrib, on_delete=models.CASCADE, related_name="node_to")
+    comment = models.TextField('commentaire', blank=True, null=True)
+    state = models.CharField(
+        'état du lien',
+        max_length=15, choices=(
+            ("to_be_tested", "À tester"),
+            ("planned", "Installation prévue"),
+            ("active", "Actif"),
+            ("broken", "Cassé"),
+            ("decomissioned", "Décomissionné"),
+        ), default=None)
+
+    def style(self):
+
+        if self.state == "to_be_tested":
+            return { "color": "#551100", "weight": 3, "opacity": 0.5 }
+        elif self.state == "planned":
+            return { "color": "#edac00", "weight": 3, "opacity": 1 }
+        elif self.state == "active":
+            return { "color": "#1b9200", "weight": 5, "opacity": 1 }
+        elif self.state == "broken":
+            return { "color": "#d40000", "weight": 5, "opacity": 1 }
+        elif self.state == "decomissioned":
+            return { "color": "#000000", "weight": 3, "opacity": 0 }
+        else:
+            return None

+ 20 - 1
wifiwithme/apps/contribmap/views.py

@@ -15,7 +15,7 @@ from django.views.generic import View
 import pytz
 
 from .forms import ManageActionForm, PublicContribForm
-from .models import Contrib
+from .models import Contrib, Link
 from .decorators import prevent_robots
 from .tokens import ContribTokenManager, URLTokenManager, TokenError
 
@@ -190,6 +190,7 @@ class PublicJSON(JSONContribView):
 
     def get_features(self):
         contribs = Contrib.objects.all()
+        links = Link.objects.all()
 
         data = []
         for i in contribs:
@@ -214,6 +215,24 @@ class PublicJSON(JSONContribView):
                     "comment": i.get_public_field('comment'),
                 }
             })
+
+        for l in links:
+
+            data.append({
+                "id": "l-"+str(l.pk),
+                "type": "Link",
+                "geometry": {
+                    "type": "LineString",
+                    "coordinates": [[l.node_from.longitude, l.node_from.latitude],
+                                    [l.node_to.longitude, l.node_to.latitude]],
+                },
+                "properties": {
+                    "state": l.state,
+                    "comment": l.comment
+                },
+                "style": l.style()
+            })
+
         return data
 
 

+ 11 - 3
wifiwithme/static/map.js

@@ -96,9 +96,11 @@ $( document ).ready(function() {
                 });
             }
         }
-
+        
+        data_markers = { "id": data.id, "license": data.license, "features": data.features.filter(f=>f.type=="Feature") }
+        
         // Add to map
-        var featureLayer = L.geoJson(data, {
+        var featureLayer = L.geoJson(data_markers, {
             onEachFeature: function(feature, layer) {
                 buildPopupContent(feature, layer);
                 drawSemiCircles(feature, layer);
@@ -113,7 +115,13 @@ $( document ).ready(function() {
                 return L.marker(latlng, {icon: icon});
             }
         }).addTo(map);
-
+        
+           
+        var links = data.features.filter(d=>d.type=="Link");
+        for (var i in links)
+        {
+            L.geoJson([links[i].geometry], { style: links[i].style }).addTo(map);
+        }
 
         function openMarker(id) {
             for (var i in featureLayer._layers) {