Przeglądaj źródła

Introduce ColorField for consistent represention of color choice fields in forms

jeremystretch 4 lat temu
rodzic
commit
a1ba3b567c
3 zmienionych plików z 34 dodań i 50 usunięć
  1. 23 45
      netbox/dcim/forms.py
  2. 3 5
      netbox/extras/forms.py
  3. 8 0
      netbox/utilities/forms/fields.py

+ 23 - 45
netbox/dcim/forms.py

@@ -23,7 +23,7 @@ from tenancy.forms import TenancyFilterForm, TenancyForm
 from tenancy.models import Tenant
 from utilities.forms import (
     APISelect, APISelectMultiple, add_blank_choice, BootstrapMixin, BulkEditForm, BulkEditNullBooleanSelect,
-    ColorSelect, CommentField, CSVChoiceField, CSVContentTypeField, CSVModelChoiceField, CSVTypedChoiceField,
+    ColorField, CommentField, CSVChoiceField, CSVContentTypeField, CSVModelChoiceField, CSVTypedChoiceField,
     DynamicModelChoiceField, DynamicModelMultipleChoiceField, ExpandableNameField, form_from_model, JSONField,
     NumericArrayField, SelectWithPK, SmallTextarea, SlugField, StaticSelect2, StaticSelect2Multiple, TagFilterField,
     BOOLEAN_WITH_BLANK_CHOICES,
@@ -610,10 +610,8 @@ class RackRoleBulkEditForm(BootstrapMixin, CustomFieldBulkEditForm):
         queryset=RackRole.objects.all(),
         widget=forms.MultipleHiddenInput
     )
