Browse Source

Add GeoJSON for facilities

Baptiste Jonglez 6 years ago
parent
commit
dc9b02744e
2 changed files with 54 additions and 1 deletions
  1. 2 0
      netbox/dcim/urls.py
  2. 52 1
      netbox/dcim/views.py

+ 2 - 0
netbox/dcim/urls.py

@@ -20,6 +20,8 @@ urlpatterns = [
 
     # Facilities
     url(r'^facilities/$', views.FacilityListView.as_view(), name='facility_list'),
+    url(r'^facilities/geojson/$', views.FacilityListGeoJsonView.as_view(), name='facility_list_geojson'),
+
     url(r'^facilities/add/$', views.FacilityCreateView.as_view(), name='facility_add'),
     url(r'^facilities/import/$', views.FacilityBulkImportView.as_view(), name='facility_import'),
     url(r'^facilities/edit/$', views.FacilityBulkEditView.as_view(), name='facility_bulk_edit'),

+ 52 - 1
netbox/dcim/views.py

@@ -9,6 +9,7 @@ from django.db import transaction
 from django.db.models import Count, Q
 from django.forms import modelformset_factory
 from django.http import HttpResponseRedirect
+from django.http.response import JsonResponse
 from django.shortcuts import get_object_or_404, redirect, render
 from django.urls import reverse
 from django.utils.html import escape
@@ -28,7 +29,7 @@ from utilities.views import (
 )
 from virtualization.models import VirtualMachine
 from . import filters, forms, tables
-from .constants import CONNECTION_STATUS_CONNECTED
+from .constants import CONNECTION_STATUS_CONNECTED, SITE_STATUS_CHOICES
 from .models import (
     ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay,
     DeviceBayTemplate, DeviceRole, DeviceType, Interface, InterfaceConnection, InterfaceTemplate, Manufacturer,
@@ -165,6 +166,56 @@ class RegionBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
 # Facilities
 #
 
+# Facilities as GeoJSON
+class FacilityListGeoJsonView(View):
+
+    def get(self, request, *args, **kwargs):
+        facilities = Facility.objects.select_related(
+            'tenant'
+        ).prefetch_related(
+            'sites'
+        )
+        def gen_properties(site):
+            d = dict()
+            d["id"] = site.pk
+            d["name"] = site.name
+            d["description"] = site.description
+            d["slug"] = site.slug
+            d["status_id"] = site.status
+            d["status_name"] = SITE_STATUS_CHOICES[site.status][1]
+            d["tenant"] = site.tenant.name if site.tenant else ""
+            d["tenant_slug"] = site.tenant.slug if site.tenant else ""
+            d["asn"] = site.asn
+            return d
+        def gen_geojson(facility):
+            d = dict()
+            d["type"] = "Feature"
+            d["geometry"] = {
+                "coordinates": [facility.longitude, facility.latitude],
+                "type": "Point",
+            }
+            d["properties"] = {
+                "id_facility": facility.pk,
+                "name": facility.name,
+                "description": facility.description,
+                "peeringdb_id": facility.peeringdb_id,
+                "tenant": facility.tenant.name if facility.tenant else "",
+                "tenant_slug": facility.tenant.slug if facility.tenant else "",
+                "address": facility.physical_address,
+                "sites": [gen_properties(site) for site in facility.sites.all()],
+            }
+            return d
+        def keep_facility(facility):
+            if facility.longitude == None or facility.latitude == None:
+                return False
+            if facility.sites.count() == 0:
+                return False
+            return True
+        # Convert facilities to geoJSON
+        g = [gen_geojson(fac) for fac in facilities.all() if keep_facility(fac)]
+        return JsonResponse({"type": "FeatureCollection", "features": g})
+
+
 class FacilityListView(ObjectListView):
     queryset = Facility.objects.select_related('tenant')
     filter = filters.FacilityFilter