Skip to content

Commit a2a8779

Browse files
authored
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
1 parent 03ff535 commit a2a8779

File tree

7 files changed

+57
-4
lines changed

7 files changed

+57
-4
lines changed

netbox/circuits/forms/model_forms.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from utilities.forms.fields import (
1717
CommentField, ContentTypeChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, SlugField,
1818
)
19+
from utilities.forms.mixins import DistanceValidationMixin
1920
from utilities.forms.rendering import FieldSet, InlineFields
2021
from utilities.forms.widgets import DatePicker, HTMXSelect, NumberWithOptions
2122
from utilities.templatetags.builtins.filters import bettertitle
@@ -105,7 +106,7 @@ class Meta:
105106
]
106107

107108

108-
class CircuitForm(TenancyForm, NetBoxModelForm):
109+
class CircuitForm(DistanceValidationMixin, TenancyForm, NetBoxModelForm):
109110
provider = DynamicModelChoiceField(
110111
label=_('Provider'),
111112
queryset=Provider.objects.all(),
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from django.db import migrations, models
2+
3+
4+
class Migration(migrations.Migration):
5+
6+
dependencies = [
7+
('circuits', '0051_virtualcircuit_group_assignment'),
8+
]
9+
10+
operations = [
11+
migrations.AlterField(
12+
model_name='circuit',
13+
name='_abs_distance',
14+
field=models.DecimalField(blank=True, decimal_places=4, max_digits=13, null=True),
15+
),
16+
]

netbox/netbox/models/mixins.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from django.core.exceptions import ValidationError
22
from django.db import models
33
from django.utils.translation import gettext_lazy as _
4+
45
from netbox.choices import *
56
from utilities.conversion import to_grams, to_meters
67

@@ -58,7 +59,7 @@ class DistanceMixin(models.Model):
5859
max_digits=8,
5960
decimal_places=2,
6061
blank=True,
61-
null=True
62+
null=True,
6263
)
6364
distance_unit = models.CharField(
6465
verbose_name=_('distance unit'),
@@ -69,7 +70,7 @@ class DistanceMixin(models.Model):
6970
)
7071
# Stores the normalized distance (in meters) for database ordering
7172
_abs_distance = models.DecimalField(
72-
max_digits=10,
73+
max_digits=13,
7374
decimal_places=4,
7475
blank=True,
7576
null=True

netbox/utilities/forms/mixins.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
import time
2+
from decimal import Decimal
23

34
from django import forms
5+
from django.core.validators import MaxValueValidator, MinValueValidator
46
from django.utils.translation import gettext_lazy as _
57

68
__all__ = (
79
'CheckLastUpdatedMixin',
10+
'DistanceValidationMixin',
811
)
912

1013

@@ -44,3 +47,13 @@ def clean(self):
4447
"This object has been modified since the form was rendered. Please consult the object's change "
4548
"log for details."
4649
))
50+
51+
52+
class DistanceValidationMixin(forms.Form):
53+
distance = forms.DecimalField(
54+
required=False,
55+
validators=[
56+
MinValueValidator(Decimal(0)),
57+
MaxValueValidator(Decimal(100000)),
58+
]
59+
)

netbox/utilities/templates/form_helpers/render_fieldset.html

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ <h2 class="col-9 offset-3">{{ heading }}</h2>
3131
<div class="col mb-1">
3232
{{ field }}
3333
<div class="form-text">{% trans field.label %}</div>
34+
{% if field.errors %}
35+
<div class="form-text text-danger">
36+
{% for error in field.errors %}{{ error }}{% if not forloop.last %}<br />{% endif %}{% endfor %}
37+
</div>
38+
{% endif %}
3439
</div>
3540
{% endfor %}
3641
</div>

netbox/wireless/forms/model_forms.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from netbox.forms import NetBoxModelForm
88
from tenancy.forms import TenancyForm
99
from utilities.forms.fields import CommentField, DynamicModelChoiceField, SlugField
10+
from utilities.forms.mixins import DistanceValidationMixin
1011
from utilities.forms.rendering import FieldSet, InlineFields
1112
from wireless.models import *
1213

@@ -73,7 +74,7 @@ class Meta:
7374
}
7475

7576

76-
class WirelessLinkForm(TenancyForm, NetBoxModelForm):
77+
class WirelessLinkForm(DistanceValidationMixin, TenancyForm, NetBoxModelForm):
7778
site_a = DynamicModelChoiceField(
7879
queryset=Site.objects.all(),
7980
required=False,
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from django.db import migrations, models
2+
3+
4+
class Migration(migrations.Migration):
5+
6+
dependencies = [
7+
('wireless', '0014_wirelesslangroup_comments'),
8+
]
9+
10+
operations = [
11+
migrations.AlterField(
12+
model_name='wirelesslink',
13+
name='_abs_distance',
14+
field=models.DecimalField(blank=True, decimal_places=4, max_digits=13, null=True),
15+
),
16+
]

0 commit comments

Comments
 (0)