From 42163448bfa4041534572150cabff26190a8824b Mon Sep 17 00:00:00 2001 From: Ross Date: Mon, 2 Feb 2026 13:56:31 +0000 Subject: [PATCH] Add free-text search filter for Examination in CaseFilter to improve searchability --- atlas/filters.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/atlas/filters.py b/atlas/filters.py index c4be9c70..eace4288 100755 --- a/atlas/filters.py +++ b/atlas/filters.py @@ -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(