Add free-text search filter for Examination in CaseFilter to improve searchability
This commit is contained in:
@@ -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(),
|
queryset=lambda request: __import__('generic.models', fromlist=['Examination']).Examination.objects.filter(atlas_series_examination__isnull=False).distinct(),
|
||||||
label='Examination',
|
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(
|
differential_case = django_filters.ModelMultipleChoiceFilter(
|
||||||
label="Differential",
|
label="Differential",
|
||||||
field_name="differentialcase__condition",
|
field_name="differentialcase__condition",
|
||||||
@@ -140,6 +143,36 @@ class CaseFilter(django_filters.FilterSet):
|
|||||||
)
|
)
|
||||||
pass
|
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):
|
class SeriesFilter(django_filters.FilterSet):
|
||||||
case = django_filters.ModelMultipleChoiceFilter(
|
case = django_filters.ModelMultipleChoiceFilter(
|
||||||
|
|||||||
Reference in New Issue
Block a user