|
@@ -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
|