Skip to content

Commit a1ba3b5

Browse files
committed
Introduce ColorField for consistent represention of color choice fields in forms
1 parent b3ed545 commit a1ba3b5

File tree

3 files changed

+34
-50
lines changed

3 files changed

+34
-50
lines changed

netbox/dcim/forms.py

Lines changed: 23 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
from tenancy.models import Tenant
2424
from utilities.forms import (
2525
APISelect, APISelectMultiple, add_blank_choice, BootstrapMixin, BulkEditForm, BulkEditNullBooleanSelect,
26-
ColorSelect, CommentField, CSVChoiceField, CSVContentTypeField, CSVModelChoiceField, CSVTypedChoiceField,
26+
ColorField, CommentField, CSVChoiceField, CSVContentTypeField, CSVModelChoiceField, CSVTypedChoiceField,
2727
DynamicModelChoiceField, DynamicModelMultipleChoiceField, ExpandableNameField, form_from_model, JSONField,
2828
NumericArrayField, SelectWithPK, SmallTextarea, SlugField, StaticSelect2, StaticSelect2Multiple, TagFilterField,
2929
BOOLEAN_WITH_BLANK_CHOICES,
@@ -610,10 +610,8 @@ class RackRoleBulkEditForm(BootstrapMixin, CustomFieldBulkEditForm):
610610
queryset=RackRole.objects.all(),
611611
widget=forms.MultipleHiddenInput
612612
)
613-
color = forms.CharField(
614-
max_length=6, # RGB color code
615-
required=False,
616-
widget=ColorSelect()
613+
color = ColorField(
614+
required=False
617615
)
618616
description = forms.CharField(
619617
max_length=200,
@@ -1703,10 +1701,8 @@ class FrontPortTemplateBulkEditForm(BootstrapMixin, BulkEditForm):
17031701
required=False,
17041702
widget=StaticSelect2()
17051703
)
1706-
color = forms.CharField(
1707-
max_length=6, # RGB color code
1708-
required=False,
1709-
widget=ColorSelect()
1704+
color = ColorField(
1705+
required=False
17101706
)
17111707
description = forms.CharField(
17121708
required=False
@@ -1734,10 +1730,8 @@ class RearPortTemplateCreateForm(ComponentTemplateCreateForm):
17341730
choices=PortTypeChoices,
17351731
widget=StaticSelect2(),
17361732
)
1737-
color = forms.CharField(
1738-
max_length=6, # RGB color code
1739-
required=False,
1740-
widget=ColorSelect()
1733+
color = ColorField(
1734+
required=False
17411735
)
17421736
positions = forms.IntegerField(
17431737
min_value=REARPORT_POSITIONS_MIN,
@@ -1764,10 +1758,8 @@ class RearPortTemplateBulkEditForm(BootstrapMixin, BulkEditForm):
17641758
required=False,
17651759
widget=StaticSelect2()
17661760
)
1767-
color = forms.CharField(
1768-
max_length=6, # RGB color code
1769-
required=False,
1770-
widget=ColorSelect()
1761+
color = ColorField(
1762+
required=False
17711763
)
17721764
description = forms.CharField(
17731765
required=False
@@ -1958,10 +1950,8 @@ class DeviceRoleBulkEditForm(BootstrapMixin, CustomFieldBulkEditForm):
19581950
queryset=DeviceRole.objects.all(),
19591951
widget=forms.MultipleHiddenInput
19601952
)
1961-
color = forms.CharField(
1962-
max_length=6, # RGB color code
1963-
required=False,
1964-
widget=ColorSelect()
1953+
color = ColorField(
1954+
required=False
19651955
)
19661956
vm_role = forms.NullBooleanField(
19671957
required=False,
@@ -3454,10 +3444,8 @@ class FrontPortFilterForm(DeviceComponentFilterForm):
34543444
required=False,
34553445
widget=StaticSelect2Multiple()
34563446
)
3457-
color = forms.CharField(
3458-
max_length=6, # RGB color code
3459-
required=False,
3460-
widget=ColorSelect()
3447+
color = ColorField(
3448+
required=False
34613449
)
34623450
tag = TagFilterField(model)
34633451

@@ -3497,10 +3485,8 @@ class FrontPortCreateForm(ComponentCreateForm):
34973485
choices=PortTypeChoices,
34983486
widget=StaticSelect2(),
34993487
)
3500-
color = forms.CharField(
3501-
max_length=6, # RGB color code
3502-
required=False,
3503-
widget=ColorSelect()
3488+
color = ColorField(
3489+
required=False
35043490
)
35053491
rear_port_set = forms.MultipleChoiceField(
35063492
choices=[],
@@ -3646,10 +3632,8 @@ class RearPortFilterForm(DeviceComponentFilterForm):
36463632
required=False,
36473633
widget=StaticSelect2Multiple()
36483634
)
3649-
color = forms.CharField(
3650-
max_length=6, # RGB color code
3651-
required=False,
3652-
widget=ColorSelect()
3635+
color = ColorField(
3636+
required=False
36533637
)
36543638
tag = TagFilterField(model)
36553639

@@ -3677,10 +3661,8 @@ class RearPortCreateForm(ComponentCreateForm):
36773661
choices=PortTypeChoices,
36783662
widget=StaticSelect2(),
36793663
)
3680-
color = forms.CharField(
3681-
max_length=6, # RGB color code
3682-
required=False,
3683-
widget=ColorSelect()
3664+
color = ColorField(
3665+
required=False
36843666
)
36853667
positions = forms.IntegerField(
36863668
min_value=REARPORT_POSITIONS_MIN,
@@ -4411,10 +4393,8 @@ class CableBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditFo
44114393
max_length=100,
44124394
required=False
44134395
)
4414-
color = forms.CharField(
4415-
max_length=6, # RGB color code
4416-
required=False,
4417-
widget=ColorSelect()
4396+
color = ColorField(
4397+
required=False
44184398
)
44194399
length = forms.IntegerField(
44204400
min_value=1,
@@ -4489,10 +4469,8 @@ class CableFilterForm(BootstrapMixin, CustomFieldFilterForm):
44894469
choices=add_blank_choice(CableStatusChoices),
44904470
widget=StaticSelect2()
44914471
)
4492-
color = forms.CharField(
4493-
max_length=6, # RGB color code
4494-
required=False,
4495-
widget=ColorSelect()
4472+
color = ColorField(
4473+
required=False
44964474
)
44974475
device_id = DynamicModelMultipleChoiceField(
44984476
queryset=Device.objects.all(),

netbox/extras/forms.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from dcim.models import DeviceRole, DeviceType, Platform, Region, Site, SiteGroup
88
from tenancy.models import Tenant, TenantGroup
99
from utilities.forms import (
10-
add_blank_choice, APISelectMultiple, BootstrapMixin, BulkEditForm, BulkEditNullBooleanSelect, ColorSelect,
10+
add_blank_choice, APISelectMultiple, BootstrapMixin, BulkEditForm, BulkEditNullBooleanSelect, ColorField,
1111
CommentField, ContentTypeMultipleChoiceField, CSVModelForm, DateTimePicker, DynamicModelMultipleChoiceField,
1212
JSONField, SlugField, StaticSelect2, BOOLEAN_WITH_BLANK_CHOICES,
1313
)
@@ -194,10 +194,8 @@ class TagBulkEditForm(BootstrapMixin, BulkEditForm):
194194
queryset=Tag.objects.all(),
195195
widget=forms.MultipleHiddenInput
196196
)
197-
color = forms.CharField(
198-
max_length=6,
199-
required=False,
200-
widget=ColorSelect()
197+
color = ColorField(
198+
required=False
201199
)
202200
description = forms.CharField(
203201
max_length=200,

netbox/utilities/forms/fields.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from .utils import expand_alphanumeric_pattern, expand_ipaddress_pattern
2121

2222
__all__ = (
23+
'ColorField',
2324
'CommentField',
2425
'ContentTypeChoiceField',
2526
'ContentTypeMultipleChoiceField',
@@ -69,6 +70,13 @@ def __init__(self, slug_source='name', *args, **kwargs):
6970
self.widget.attrs['slug-source'] = slug_source
7071

7172

73+
class ColorField(forms.CharField):
74+
"""
75+
A field which represents a color in hexadecimal RRGGBB format.
76+
"""
77+
widget = widgets.ColorSelect
78+
79+
7280
class TagFilterField(forms.MultipleChoiceField):
7381
"""
7482
A filter field for the tags of a model. Only the tags used by a model are displayed.

0 commit comments

Comments
 (0)