Преглед на файлове

Fixes #19415: Increased Circuit/WirelessLink distance upper limit (#19495)

* Fixes #19415: Increased Circuit/WirelessLink absolute distance upper limit

Also adds form validation that provides a useful message to the user
rather than a 500 error with potentially little information.

* Include forgotten migration files

* Remove unnecessary comments

* Remove more unnecessary comments

* Addresses PR feedback

* Gah, remove django migration header comment

* Clean up new has_field_errors mechanism, fix issue with ObjectAttribute

* Address PR feedback, revert changes to render_fieldset template tag
Jason Novinger преди 9 месеца
родител
ревизия
a2a8779ebc

+ 2 - 1
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(),

+ 16 - 0
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),
+        ),
+    ]

+ 3 - 2
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

+ 13 - 0
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)),
+        ]
+    )

+ 5 - 0
netbox/utilities/templates/form_helpers/render_fieldset.html

@@ -31,6 +31,11 @@
           <div class="col mb-1">
             {{ field }}
             <div class="form-text">{% trans field.label %}</div>
+            {% if field.errors %}
+              <div class="form-text text-danger">
+                {% for error in field.errors %}{{ error }}{% if not forloop.last %}<br />{% endif %}{% endfor %}
+              </div>
+            {% endif %}
           </div>
         {% endfor %}
       </div>

+ 2 - 1
netbox/wireless/forms/model_forms.py

@@ -7,6 +7,7 @@ from ipam.models import VLAN
 from netbox.forms import NetBoxModelForm
 from tenancy.forms import TenancyForm
 from utilities.forms.fields import CommentField, DynamicModelChoiceField, SlugField
+from utilities.forms.mixins import DistanceValidationMixin
 from utilities.forms.rendering import FieldSet, InlineFields
 from wireless.models import *
 
@@ -73,7 +74,7 @@ class WirelessLANForm(ScopedForm, TenancyForm, NetBoxModelForm):
         }
 
 
-class WirelessLinkForm(TenancyForm, NetBoxModelForm):
+class WirelessLinkForm(DistanceValidationMixin, TenancyForm, NetBoxModelForm):
     site_a = DynamicModelChoiceField(
         queryset=Site.objects.all(),
         required=False,

+ 16 - 0
netbox/wireless/migrations/0015_extend_wireless_link_abs_distance_upper_limit.py

@@ -0,0 +1,16 @@
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('wireless', '0014_wirelesslangroup_comments'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='wirelesslink',
+            name='_abs_distance',
+            field=models.DecimalField(blank=True, decimal_places=4, max_digits=13, null=True),
+        ),
+    ]