-    color = forms.CharField(
-        max_length=6,  # RGB color code
-        required=False,
-        widget=ColorSelect()
+    color = ColorField(
+        required=False
     )
     description = forms.CharField(
         max_length=200,
@@ -1703,10 +1701,8 @@ class FrontPortTemplateBulkEditForm(BootstrapMixin, BulkEditForm):
         required=False,
         widget=StaticSelect2()
     )
-    color = forms.CharField(
-        max_length=6,  # RGB color code
-        required=False,
-        widget=ColorSelect()
+    color = ColorField(
+        required=False
     )
     description = forms.CharField(
         required=False
@@ -1734,10 +1730,8 @@ class RearPortTemplateCreateForm(ComponentTemplateCreateForm):
         choices=PortTypeChoices,
         widget=StaticSelect2(),
     )
-    color = forms.CharField(
-        max_length=6,  # RGB color code
-        required=False,
-        widget=ColorSelect()
+    color = ColorField(
+        required=False
     )
     positions = forms.IntegerField(
         min_value=REARPORT_POSITIONS_MIN,
@@ -1764,10 +1758,8 @@ class RearPortTemplateBulkEditForm(BootstrapMixin, BulkEditForm):
         required=False,
         widget=StaticSelect2()
     )
-    color = forms.CharField(
-        max_length=6,  # RGB color code
-        required=False,
-        widget=ColorSelect()
+    color = ColorField(
+        required=False
     )
     description = forms.CharField(
         required=False
@@ -1958,10 +1950,8 @@ class DeviceRoleBulkEditForm(BootstrapMixin, CustomFieldBulkEditForm):
         queryset=DeviceRole.objects.all(),
         widget=forms.MultipleHiddenInput
     )
-    color = forms.CharField(
-        max_length=6,  # RGB color code
-        required=False,
-        widget=ColorSelect()
+    color = ColorField(
+        required=False
     )
     vm_role = forms.NullBooleanField(
         required=False,
@@ -3454,10 +3444,8 @@ class FrontPortFilterForm(DeviceComponentFilterForm):
         required=False,
         widget=StaticSelect2Multiple()
     )
-    color = forms.CharField(
-        max_length=6,  # RGB color code
-        required=False,
-        widget=ColorSelect()
+    color = ColorField(
+        required=False
     )
     tag = TagFilterField(model)
 
@@ -3497,10 +3485,8 @@ class FrontPortCreateForm(ComponentCreateForm):
         choices=PortTypeChoices,
         widget=StaticSelect2(),
     )
-    color = forms.CharField(
-        max_length=6,  # RGB color code
-        required=False,
-        widget=ColorSelect()
+    color = ColorField(
+        required=False
     )
     rear_port_set = forms.MultipleChoiceField(
         choices=[],
@@ -3646,10 +3632,8 @@ class RearPortFilterForm(DeviceComponentFilterForm):
         required=False,
         widget=StaticSelect2Multiple()
     )
-    color = forms.CharField(
-        max_length=6,  # RGB color code
-        required=False,
-        widget=ColorSelect()
+    color = ColorField(
+        required=False
     )
     tag = TagFilterField(model)
 
@@ -3677,10 +3661,8 @@ class RearPortCreateForm(ComponentCreateForm):
         choices=PortTypeChoices,
         widget=StaticSelect2(),
     )
-    color = forms.CharField(
-        max_length=6,  # RGB color code
-        required=False,
-        widget=ColorSelect()
+    color = ColorField(
+        required=False
     )
     positions = forms.IntegerField(
         min_value=REARPORT_POSITIONS_MIN,
@@ -4411,10 +4393,8 @@ class CableBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditFo
         max_length=100,
         required=False
     )
-    color = forms.CharField(
-        max_length=6,  # RGB color code
-        required=False,
-        widget=ColorSelect()
+    color = ColorField(
+        required=False
     )
     length = forms.IntegerField(
         min_value=1,
@@ -4489,10 +4469,8 @@ class CableFilterForm(BootstrapMixin, CustomFieldFilterForm):
         choices=add_blank_choice(CableStatusChoices),
         widget=StaticSelect2()
     )
-    color = forms.CharField(
-        max_length=6,  # RGB color code
-        required=False,
-        widget=ColorSelect()
+    color = ColorField(
+        required=False
     )
     device_id = DynamicModelMultipleChoiceField(
         queryset=Device.objects.all(),

+ 3 - 5
netbox/extras/forms.py

@@ -7,7 +7,7 @@ from django.utils.translation import gettext as _
 from dcim.models import DeviceRole, DeviceType, Platform, Region, Site, SiteGroup
 from tenancy.models import Tenant, TenantGroup
 from utilities.forms import (
-    add_blank_choice, APISelectMultiple, BootstrapMixin, BulkEditForm, BulkEditNullBooleanSelect, ColorSelect,
+    add_blank_choice, APISelectMultiple, BootstrapMixin, BulkEditForm, BulkEditNullBooleanSelect, ColorField,
     CommentField, ContentTypeMultipleChoiceField, CSVModelForm, DateTimePicker, DynamicModelMultipleChoiceField,
     JSONField, SlugField, StaticSelect2, BOOLEAN_WITH_BLANK_CHOICES,
 )
@@ -194,10 +194,8 @@ class TagBulkEditForm(BootstrapMixin, BulkEditForm):
         queryset=Tag.objects.all(),
         widget=forms.MultipleHiddenInput
     )
-    color = forms.CharField(
-        max_length=6,
-        required=False,
-        widget=ColorSelect()
+    color = ColorField(
+        required=False
     )
     description = forms.CharField(
         max_length=200,

+ 8 - 0
netbox/utilities/forms/fields.py

@@ -20,6 +20,7 @@ from .constants import *
 from .utils import expand_alphanumeric_pattern, expand_ipaddress_pattern
 
 __all__ = (
+    'ColorField',
     'CommentField',
     'ContentTypeChoiceField',
     'ContentTypeMultipleChoiceField',
@@ -69,6 +70,13 @@ class SlugField(forms.SlugField):
         self.widget.attrs['slug-source'] = slug_source
 
 
+class ColorField(forms.CharField):
+    """
+    A field which represents a color in hexadecimal RRGGBB format.
+    """
+    widget = widgets.ColorSelect
+
+
 class TagFilterField(forms.MultipleChoiceField):
     """
     A filter field for the tags of a model. Only the tags used by a model are displayed.