diff --git a/netbox/extras/forms/bulk_edit.py b/netbox/extras/forms/bulk_edit.py index c0a210e42..9cbfbae32 100644 --- a/netbox/extras/forms/bulk_edit.py +++ b/netbox/extras/forms/bulk_edit.py @@ -76,11 +76,11 @@ class CustomFieldBulkEditForm(ChangelogMessageMixin, BulkEditForm): required=False, widget=BulkEditNullBooleanSelect() ) - validation_minimum = forms.IntegerField( + validation_minimum = forms.DecimalField( label=_('Minimum value'), required=False, ) - validation_maximum = forms.IntegerField( + validation_maximum = forms.DecimalField( label=_('Maximum value'), required=False, ) diff --git a/netbox/extras/forms/filtersets.py b/netbox/extras/forms/filtersets.py index 675315bed..85a043f3e 100644 --- a/netbox/extras/forms/filtersets.py +++ b/netbox/extras/forms/filtersets.py @@ -103,11 +103,11 @@ class CustomFieldFilterForm(SavedFiltersMixin, FilterForm): choices=BOOLEAN_WITH_BLANK_CHOICES ) ) - validation_minimum = forms.IntegerField( + validation_minimum = forms.DecimalField( label=_('Minimum value'), required=False ) - validation_maximum = forms.IntegerField( + validation_maximum = forms.DecimalField( label=_('Maximum value'), required=False ) diff --git a/netbox/extras/graphql/filters.py b/netbox/extras/graphql/filters.py index dda9d947b..e7d5ef573 100644 --- a/netbox/extras/graphql/filters.py +++ b/netbox/extras/graphql/filters.py @@ -17,7 +17,7 @@ if TYPE_CHECKING: ) from tenancy.graphql.filters import TenantFilter, TenantGroupFilter from netbox.graphql.enums import ColorEnum - from netbox.graphql.filter_lookups import IntegerLookup, JSONFilter, StringArrayLookup, TreeNodeFilter + from netbox.graphql.filter_lookups import FloatLookup, IntegerLookup, JSONFilter, StringArrayLookup, TreeNodeFilter from users.graphql.filters import GroupFilter, UserFilter from virtualization.graphql.filters import ClusterFilter, ClusterGroupFilter, ClusterTypeFilter from .enums import * @@ -151,10 +151,10 @@ class CustomFieldFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin): weight: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = ( strawberry_django.filter_field() ) - validation_minimum: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = ( + validation_minimum: Annotated['FloatLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = ( strawberry_django.filter_field() ) - validation_maximum: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = ( + validation_maximum: Annotated['FloatLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = ( strawberry_django.filter_field() ) validation_regex: FilterLookup[str] | None = strawberry_django.filter_field() diff --git a/netbox/extras/migrations/0133_make_cf_minmax_decimal.py b/netbox/extras/migrations/0133_make_cf_minmax_decimal.py new file mode 100644 index 000000000..6ab7d25ea --- /dev/null +++ b/netbox/extras/migrations/0133_make_cf_minmax_decimal.py @@ -0,0 +1,21 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('extras', '0132_configcontextprofile'), + ] + + operations = [ + migrations.AlterField( + model_name='customfield', + name='validation_maximum', + field=models.DecimalField(blank=True, decimal_places=4, max_digits=16, null=True), + ), + migrations.AlterField( + model_name='customfield', + name='validation_minimum', + field=models.DecimalField(blank=True, decimal_places=4, max_digits=16, null=True), + ), + ] diff --git a/netbox/extras/models/customfields.py b/netbox/extras/models/customfields.py index caf113f97..33ddc16ac 100644 --- a/netbox/extras/models/customfields.py +++ b/netbox/extras/models/customfields.py @@ -174,13 +174,17 @@ class CustomField(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): verbose_name=_('display weight'), help_text=_('Fields with higher weights appear lower in a form.') ) - validation_minimum = models.BigIntegerField( + validation_minimum = models.DecimalField( + max_digits=16, + decimal_places=4, blank=True, null=True, verbose_name=_('minimum value'), help_text=_('Minimum allowed value (for numeric fields)') ) - validation_maximum = models.BigIntegerField( + validation_maximum = models.DecimalField( + max_digits=16, + decimal_places=4, blank=True, null=True, verbose_name=_('maximum value'), @@ -471,7 +475,7 @@ class CustomField(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): field = forms.DecimalField( required=required, initial=initial, - max_digits=12, + max_digits=16, decimal_places=4, min_value=self.validation_minimum, max_value=self.validation_maximum