Enhance QuestionFilter with title and stem search capabilities and update fields in Meta class

This commit is contained in:
Ross
2025-10-20 22:42:16 +01:00
parent 5e4fea38d7
commit 8663482a6b
+22 -1
View File
@@ -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