diff --git a/netbox/extras/models.py b/netbox/extras/models.py index 62eb07d1a..47dd91243 100644 --- a/netbox/extras/models.py +++ b/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): diff --git a/netbox/utilities/utils.py b/netbox/utilities/utils.py index 8aaded410..6a37eb343 100644 --- a/netbox/utilities/utils.py +++ b/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'