mirror of
https://github.com/drygdryg/netbox-plugin-device-map.git
synced 2024-11-26 12:10:54 +03:00
40 lines
1.6 KiB
Python
40 lines
1.6 KiB
Python
from dcim.models import Device
|
|
|
|
from .settings import plugin_settings
|
|
from .helpers import get_connected_devices, LatLon
|
|
|
|
|
|
geomap_settings = plugin_settings['geomap_settings']
|
|
CPE_DEVICE_ROLE_NAME = plugin_settings['cpe_device_role']
|
|
|
|
|
|
def configure_leaflet_map(map_id: str, devices: dict[Device, LatLon], calculate_connections=True) -> dict:
|
|
"""Generate Leaflet map of devices and the connections between them.
|
|
:param map_id: initialize the map on the div with this id
|
|
:param devices: list of target devices to display on the map
|
|
:param calculate_connections: calculate connections between devices
|
|
"""
|
|
device_id_to_latlon = {device.id: position for device, position in devices.items()}
|
|
map_config = dict(**geomap_settings, map_id=map_id)
|
|
markers: list[dict] = []
|
|
connections: set[frozenset[LatLon, LatLon]] = set()
|
|
for device, position in devices.items():
|
|
markers.append(dict(
|
|
position=position,
|
|
icon=device.device_role.slug,
|
|
device=dict(
|
|
id=device.id,
|
|
name=device.name,
|
|
url=device.get_absolute_url(),
|
|
role=device.device_role.name
|
|
)
|
|
))
|
|
if calculate_connections:
|
|
for peer_device_id in get_connected_devices(device).values_list('id', flat=True).order_by():
|
|
if peer_position := device_id_to_latlon.get(peer_device_id):
|
|
connections.add(frozenset((position, peer_position)))
|
|
|
|
map_config.update(markers=markers, connections=[tuple(c) for c in connections])
|
|
|
|
return map_config
|