Refactor bulk delete error handling and update user search visibility for superusers
This commit is contained in:
+3
-47
@@ -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)
|
||||
|
||||
|
||||
@@ -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 }}"
|
||||
|
||||
Reference in New Issue
Block a user