Add question search functionality with HTMX support for dynamic results
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user