From 3c1bd40ce695f48f919899b9818ca91d34543881 Mon Sep 17 00:00:00 2001 From: Ross Date: Mon, 3 Nov 2025 11:08:02 +0000 Subject: [PATCH] Add user and supervisor search endpoints for trainees bulk-update UI --- generic/views.py | 55 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/generic/views.py b/generic/views.py index 239390d0..df990823 100644 --- a/generic/views.py +++ b/generic/views.py @@ -4857,4 +4857,59 @@ def cimar_case_refresh(request, uuid): return HttpResponse("Case refreshed") + +@login_required +def user_search(request): + """HTMX endpoint to search users for the trainees bulk-update UI. + + Expects GET params: + - q: query string + - row: optional row index (passed back to JS) + + Returns a small HTML fragment listing up to 10 matching users. Each + result calls `setManualUser(row, id, text)` when clicked (see template + JS in `trainees_bulk_update.html`). + """ + q = (request.GET.get("q") or "").strip() + row = request.GET.get("row") + if not q: + return HttpResponse("") + + users_qs = User.objects.filter( + Q(first_name__icontains=q) + | Q(last_name__icontains=q) + | Q(email__icontains=q) + | Q(username__icontains=q) + ).order_by("last_name", "first_name")[:10] + + results = [{"id": u.pk, "text": f"{u.get_full_name() or u.username} - {u.email or ''}"} for u in users_qs] + + return render(request, "generic/partials/user_search_results.html", {"results": results, "row": row, "q": q}) + + +@login_required +def supervisor_search(request): + """HTMX endpoint to search supervisors for the trainees bulk-update UI. + + Expects GET params: + - q: query string + - row: optional row index (passed back to JS) + + Returns a small HTML fragment listing up to 10 matching supervisors. Each + result calls `setManualSupervisor(row, id, text)` when clicked (see + template JS in `trainees_bulk_update.html`). + """ + q = (request.GET.get("q") or "").strip() + row = request.GET.get("row") + if not q: + return HttpResponse("") + + supervisors_qs = Supervisor.objects.filter( + Q(name__icontains=q) | Q(email__icontains=q) + ).order_by("name")[:10] + + results = [{"id": s.pk, "text": f"{s.name} - {s.email or ''}"} for s in supervisors_qs] + + return render(request, "generic/partials/supervisor_search_results.html", {"results": results, "row": row, "q": q}) + \ No newline at end of file