Refactor user collections view to categorize collections into available, in-progress, and finished; update templates for improved display of collection statuses and question rendering.
This commit is contained in:
+40
-2
@@ -38,6 +38,7 @@ from django.urls import reverse_lazy, reverse
|
||||
|
||||
from django.http import Http404, JsonResponse
|
||||
from django.http import HttpResponseRedirect, HttpResponse
|
||||
from django.contrib.contenttypes.models import ContentType
|
||||
|
||||
from generic.models import CidUser, CidUserExam, CimarCase
|
||||
from atlas.helpers import get_cases_available_to_user
|
||||
@@ -641,9 +642,46 @@ def index(request):
|
||||
|
||||
|
||||
def user_collections(request):
|
||||
collections = request.user.user_casecollection_exams.all()
|
||||
# Collections the user is explicitly allowed to take (via CaseCollection.valid_user_users)
|
||||
available_collections = request.user.user_casecollection_exams.all()
|
||||
# Collections the user has already taken (recorded in generic.CidUserExam)
|
||||
in_progress_ids = []
|
||||
finished_ids = []
|
||||
try:
|
||||
ct = ContentType.objects.get_for_model(CaseCollection)
|
||||
taken_exams = CidUserExam.objects.filter(user_user=request.user, content_type=ct)
|
||||
in_progress_ids = list(
|
||||
taken_exams.filter(completed=False).values_list("object_id", flat=True).distinct()
|
||||
)
|
||||
finished_ids = list(
|
||||
taken_exams.filter(completed=True).values_list("object_id", flat=True).distinct()
|
||||
)
|
||||
except Exception:
|
||||
# If anything goes wrong determining taken/finished exams, treat as none
|
||||
in_progress_ids = []
|
||||
finished_ids = []
|
||||
|
||||
return render(request, "atlas/user_collections.html", {"collections": collections})
|
||||
# Build querysets for the three groups
|
||||
taken_all_ids = set(in_progress_ids) | set(finished_ids)
|
||||
|
||||
# Available to start: explicitly allowed collections that the user hasn't taken at all
|
||||
available_qs = available_collections.exclude(pk__in=taken_all_ids).order_by("name")
|
||||
|
||||
# In-progress (taken but not completed)
|
||||
in_progress_qs = CaseCollection.objects.filter(pk__in=list(in_progress_ids)).order_by("name")
|
||||
|
||||
# Finished (completed)
|
||||
finished_qs = CaseCollection.objects.filter(pk__in=list(finished_ids)).order_by("name")
|
||||
|
||||
return render(
|
||||
request,
|
||||
"atlas/user_collections.html",
|
||||
{
|
||||
"available_collections": available_qs,
|
||||
"in_progress_collections": in_progress_qs,
|
||||
"finished_collections": finished_qs,
|
||||
},
|
||||
)
|
||||
|
||||
@login_required
|
||||
def collection_options(request):
|
||||
|
||||
Reference in New Issue
Block a user