From d6487eae88da7eedfb1f2a52727477cbb5b9af23 Mon Sep 17 00:00:00 2001 From: Ross Date: Wed, 25 Mar 2026 21:14:33 +0000 Subject: [PATCH] Enhance migration process for rapids to shorts; skip normal rapids and provide user feedback on migration status --- rapids/admin.py | 16 ++++++++++++++-- rapids/templates/rapids/exam_overview.html | 2 +- rapids/views.py | 16 ++++++++++++++-- shorts/models.py | 4 ++++ 4 files changed, 33 insertions(+), 5 deletions(-) diff --git a/rapids/admin.py b/rapids/admin.py index 747bfe32..1a8da907 100755 --- a/rapids/admin.py +++ b/rapids/admin.py @@ -72,12 +72,16 @@ class RapidAdmin(VersionAdmin): from shorts.models import Question as ShortQuestion created = [] + skipped = [] for rapid in queryset: # allow admin or any author to perform migration if request.user.is_superuser or rapid.author.filter(id=request.user.id).exists(): try: q = ShortQuestion.from_rapid(rapid) - created.append(str(q.id)) + if q is None: + skipped.append(str(rapid.id)) + else: + created.append(str(q.id)) except Exception as e: self.message_user(request, f"Failed to migrate Rapid {rapid.id}: {e}", level=messages.ERROR) else: @@ -85,6 +89,8 @@ class RapidAdmin(VersionAdmin): if created: self.message_user(request, f"Created shorts questions: {', '.join(created)}", level=messages.SUCCESS) + if skipped: + self.message_user(request, f"Skipped normal rapids (not migrated): {', '.join(skipped)}", level=messages.INFO) migrate_to_shorts.short_description = "Migrate selected rapids to shorts" @@ -97,13 +103,17 @@ class ExamAdmin(VersionAdmin, admin.ModelAdmin): from shorts.models import Question as ShortQuestion created = [] + skipped = [] for exam in queryset: for rapid in exam.exam_questions.all(): # only allow if admin or author of rapid if request.user.is_superuser or rapid.author.filter(id=request.user.id).exists(): try: q = ShortQuestion.from_rapid(rapid) - created.append(str(q.id)) + if q is None: + skipped.append(str(rapid.id)) + else: + created.append(str(q.id)) except Exception as e: self.message_user(request, f"Failed to migrate Rapid {rapid.id}: {e}", level=messages.ERROR) else: @@ -111,6 +121,8 @@ class ExamAdmin(VersionAdmin, admin.ModelAdmin): if created: self.message_user(request, f"Created shorts questions: {', '.join(created)}", level=messages.SUCCESS) + if skipped: + self.message_user(request, f"Skipped normal rapids (not migrated): {', '.join(skipped)}", level=messages.INFO) migrate_exam_questions.short_description = "Migrate all rapids in selected exam(s) to shorts" diff --git a/rapids/templates/rapids/exam_overview.html b/rapids/templates/rapids/exam_overview.html index 3522d92c..f5be9eaa 100644 --- a/rapids/templates/rapids/exam_overview.html +++ b/rapids/templates/rapids/exam_overview.html @@ -28,7 +28,7 @@ {% for image in question.get_images %} thumbail {% empty %} - No image added. + No image added. {% endfor %} diff --git a/rapids/views.py b/rapids/views.py index ae129250..553cc936 100755 --- a/rapids/views.py +++ b/rapids/views.py @@ -78,6 +78,7 @@ from django.core.cache import cache from helpers.images import image_as_base64 import logging +from django.contrib import messages from copy import deepcopy from django.forms.models import model_to_dict from rapids.forms import RapidCreationDefaultForm @@ -834,8 +835,14 @@ def question_migrate_to_shorts(request, pk): try: q = ShortQuestion.from_rapid(rapid) except Exception as e: - return HttpResponse(f"Migration failed: {e}", status=500) + messages.error(request, f"Migration failed: {e}") + return redirect("rapids:question_detail", pk=rapid.pk) + if q is None: + messages.info(request, "Question skipped (marked normal) — not migrated.") + return redirect("rapids:question_detail", pk=rapid.pk) + + messages.success(request, "Migration complete — redirected to new Short question.") return redirect(q.get_absolute_url()) @@ -855,11 +862,16 @@ def exam_migrate_rapids_to_shorts(request, pk): for rapid in exam.exam_questions.all(): try: - ShortQuestion.from_rapid(rapid) + q = ShortQuestion.from_rapid(rapid) + if q is None: + # skipped normal + continue except Exception: # continue on error continue + messages.success(request, "Exam migration attempted. Normal questions were skipped.") + # Redirect to the exam overview for shorts if available, otherwise back to rapids exam try: return redirect("shorts:exam_overview", pk=exam.pk) diff --git a/shorts/models.py b/shorts/models.py index 77d7ac23..0137e1cb 100644 --- a/shorts/models.py +++ b/shorts/models.py @@ -302,6 +302,10 @@ class Question(QuestionBase): from rapids.models import Answer as RapidAnswer + # Skip migration for normal rapids (nothing to migrate) + if getattr(rapid, "normal", False): + return None + guidance_parts = [] guidance_parts.append(f"Migrated from rapid id: {rapid.id}") if rapid.laterality: