From 2ebcf3deeb0dc13044528ab5cc24ef39b7a0b6f6 Mon Sep 17 00:00:00 2001 From: Arthur Date: Fri, 20 Oct 2023 14:26:55 -0700 Subject: [PATCH 1/5] 12216 add color to model --- .../migrations/0043_circuittype_color.py | 18 ++++++++++++++++++ netbox/circuits/models/circuits.py | 6 ++++++ 2 files changed, 24 insertions(+) create mode 100644 netbox/circuits/migrations/0043_circuittype_color.py diff --git a/netbox/circuits/migrations/0043_circuittype_color.py b/netbox/circuits/migrations/0043_circuittype_color.py new file mode 100644 index 00000000000..6c4dffeb660 --- /dev/null +++ b/netbox/circuits/migrations/0043_circuittype_color.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.5 on 2023-10-20 21:25 + +from django.db import migrations +import utilities.fields + + +class Migration(migrations.Migration): + dependencies = [ + ('circuits', '0042_provideraccount'), + ] + + operations = [ + migrations.AddField( + model_name='circuittype', + name='color', + field=utilities.fields.ColorField(blank=True, max_length=6), + ), + ] diff --git a/netbox/circuits/models/circuits.py b/netbox/circuits/models/circuits.py index 0322b67c695..4dc775364cf 100644 --- a/netbox/circuits/models/circuits.py +++ b/netbox/circuits/models/circuits.py @@ -7,6 +7,7 @@ from dcim.models import CabledObjectModel from netbox.models import ChangeLoggedModel, OrganizationalModel, PrimaryModel from netbox.models.features import ContactsMixin, CustomFieldsMixin, CustomLinksMixin, ImageAttachmentsMixin, TagsMixin +from utilities.fields import ColorField __all__ = ( 'Circuit', @@ -20,6 +21,11 @@ class CircuitType(OrganizationalModel): Circuits can be organized by their functional role. For example, a user might wish to define CircuitTypes named "Long Haul," "Metro," or "Out-of-Band". """ + color = ColorField( + verbose_name=_('color'), + blank=True + ) + def get_absolute_url(self): return reverse('circuits:circuittype', args=[self.pk]) From 846accf37cdaa5c6178f187bb0f4c129773eff71 Mon Sep 17 00:00:00 2001 From: Arthur Date: Fri, 20 Oct 2023 14:50:08 -0700 Subject: [PATCH 2/5] 12216 add forms, serializers for color --- netbox/circuits/api/serializers.py | 2 +- netbox/circuits/filtersets.py | 2 +- netbox/circuits/forms/bulk_edit.py | 10 +++++++--- netbox/circuits/forms/bulk_import.py | 6 +++++- netbox/circuits/forms/filtersets.py | 11 ++++++++++- netbox/circuits/forms/model_forms.py | 4 ++-- netbox/circuits/tables/circuits.py | 3 ++- 7 files changed, 28 insertions(+), 10 deletions(-) diff --git a/netbox/circuits/api/serializers.py b/netbox/circuits/api/serializers.py index f4abda64599..5223de3398a 100644 --- a/netbox/circuits/api/serializers.py +++ b/netbox/circuits/api/serializers.py @@ -85,7 +85,7 @@ class CircuitTypeSerializer(NetBoxModelSerializer): class Meta: model = CircuitType fields = [ - 'id', 'url', 'display', 'name', 'slug', 'description', 'tags', 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display', 'name', 'slug', 'color', 'description', 'tags', 'custom_fields', 'created', 'last_updated', 'circuit_count', ] diff --git a/netbox/circuits/filtersets.py b/netbox/circuits/filtersets.py index e28238feac5..5c71683182b 100644 --- a/netbox/circuits/filtersets.py +++ b/netbox/circuits/filtersets.py @@ -137,7 +137,7 @@ class CircuitTypeFilterSet(OrganizationalModelFilterSet): class Meta: model = CircuitType - fields = ['id', 'name', 'slug', 'description'] + fields = ['id', 'name', 'slug', 'color', 'description'] class CircuitFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilterSet): diff --git a/netbox/circuits/forms/bulk_edit.py b/netbox/circuits/forms/bulk_edit.py index 1a936658327..080c102257d 100644 --- a/netbox/circuits/forms/bulk_edit.py +++ b/netbox/circuits/forms/bulk_edit.py @@ -7,7 +7,7 @@ from netbox.forms import NetBoxModelBulkEditForm from tenancy.models import Tenant from utilities.forms import add_blank_choice -from utilities.forms.fields import CommentField, DynamicModelChoiceField, DynamicModelMultipleChoiceField +from utilities.forms.fields import ColorField, CommentField, DynamicModelChoiceField, DynamicModelMultipleChoiceField from utilities.forms.widgets import DatePicker, NumberWithOptions __all__ = ( @@ -91,6 +91,10 @@ class ProviderNetworkBulkEditForm(NetBoxModelBulkEditForm): class CircuitTypeBulkEditForm(NetBoxModelBulkEditForm): + color = ColorField( + label=_('Color'), + required=False + ) description = forms.CharField( label=_('Description'), max_length=200, @@ -99,9 +103,9 @@ class CircuitTypeBulkEditForm(NetBoxModelBulkEditForm): model = CircuitType fieldsets = ( - (None, ('description',)), + (None, ('color', 'description',)), ) - nullable_fields = ('description',) + nullable_fields = ('color', 'description',) class CircuitBulkEditForm(NetBoxModelBulkEditForm): diff --git a/netbox/circuits/forms/bulk_import.py b/netbox/circuits/forms/bulk_import.py index d2217b45bf3..0c30e3cda17 100644 --- a/netbox/circuits/forms/bulk_import.py +++ b/netbox/circuits/forms/bulk_import.py @@ -3,6 +3,7 @@ from circuits.choices import CircuitStatusChoices from circuits.models import * from dcim.models import Site +from django.utils.safestring import mark_safe from django.utils.translation import gettext_lazy as _ from netbox.forms import NetBoxModelImportForm from tenancy.models import Tenant @@ -64,7 +65,10 @@ class CircuitTypeImportForm(NetBoxModelImportForm): class Meta: model = CircuitType - fields = ('name', 'slug', 'description', 'tags') + fields = ('name', 'slug', 'color', 'description', 'tags') + help_texts = { + 'color': mark_safe(_('RGB color in hexadecimal. Example:') + ' 00ff00'), + } class CircuitImportForm(NetBoxModelImportForm): diff --git a/netbox/circuits/forms/filtersets.py b/netbox/circuits/forms/filtersets.py index 1fb23902356..830c10d8ba4 100644 --- a/netbox/circuits/forms/filtersets.py +++ b/netbox/circuits/forms/filtersets.py @@ -7,7 +7,7 @@ from ipam.models import ASN from netbox.forms import NetBoxModelFilterSetForm from tenancy.forms import TenancyFilterForm, ContactModelFilterForm -from utilities.forms.fields import DynamicModelMultipleChoiceField, TagFilterField +from utilities.forms.fields import ColorField, DynamicModelMultipleChoiceField, TagFilterField from utilities.forms.widgets import DatePicker, NumberWithOptions __all__ = ( @@ -97,8 +97,17 @@ class ProviderNetworkFilterForm(NetBoxModelFilterSetForm): class CircuitTypeFilterForm(NetBoxModelFilterSetForm): model = CircuitType + fieldsets = ( + (None, ('q', 'filter_id', 'tag')), + (_('Attributes'), ('color',)), + ) tag = TagFilterField(model) + color = ColorField( + label=_('Color'), + required=False + ) + class CircuitFilterForm(TenancyFilterForm, ContactModelFilterForm, NetBoxModelFilterSetForm): model = Circuit diff --git a/netbox/circuits/forms/model_forms.py b/netbox/circuits/forms/model_forms.py index 8a540032e6b..0809cb2f422 100644 --- a/netbox/circuits/forms/model_forms.py +++ b/netbox/circuits/forms/model_forms.py @@ -76,14 +76,14 @@ class CircuitTypeForm(NetBoxModelForm): fieldsets = ( (_('Circuit Type'), ( - 'name', 'slug', 'description', 'tags', + 'name', 'slug', 'color', 'description', 'tags', )), ) class Meta: model = CircuitType fields = [ - 'name', 'slug', 'description', 'tags', + 'name', 'slug', 'color', 'description', 'tags', ] diff --git a/netbox/circuits/tables/circuits.py b/netbox/circuits/tables/circuits.py index 6a05983e6f9..6ae727eca14 100644 --- a/netbox/circuits/tables/circuits.py +++ b/netbox/circuits/tables/circuits.py @@ -28,6 +28,7 @@ class CircuitTypeTable(NetBoxTable): linkify=True, verbose_name=_('Name'), ) + color = columns.ColorColumn() tags = columns.TagColumn( url_name='circuits:circuittype_list' ) @@ -40,7 +41,7 @@ class CircuitTypeTable(NetBoxTable): class Meta(NetBoxTable.Meta): model = CircuitType fields = ( - 'pk', 'id', 'name', 'circuit_count', 'description', 'slug', 'tags', 'created', 'last_updated', 'actions', + 'pk', 'id', 'name', 'circuit_count', 'color', 'description', 'slug', 'tags', 'created', 'last_updated', 'actions', ) default_columns = ('pk', 'name', 'circuit_count', 'description', 'slug') From 1244aa56b077a43f1fa260a963bc511b8d050ca5 Mon Sep 17 00:00:00 2001 From: Arthur Date: Fri, 20 Oct 2023 15:06:24 -0700 Subject: [PATCH 3/5] 12216 color to detail view, add type to svg --- netbox/dcim/svg/cables.py | 1 + netbox/templates/circuits/circuittype.html | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/netbox/dcim/svg/cables.py b/netbox/dcim/svg/cables.py index acc4fcad9ee..6609e199c74 100644 --- a/netbox/dcim/svg/cables.py +++ b/netbox/dcim/svg/cables.py @@ -159,6 +159,7 @@ def _get_labels(cls, instance): labels.append(location_label) elif instance._meta.model_name == 'circuit': labels[0] = f'Circuit {instance}' + labels.append(instance.type) labels.append(instance.provider) if instance.description: labels.append(instance.description) diff --git a/netbox/templates/circuits/circuittype.html b/netbox/templates/circuits/circuittype.html index b8b08baf005..76e4a78849f 100644 --- a/netbox/templates/circuits/circuittype.html +++ b/netbox/templates/circuits/circuittype.html @@ -29,6 +29,12 @@
{% trans "Description" %} {{ object.description|placeholder }} + + {% trans "Color" %} + +   + + From 22f92417a8580e7af66bc0ad0a465d923cc52b95 Mon Sep 17 00:00:00 2001 From: Arthur Date: Fri, 20 Oct 2023 15:10:12 -0700 Subject: [PATCH 4/5] 12216 add color to svg --- netbox/dcim/svg/cables.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/netbox/dcim/svg/cables.py b/netbox/dcim/svg/cables.py index 6609e199c74..7b376661b0a 100644 --- a/netbox/dcim/svg/cables.py +++ b/netbox/dcim/svg/cables.py @@ -182,6 +182,8 @@ def _get_color(cls, instance): if hasattr(instance, 'role'): # Device return instance.role.color + elif instance._meta.model_name == 'circuit': + return instance.type.color else: # Other parent object return 'e0e0e0' From f6e6e7778bcb9d6491b4e835c21fdb13331a4d59 Mon Sep 17 00:00:00 2001 From: Arthur Date: Mon, 23 Oct 2023 13:50:17 -0700 Subject: [PATCH 5/5] 12216 review changes --- netbox/circuits/forms/bulk_edit.py | 4 ++-- netbox/dcim/svg/cables.py | 2 +- netbox/templates/circuits/circuittype.html | 6 +++++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/netbox/circuits/forms/bulk_edit.py b/netbox/circuits/forms/bulk_edit.py index 080c102257d..5c416bff9ad 100644 --- a/netbox/circuits/forms/bulk_edit.py +++ b/netbox/circuits/forms/bulk_edit.py @@ -103,9 +103,9 @@ class CircuitTypeBulkEditForm(NetBoxModelBulkEditForm): model = CircuitType fieldsets = ( - (None, ('color', 'description',)), + (None, ('color', 'description')), ) - nullable_fields = ('color', 'description',) + nullable_fields = ('color', 'description') class CircuitBulkEditForm(NetBoxModelBulkEditForm): diff --git a/netbox/dcim/svg/cables.py b/netbox/dcim/svg/cables.py index 7b376661b0a..31e090078e2 100644 --- a/netbox/dcim/svg/cables.py +++ b/netbox/dcim/svg/cables.py @@ -182,7 +182,7 @@ def _get_color(cls, instance): if hasattr(instance, 'role'): # Device return instance.role.color - elif instance._meta.model_name == 'circuit': + elif instance._meta.model_name == 'circuit' and instance.type.color: return instance.type.color else: # Other parent object diff --git a/netbox/templates/circuits/circuittype.html b/netbox/templates/circuits/circuittype.html index 76e4a78849f..407ee4042af 100644 --- a/netbox/templates/circuits/circuittype.html +++ b/netbox/templates/circuits/circuittype.html @@ -32,7 +32,11 @@
{% trans "Color" %} -   + {% if object.color %} +   + {% else %} + {{ ''|placeholder }} + {% endif %}