Add question search functionality with HTMX support for dynamic results

This commit is contained in:
Ross
2025-11-05 22:19:24 +00:00
parent b12a45275c
commit dfdba4cce6
4 changed files with 128 additions and 0 deletions
+48
View File
@@ -120,6 +120,54 @@ def active_exams(request):
return render(request, "sbas/available_exam_list.html", {"exams": active_exams})
@login_required
def question_search_page(request):
"""Render the SBAs search page which contains the HTMX search input.
The actual results are returned by `question_search_partial` and swapped
into the results container via HTMX.
"""
return render(request, "sbas/search.html", {})
@login_required
def question_search_partial(request):
"""Return an HTMX partial listing questions matching `q`.
Searches several Question fields and related names. Uses `distinct()` to
avoid duplicates from joins. The template expects `questions` in context.
"""
q = request.GET.get("q", "") or request.GET.get("sbas-question-search-input", "")
q = q.strip()
qs = Question.objects.all()
if q:
from django.db.models import Q
qs = qs.filter(
Q(title__icontains=q)
| Q(stem__icontains=q)
| Q(a_answer__icontains=q)
| Q(b_answer__icontains=q)
| Q(c_answer__icontains=q)
| Q(d_answer__icontains=q)
| Q(e_answer__icontains=q)
| Q(category__category__icontains=q)
| Q(author__first_name__icontains=q)
| Q(author__last_name__icontains=q)
| Q(author__username__icontains=q)
| Q(condition__name__icontains=q)
| Q(presentation__name__icontains=q)
| Q(subspecialty__name__icontains=q)
).distinct()
# Prefetch related data used in the partial to avoid N+1 queries
qs = qs.select_related("category").prefetch_related("author", "condition", "presentation", "subspecialty")[:50]
return render(request, "sbas/partials/_question_search_results.html", {"questions": qs})
def exam_start(request, pk):
exam = get_object_or_404(Exam, pk=pk)