diff --git a/netbox/extras/forms/bulk_edit.py b/netbox/extras/forms/bulk_edit.py index dea07783c..acb564b30 100644 --- a/netbox/extras/forms/bulk_edit.py +++ b/netbox/extras/forms/bulk_edit.py @@ -6,6 +6,7 @@ from extras.models import * from netbox.forms import NetBoxModelBulkEditForm from utilities.forms import BulkEditForm, add_blank_choice from utilities.forms.fields import ColorField, CommentField, DynamicModelChoiceField +from utilities.forms.rendering import FieldSet from utilities.forms.widgets import BulkEditNullBooleanSelect __all__ = ( @@ -64,6 +65,18 @@ class CustomFieldBulkEditForm(BulkEditForm): required=False, widget=BulkEditNullBooleanSelect() ) + validation_minimum = forms.IntegerField( + label=_('Minimum value'), + required=False, + ) + validation_maximum = forms.IntegerField( + label=_('Maximum value'), + required=False, + ) + validation_regex = forms.CharField( + label=_('Validation regex'), + required=False + ) validation_unique = forms.NullBooleanField( label=_('Must be unique'), required=False, @@ -71,6 +84,13 @@ class CustomFieldBulkEditForm(BulkEditForm): ) comments = CommentField() + fieldsets = ( + FieldSet('group_name', 'description', 'weight', 'choice_set', name=_('Attributes')), + FieldSet('ui_visible', 'ui_editable', 'is_cloneable', name=_('Behavior')), + FieldSet( + 'validation_minimum', 'validation_maximum', 'validation_regex', 'validation_unique', name=_('Validation') + ), + ) nullable_fields = ('group_name', 'description', 'choice_set') diff --git a/netbox/extras/forms/filtersets.py b/netbox/extras/forms/filtersets.py index e8039718d..e29fd549d 100644 --- a/netbox/extras/forms/filtersets.py +++ b/netbox/extras/forms/filtersets.py @@ -41,7 +41,9 @@ class CustomFieldFilterForm(SavedFiltersMixin, FilterForm): 'type', 'related_object_type_id', 'group_name', 'weight', 'required', 'choice_set_id', 'ui_visible', 'ui_editable', 'is_cloneable', name=_('Attributes') ), - FieldSet('validation_unique', name=_('Validation')), + FieldSet( + 'validation_minimum', 'validation_maximum', 'validation_regex', 'validation_unique', name=_('Validation') + ), ) related_object_type_id = ContentTypeMultipleChoiceField( queryset=ObjectType.objects.with_feature('custom_fields'), @@ -90,6 +92,18 @@ class CustomFieldFilterForm(SavedFiltersMixin, FilterForm): choices=BOOLEAN_WITH_BLANK_CHOICES ) ) + validation_minimum = forms.IntegerField( + label=_('Minimum value'), + required=False + ) + validation_maximum = forms.IntegerField( + label=_('Maximum value'), + required=False + ) + validation_regex = forms.CharField( + label=_('Validation regex'), + required=False + ) validation_unique = forms.NullBooleanField( label=_('Must be unique'), required=False, diff --git a/netbox/extras/tables/tables.py b/netbox/extras/tables/tables.py index 03174b444..ebf705ff5 100644 --- a/netbox/extras/tables/tables.py +++ b/netbox/extras/tables/tables.py @@ -71,6 +71,15 @@ class CustomFieldTable(NetBoxTable): is_cloneable = columns.BooleanColumn( verbose_name=_('Is Cloneable'), ) + validation_minimum = tables.Column( + verbose_name=_('Minimum Value'), + ) + validation_maximum = tables.Column( + verbose_name=_('Maximum Value'), + ) + validation_regex = tables.Column( + verbose_name=_('Validation Regex'), + ) validation_unique = columns.BooleanColumn( verbose_name=_('Validate Uniqueness'), ) @@ -80,7 +89,8 @@ class CustomFieldTable(NetBoxTable): fields = ( 'pk', 'id', 'name', 'object_types', 'label', 'type', 'related_object_type', 'group_name', 'required', 'default', 'description', 'search_weight', 'filter_logic', 'ui_visible', 'ui_editable', 'is_cloneable', - 'weight', 'choice_set', 'choices', 'validation_unique', 'comments', 'created', 'last_updated', + 'weight', 'choice_set', 'choices', 'validation_minimum', 'validation_maximum', 'validation_regex', + 'validation_unique', 'comments', 'created', 'last_updated', ) default_columns = ('pk', 'name', 'object_types', 'label', 'group_name', 'type', 'required', 'description')