diff --git a/netbox/circuits/forms/model_forms.py b/netbox/circuits/forms/model_forms.py index 6f8ab783d..ce09862ae 100644 --- a/netbox/circuits/forms/model_forms.py +++ b/netbox/circuits/forms/model_forms.py @@ -16,6 +16,7 @@ from utilities.forms import get_field_value from utilities.forms.fields import ( CommentField, ContentTypeChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, SlugField, ) +from utilities.forms.mixins import DistanceValidationMixin from utilities.forms.rendering import FieldSet, InlineFields from utilities.forms.widgets import DatePicker, HTMXSelect, NumberWithOptions from utilities.templatetags.builtins.filters import bettertitle @@ -105,7 +106,7 @@ class CircuitTypeForm(NetBoxModelForm): ] -class CircuitForm(TenancyForm, NetBoxModelForm): +class CircuitForm(DistanceValidationMixin, TenancyForm, NetBoxModelForm): provider = DynamicModelChoiceField( label=_('Provider'), queryset=Provider.objects.all(), diff --git a/netbox/circuits/migrations/0052_extend_circuit_abs_distance_upper_limit.py b/netbox/circuits/migrations/0052_extend_circuit_abs_distance_upper_limit.py new file mode 100644 index 000000000..abc54f627 --- /dev/null +++ b/netbox/circuits/migrations/0052_extend_circuit_abs_distance_upper_limit.py @@ -0,0 +1,16 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('circuits', '0051_virtualcircuit_group_assignment'), + ] + + operations = [ + migrations.AlterField( + model_name='circuit', + name='_abs_distance', + field=models.DecimalField(blank=True, decimal_places=4, max_digits=13, null=True), + ), + ] diff --git a/netbox/netbox/models/mixins.py b/netbox/netbox/models/mixins.py index dc706c7c2..13af8aaf5 100644 --- a/netbox/netbox/models/mixins.py +++ b/netbox/netbox/models/mixins.py @@ -1,6 +1,7 @@ from django.core.exceptions import ValidationError from django.db import models from django.utils.translation import gettext_lazy as _ + from netbox.choices import * from utilities.conversion import to_grams, to_meters @@ -58,7 +59,7 @@ class DistanceMixin(models.Model): max_digits=8, decimal_places=2, blank=True, - null=True + null=True, ) distance_unit = models.CharField( verbose_name=_('distance unit'), @@ -69,7 +70,7 @@ class DistanceMixin(models.Model): ) # Stores the normalized distance (in meters) for database ordering _abs_distance = models.DecimalField( - max_digits=10, + max_digits=13, decimal_places=4, blank=True, null=True diff --git a/netbox/utilities/forms/mixins.py b/netbox/utilities/forms/mixins.py index e89fbb520..ca0f64e54 100644 --- a/netbox/utilities/forms/mixins.py +++ b/netbox/utilities/forms/mixins.py @@ -1,10 +1,13 @@ import time +from decimal import Decimal from django import forms +from django.core.validators import MaxValueValidator, MinValueValidator from django.utils.translation import gettext_lazy as _ __all__ = ( 'CheckLastUpdatedMixin', + 'DistanceValidationMixin', ) @@ -44,3 +47,13 @@ class CheckLastUpdatedMixin(forms.Form): "This object has been modified since the form was rendered. Please consult the object's change " "log for details." )) + + +class DistanceValidationMixin(forms.Form): + distance = forms.DecimalField( + required=False, + validators=[ + MinValueValidator(Decimal(0)), + MaxValueValidator(Decimal(100000)), + ] + ) diff --git a/netbox/utilities/templates/form_helpers/render_fieldset.html b/netbox/utilities/templates/form_helpers/render_fieldset.html index ae8252b97..1821a3cb7 100644 --- a/netbox/utilities/templates/form_helpers/render_fieldset.html +++ b/netbox/utilities/templates/form_helpers/render_fieldset.html @@ -31,6 +31,11 @@