From b4e15b6730b4b9d316ac6b22a9ad6951e9af5fab Mon Sep 17 00:00:00 2001 From: Jason Novinger Date: Fri, 16 May 2025 10:02:38 -0500 Subject: [PATCH] Addresses PR feedback --- ...xtend_circuit_abs_distance_upper_limit.py} | 9 ++--- netbox/netbox/models/mixins.py | 7 ++-- netbox/utilities/forms/mixins.py | 38 +++++-------------- .../form_helpers/render_fieldset.html | 11 ++++-- netbox/utilities/templatetags/form_helpers.py | 7 ++-- ...wireless_link_abs_distance_upper_limit.py} | 9 ++--- 6 files changed, 31 insertions(+), 50 deletions(-) rename netbox/circuits/migrations/{0052_alter_circuit__abs_distance_alter_circuit_distance.py => 0052_extend_circuit_abs_distance_upper_limit.py} (61%) rename netbox/wireless/migrations/{0015_alter_wirelesslink__abs_distance_and_more.py => 0015_extend_wireless_link_abs_distance_upper_limit.py} (61%) diff --git a/netbox/circuits/migrations/0052_alter_circuit__abs_distance_alter_circuit_distance.py b/netbox/circuits/migrations/0052_extend_circuit_abs_distance_upper_limit.py similarity index 61% rename from netbox/circuits/migrations/0052_alter_circuit__abs_distance_alter_circuit_distance.py rename to netbox/circuits/migrations/0052_extend_circuit_abs_distance_upper_limit.py index f5e3c3337..eba606b03 100644 --- a/netbox/circuits/migrations/0052_alter_circuit__abs_distance_alter_circuit_distance.py +++ b/netbox/circuits/migrations/0052_extend_circuit_abs_distance_upper_limit.py @@ -1,3 +1,5 @@ +# Generated by Django 5.2.1 on 2025-05-16 14:42 + from django.db import migrations, models @@ -11,11 +13,6 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='circuit', name='_abs_distance', - field=models.DecimalField(blank=True, decimal_places=4, max_digits=18, null=True), - ), - migrations.AlterField( - model_name='circuit', - name='distance', - field=models.DecimalField(blank=True, decimal_places=2, max_digits=16, null=True), + 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 9f2c3ca6d..46a85b126 100644 --- a/netbox/netbox/models/mixins.py +++ b/netbox/netbox/models/mixins.py @@ -1,3 +1,4 @@ + from django.core.exceptions import ValidationError from django.db import models from django.utils.translation import gettext_lazy as _ @@ -55,10 +56,10 @@ class WeightMixin(models.Model): class DistanceMixin(models.Model): distance = models.DecimalField( verbose_name=_('distance'), - max_digits=16, + 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=18, + 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 ab90fbe16..058681060 100644 --- a/netbox/utilities/forms/mixins.py +++ b/netbox/utilities/forms/mixins.py @@ -1,10 +1,10 @@ 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 _ -from utilities.conversion import to_meters - __all__ = ( 'CheckLastUpdatedMixin', ) @@ -49,30 +49,10 @@ class CheckLastUpdatedMixin(forms.Form): class DistanceValidationMixin(forms.Form): - def clean(self): - super().clean() - - distance = self.cleaned_data.get('distance', None) - unit = self.cleaned_data.get('distance_unit', None) - if distance and unit: - model_class = self._meta.model - distance_field = model_class._meta.get_field('distance') - max_digits = distance_field.max_digits - distance_field.decimal_places - max_distance = 10 ** max_digits - - abs_distance = to_meters(distance, unit) - - if abs_distance > max_distance: - raise forms.ValidationError(_( - "{distance} {unit} ({abs_distance} m) exceeds the maximum allowed distance for " - "{model._meta.verbose_name} distance. Distance must normalize to no more than " - "{max_distance} meters.".format( - distance=distance, - unit=unit, - abs_distance=abs_distance, - model=model_class, - max_distance=max_distance - ) - )) - - self.cleaned_data['_abs_distance'] = abs_distance + 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..0faf23c92 100644 --- a/netbox/utilities/templates/form_helpers/render_fieldset.html +++ b/netbox/utilities/templates/form_helpers/render_fieldset.html @@ -6,7 +6,7 @@

{{ heading }}

{% endif %} - {% for layout, title, items in rows %} + {% for layout, title, items, has_errors in rows %} {% if layout == 'field' %} {# Single form field #} @@ -25,12 +25,17 @@ {% elif layout == 'inline' %} {# Multiple form fields on the same line #} -
+
{% for field in items %} -
+
{{ field }}
{% trans field.label %}
+ {% if field.errors %} +
+ {% for error in field.errors %}{{ error }}{% if not forloop.last %}
{% endif %}{% endfor %} +
+ {% endif %}
{% endfor %}
diff --git a/netbox/utilities/templatetags/form_helpers.py b/netbox/utilities/templatetags/form_helpers.py index ec53fe97c..9c90a0a37 100644 --- a/netbox/utilities/templatetags/form_helpers.py +++ b/netbox/utilities/templatetags/form_helpers.py @@ -53,6 +53,7 @@ def render_fieldset(form, fieldset): Render a group set of fields. """ rows = [] + for item in fieldset.items: # Multiple fields side-by-side @@ -61,7 +62,7 @@ def render_fieldset(form, fieldset): form[name] for name in item.fields if name in form.fields ] rows.append( - ('inline', item.label, fields) + ('inline', item.label, fields, any(f.errors for f in fields)) ) # Tabbed groups of fields @@ -78,7 +79,7 @@ def render_fieldset(form, fieldset): if not any(tab['active'] for tab in tabs): tabs[0]['active'] = True rows.append( - ('tabs', None, tabs) + ('tabs', None, tabs, False) ) elif type(item) is ObjectAttribute: @@ -95,7 +96,7 @@ def render_fieldset(form, fieldset): if field.name in getattr(form, 'nullable_fields', []): field._nullable = True rows.append( - ('field', None, [field]) + ('field', None, [field], False) ) return { diff --git a/netbox/wireless/migrations/0015_alter_wirelesslink__abs_distance_and_more.py b/netbox/wireless/migrations/0015_extend_wireless_link_abs_distance_upper_limit.py similarity index 61% rename from netbox/wireless/migrations/0015_alter_wirelesslink__abs_distance_and_more.py rename to netbox/wireless/migrations/0015_extend_wireless_link_abs_distance_upper_limit.py index a4709df81..1d8d9a7ed 100644 --- a/netbox/wireless/migrations/0015_alter_wirelesslink__abs_distance_and_more.py +++ b/netbox/wireless/migrations/0015_extend_wireless_link_abs_distance_upper_limit.py @@ -1,3 +1,5 @@ +# Generated by Django 5.2.1 on 2025-05-16 14:42 + from django.db import migrations, models @@ -11,11 +13,6 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='wirelesslink', name='_abs_distance', - field=models.DecimalField(blank=True, decimal_places=4, max_digits=18, null=True), - ), - migrations.AlterField( - model_name='wirelesslink', - name='distance', - field=models.DecimalField(blank=True, decimal_places=2, max_digits=16, null=True), + field=models.DecimalField(blank=True, decimal_places=4, max_digits=13, null=True), ), ]