Browse Source

Closes #1179: Adjust topology map text color based on node background

Jeremy Stretch 8 years ago
parent
commit
3be6e5b015
2 changed files with 17 additions and 2 deletions
  1. 5 2
      netbox/extras/models.py
  2. 12 0
      netbox/utilities/utils.py

+ 5 - 2
netbox/extras/models.py

@@ -13,6 +13,8 @@ from django.template import Template, Context
 from django.utils.encoding import python_2_unicode_compatible
 from django.utils.safestring import mark_safe
 
+from utilities.utils import foreground_color
+
 
 CUSTOMFIELD_MODELS = (
     'site', 'rack', 'devicetype', 'device',                 # DCIM
@@ -336,8 +338,9 @@ class TopologyMap(models.Model):
             for query in device_set.split(';'):  # Split regexes on semicolons
                 devices += Device.objects.filter(name__regex=query).select_related('device_role')
             for d in devices:
-                fillcolor = '#{}'.format(d.device_role.color)
-                subgraph.node(d.name, style='filled', fillcolor=fillcolor)
+                bg_color = '#{}'.format(d.device_role.color)
+                fg_color = '#{}'.format(foreground_color(d.device_role.color))
+                subgraph.node(d.name, style='filled', fillcolor=bg_color, fontcolor=fg_color, fontname='sans')
 
             # Add an invisible connection to each successive device in a set to enforce horizontal order
             for j in range(0, len(devices) - 1):

+ 12 - 0
netbox/utilities/utils.py

@@ -24,3 +24,15 @@ def csv_format(data):
             csv.append(u'{}'.format(value))
 
     return u','.join(csv)
+
+
+def foreground_color(bg_color):
+    """
+    Return the ideal foreground color (black or white) for a given background color in hexadecimal RGB format.
+    """
+    bg_color = bg_color.strip('#')
+    r, g, b = [int(bg_color[c:c+2], 16) for c in (0, 2, 4)]
+    if r * 0.299 + g * 0.587 + b * 0.114 > 186:
+        return '000000'
+    else:
+        return 'ffffff'