From 366f38056f355a46267b1872d29960669e929a5a Mon Sep 17 00:00:00 2001 From: Jeff Cook Date: Tue, 5 Mar 2019 21:42:08 -0700 Subject: [PATCH] Allow definition of topo levels by tag. --- netbox/extras/models.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/netbox/extras/models.py b/netbox/extras/models.py index 1b106a62a..5cd51cc7d 100644 --- a/netbox/extras/models.py +++ b/netbox/extras/models.py @@ -469,7 +469,7 @@ class TopologyMap(models.Model): # Add each device to the graph devices = [] 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 devices = [d for d in devices if d.id not in seen] seen.update([d.id for d in devices]) @@ -488,7 +488,7 @@ class TopologyMap(models.Model): device_superset = Q() for device_set in self.device_sets: 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,)) # Draw edges depending on graph type @@ -501,6 +501,13 @@ class TopologyMap(models.Model): 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): from circuits.models import CircuitTermination