From 8663482a6bdfc4ae5d821684577b20d2b13b6fbf Mon Sep 17 00:00:00 2001 From: Ross Date: Mon, 20 Oct 2025 22:42:16 +0100 Subject: [PATCH] Enhance QuestionFilter with title and stem search capabilities and update fields in Meta class --- sbas/filters.py | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/sbas/filters.py b/sbas/filters.py index bd894356..580346d5 100644 --- a/sbas/filters.py +++ b/sbas/filters.py @@ -2,6 +2,7 @@ import django_filters from dal import autocomplete from .models import Category, Question, UserAnswer, Exam +from django.db.models import Q from atlas.models import Condition, Structure, Finding, Presentation, Subspecialty #from generic.filters import UserAnswerFilter @@ -32,6 +33,11 @@ def get_authors(request): class QuestionFilter(django_filters.FilterSet): + # simple text searches + title = django_filters.CharFilter(field_name='title', lookup_expr='icontains', label='Title') + stem = django_filters.CharFilter(field_name='stem', lookup_expr='icontains', label='Stem') + # combined quick search across title and stem + q = django_filters.CharFilter(method='filter_q', label='Search') exams = django_filters.ModelMultipleChoiceFilter(queryset=get_exams, null_label="No exam") author = django_filters.ModelMultipleChoiceFilter(queryset=get_authors, null_label="No author") category = django_filters.ModelMultipleChoiceFilter(queryset=Category.objects.all(),null_label="Uncategorised") @@ -62,7 +68,7 @@ class QuestionFilter(django_filters.FilterSet): ) class Meta: model = Question - fields = ("exams", "created_date", "condition", "structure", "finding", "presentation", "category", "subspecialty") + fields = ("exams", "created_date", "condition", "structure", "finding", "presentation", "category", "subspecialty", "title", "stem", "q") def __init__(self, data=None, queryset=None, prefix=None, strict=None, user=None, request=None): if not request.user.groups.filter(name="sba_checker").exists(): @@ -70,6 +76,21 @@ class QuestionFilter(django_filters.FilterSet): super(QuestionFilter, self).__init__(data=data, queryset=queryset, prefix=prefix, request=request) pass + def filter_q(self, queryset, name, value): + # search both title and stem + if not value: + return queryset + return queryset.filter( + Q(title__icontains=value) | + Q(stem__icontains=value) | + Q(a_answer__icontains=value) | + Q(b_answer__icontains=value) | + Q(c_answer__icontains=value) | + Q(d_answer__icontains=value) | + Q(e_answer__icontains=value) | + Q(best_answer__icontains=value) + ) + class UserAnswerFilter(django_filters.FilterSet): class Meta: model= UserAnswer