Add free-text search filter for Examination in CaseFilter to improve searchability

This commit is contained in:
Ross
2026-02-02 13:56:31 +00:00
parent 1066a3fb9f
commit 42163448bf
+33
View File
@@ -106,6 +106,9 @@ class CaseFilter(django_filters.FilterSet):
queryset=lambda request: __import__('generic.models', fromlist=['Examination']).Examination.objects.filter(atlas_series_examination__isnull=False).distinct(),
label='Examination',
)
# Free-text search to help find the correct examination when there are
# many similarly-named Series/Examination entries.
examination_text = django_filters.CharFilter(method='filter_examination_text', label='Examination (text)')
differential_case = django_filters.ModelMultipleChoiceFilter(
label="Differential",
field_name="differentialcase__condition",
@@ -140,6 +143,36 @@ class CaseFilter(django_filters.FilterSet):
)
pass
def filter_examination_text(self, queryset, name, value):
"""Filter Cases by a text search on related Examination records.
Matches against the Examination string representation and any
common identifying fields (name/code). Uses a case-insensitive
contains lookup and filters Cases which have a Series linked to
a matching Examination.
"""
if not value:
return queryset
from generic.models import Examination
# Only attempt to match PK when the provided value looks like an integer
try:
pk_val = int(value)
except Exception:
pk_val = None
if pk_val is not None:
matches = Examination.objects.filter(
Q(examination__icontains=value) | Q(pk=pk_val)
).distinct()
else:
matches = Examination.objects.filter(
Q(examination__icontains=value)
).distinct()
return queryset.filter(series__examination__in=matches).distinct()
class SeriesFilter(django_filters.FilterSet):
case = django_filters.ModelMultipleChoiceFilter(