From b36fa370f146607e304b56ca478bf9725543168f Mon Sep 17 00:00:00 2001 From: Ross Date: Mon, 31 Jul 2023 12:02:23 +0100 Subject: [PATCH] fix case rodering --- atlas/models.py | 17 +++++++++++++++++ atlas/views.py | 21 +++++++-------------- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/atlas/models.py b/atlas/models.py index 63de9a1f..78ce2a79 100644 --- a/atlas/models.py +++ b/atlas/models.py @@ -1,6 +1,7 @@ import json import os import pathlib +from typing import Tuple from django.http import Http404, HttpRequest from rad.settings import REMOTE_URL @@ -521,6 +522,22 @@ class CaseCollection(ExamCollectionGenericBase): return False + def get_case_by_index(self, case_index:int, case_count=False) -> Case | Tuple[Case, int]: + # Seems to be a bug when case_number is 0 or 1 the same (first) object gets returned + # forces a list fixes (but is likely inefficient) + cases = list(self.cases.all().order_by("casedetail__sort_order").prefetch_related()) + + try: + case = cases[case_index] + except IndexError: # Catch an invalid case_number + s = f"Invalid case number: {case_index}" + raise Http404(s) + + if case_count: + return case, len(cases) + else: + return case + class CaseDetail(models.Model): case = models.ForeignKey(Case, on_delete=models.CASCADE) diff --git a/atlas/views.py b/atlas/views.py index 73bc8861..45d857ca 100755 --- a/atlas/views.py +++ b/atlas/views.py @@ -1177,11 +1177,10 @@ def collection_mark_question(request, pk, case_number): if collection.collection_type == "REV": raise Http404("Collection in review mode") - cases = collection.cases.all().order_by("casedetail__sort_order").prefetch_related() - case = cases[case_number] + case, case_count = collection.get_case_by_index(case_number, case_count=True) previous = case_number > 0 - next = case_number < (len(cases) - 1) + next = case_number < (case_count - 1) case_detail = CaseDetail.objects.filter(case=case, collection=collection) @@ -1378,8 +1377,7 @@ def collection_case_view_take( collection.check_user_can_take(cid, passcode, request) - cases = collection.cases.all().order_by("casedetail__sort_order").prefetch_related() - case = cases[case_number] + case, case_count = collection.get_case_by_index(case_number, case_count=True) cid_user_exam = collection.get_or_create_cid_user_exam( cid=cid, user_user=request.user @@ -1453,7 +1451,7 @@ def collection_case_view_take( print("case_no") previous = case_number > 0 - next = case_number < (len(cases) - 1) + next = case_number < (case_count - 1) # Set what details a user is / is not able to view when taking the case # this can be configured via the collection edit menu @@ -1521,18 +1519,13 @@ def collection_case_view(request, pk, case_number): form = None answer = None - cases = collection.cases.all().order_by("casedetail__sort_order").prefetch_related() - try: - case = cases[case_number] - except IndexError: # Catch an invalid case_number - s = f"Invalid case number: {case_number}" - raise Http404(s) + case, case_count = collection.get_case_by_index(case_number, case_count=True) series_list = case.series.all().prefetch_related("images", "examination", "plane") previous = case_number > 0 - next = case_number < (len(cases) - 1) + next = case_number < (case_count - 1) return render( request, @@ -1540,7 +1533,7 @@ def collection_case_view(request, pk, case_number): { "form": form, "collection": collection, - "collection_length": len(cases), + "collection_length": case_count, "case": case, "series_list": series_list, "case_number": case_number,