Allow definition of topo levels by tag.

This commit is contained in:
Jeff Cook 2019-03-05 21:42:08 -07:00
parent 7294f43fa3
commit 366f38056f

View File

@ -469,7 +469,7 @@ class TopologyMap(models.Model):
# Add each device to the graph # Add each device to the graph
devices = [] devices = []
for query in device_set.strip(';').split(';'): # Split regexes on semicolons for query in device_set.strip(';').split(';'): # Split regexes on semicolons
devices += Device.objects.filter(name__regex=query).select_related('device_role') devices += Device.objects.filter(**self.get_filter(query)).select_related('device_role')
# Remove duplicate devices # Remove duplicate devices
devices = [d for d in devices if d.id not in seen] devices = [d for d in devices if d.id not in seen]
seen.update([d.id for d in devices]) seen.update([d.id for d in devices])
@ -488,7 +488,7 @@ class TopologyMap(models.Model):
device_superset = Q() device_superset = Q()
for device_set in self.device_sets: for device_set in self.device_sets:
for query in device_set.split(';'): # Split regexes on semicolons for query in device_set.split(';'): # Split regexes on semicolons
device_superset = device_superset | Q(name__regex=query) device_superset = device_superset | Q(**self.get_filter(query))
devices = Device.objects.filter(*(device_superset,)) devices = Device.objects.filter(*(device_superset,))
# Draw edges depending on graph type # Draw edges depending on graph type
@ -501,6 +501,13 @@ class TopologyMap(models.Model):
return self.graph.pipe(format=img_format) return self.graph.pipe(format=img_format)
def get_filter(self, splitq):
if splitq.startswith('@tag:'):
q = splitq[5:]
return {"tags__name__in": q.split(',')}
else:
return {"name__regex": splitq}
def add_network_connections(self, devices): def add_network_connections(self, devices):
from circuits.models import CircuitTermination from circuits.models import CircuitTermination