Refactor bulk delete error handling and update user search visibility for superusers

This commit is contained in:
Ross
2025-11-03 10:59:18 +00:00
parent 5d91b4a4ff
commit 0679a0ec13
2 changed files with 5 additions and 47 deletions
+3 -47
View File
@@ -212,7 +212,8 @@ def bulk_delete_questions(request):
Model = APP_MODEL_MAP.get(app)
if Model is None:
return JsonResponse({"ok": False, "error": f"Unknown app: {app}"}, status=400)
logger.error(f"bulk_delete_questions called with unknown app: {app}")
return HttpResponse(f"Unknown app: {app}")
deleted = 0
errors = []
@@ -222,7 +223,7 @@ def bulk_delete_questions(request):
qs.delete()
except Exception as e:
logger.exception("bulk_delete failed for app=%s ids=%s", app, ids)
return JsonResponse({"ok": False, "error": str(e)}, status=500)
return HttpResponse("Unable to deleted items")
# Render a small fragment summarising deletions
context = {"deleted": deleted, "errors": errors}
@@ -4369,7 +4370,6 @@ def trainees_bulk_update_from_spreadsheet(request):
# Fall back to automatic match
if not user:
user = row.get("matched_user")
if not user:
skipped += 1
continue
@@ -4399,50 +4399,6 @@ def trainees_bulk_update_from_spreadsheet(request):
)
@user_is_cid_user_manager
def user_search(request):
"""Simple JSON endpoint to search users by name/email for manual matching."""
q = request.GET.get("q", "").strip()
results = []
if q:
qs = User.objects.filter(
Q(first_name__icontains=q) | Q(last_name__icontains=q) | Q(email__icontains=q)
).order_by("last_name", "first_name")[:50]
for u in qs:
results.append({"id": u.pk, "text": f"{u.first_name} {u.last_name} ({u.email})"})
# If this is an HTMX request (or a row param was provided) render an HTML fragment
# that can be swapped into the preview row's results container. Otherwise return JSON.
row = request.GET.get("row")
if request.headers.get("HX-Request") == "true" or row is not None:
# Render a small partial that lists results with Select buttons that call
# the setManualUser(row, id, text) function in the parent page.
return render(request, "generic/partials/user_search_results.html", {"results": results, "row": int(row) if row is not None else None})
return JsonResponse({"results": results})
@user_is_cid_user_manager
def supervisor_search(request):
"""Simple JSON/HTMX endpoint to search supervisors by name/email for manual matching."""
q = request.GET.get("q", "").strip()
results = []
if q:
qs = Supervisor.objects.filter(
Q(name__icontains=q) | Q(email__icontains=q)
).order_by("name")[:50]
for s in qs:
results.append({"id": s.pk, "text": f"{s.name} ({s.email})"})
row = request.GET.get("row")
if request.headers.get("HX-Request") == "true" or row is not None:
return render(request, "generic/partials/supervisor_search_results.html", {"results": results, "row": int(row) if row is not None else None})
return JsonResponse({"results": results})
def create_trainee(request, context=None):
return create_user(request, context, trainee=True)
+2
View File
@@ -10,6 +10,7 @@
<div class="d-flex justify-content-between mb-2 align-items-center flex-column flex-md-row">
<div class="mb-2 mb-md-0">
<div class="btn-toolbar" role="toolbar">
{% if user.is_superuser %}
<div class="btn-group me-2" role="group">
<button id="delete-selected-btn" class="btn btn-danger btn-sm"
hx-post="{% url 'generic:bulk_delete_questions' %}"
@@ -19,6 +20,7 @@
hx-swap="innerHTML"
hx-confirm="Are you sure you want to delete the selected questions? This action cannot be undone.">Delete selected</button>
</div>
{% endif %}
<div class="btn-group" role="group">
<button id="button-select-add-exam" class="btn btn-outline-primary btn-sm"
hx-get="{% url 'generic:generic_exam_htmx' %}?type={{ app_name }}"