Refactor NormalCase model to use age_days instead of age_years, update forms, filters, and templates accordingly for improved age handling

This commit is contained in:
Ross
2025-11-13 22:34:36 +00:00
parent 8da2dd27da
commit a2e9d5e681
9 changed files with 182 additions and 43 deletions
+22 -26
View File
@@ -239,9 +239,15 @@ class CaseCollectionForm(ModelForm):
class NormalCaseForm(ModelForm):
# Keep non-model input fields for age entry so users can provide a
# value + unit (e.g. 6 months) which will be converted to canonical
# days on save. The model now stores only `age_days`.
age_value = forms.IntegerField(required=False, min_value=0)
age_unit = forms.ChoiceField(required=False, choices=NormalCase.AGE_UNIT_CHOICES)
class Meta:
model = NormalCase
fields = ("age_years", "examination", "modality", "notes")
fields = ("examination", "modality", "notes")
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
@@ -255,42 +261,32 @@ class NormalCaseForm(ModelForm):
self.helper.form_tag = False
self.helper.layout = Layout(
Div(
Field("age_years", wrapper_class="col-md-4"),
Field("examination", wrapper_class="col-md-4"),
Field("modality", wrapper_class="col-md-4"),
Field("age_value", wrapper_class="col-md-3"),
Field("age_unit", wrapper_class="col-md-3"),
Field("examination", wrapper_class="col-md-3"),
Field("modality", wrapper_class="col-md-3"),
css_class="row",
),
Field("notes"),
Submit("submit", "Save", css_class="btn btn-primary"),
)
self.fields["start_date"] = SplitDateTimeFieldDefaultTime(
widget=SplitDateTimeWidget(
date_attrs={"type": "date", "class": "datepicker"},
time_attrs={"type": "time", "class": "timepicker"},
date_format="%Y-%m-%d",
time_format="%H:%M",
),
required=False,
help_text="The date the exam is due to start (time is optional)",
)
self.fields["end_date"] = SplitDateTimeFieldDefaultTimeEnd(
widget=SplitDateTimeWidget(
date_attrs={"type": "date", "class": "datepicker"},
time_attrs={"type": "time", "class": "timepicker"},
date_format="%Y-%m-%d",
time_format="%H:%M",
),
required=False,
help_text="The date the exam is due to start (time is optional)",
)
def save(self, commit=True):
# Respect the commit flag: return an unsaved instance if commit=False
# Respect commit flag. Compute canonical `age_days` from the
# provided age_value/age_unit and set it on the instance.
instance = super().save(commit=False)
age_value = self.cleaned_data.get("age_value")
age_unit = self.cleaned_data.get("age_unit")
if age_value is not None and age_unit:
instance.age_days = NormalCase.to_days(age_value, age_unit)
else:
# If the user left fields blank, clear any previous value.
instance.age_days = None
if commit:
instance.save()
self.save_m2m()
return instance