Addresses PR feedback

This commit is contained in:
Jason Novinger 2025-05-16 10:02:38 -05:00
parent 18b7a3187a
commit b4e15b6730
6 changed files with 31 additions and 50 deletions

View File

@ -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),
),
]

View File

@ -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

View File

@ -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)),
]
)

View File

@ -6,7 +6,7 @@
<h2 class="col-9 offset-3">{{ heading }}</h2>
</div>
{% 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 #}
<div class="row mb-3">
<div class="row mb-3 {% if has_errors %} has-errors{% endif %}">
<label class="col col-3 col-form-label text-lg-end">{{ title|default:'' }}</label>
{% for field in items %}
<div class="col mb-1">
<div class="col mb-1 {% if field.errors %} has-errors{% endif %}">
{{ 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>

View File

@ -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 {

View File

@ -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),
),
]