reoorganise atlas modules
This commit is contained in:
+118
-48
@@ -1096,19 +1096,39 @@ def collection_detail(request, pk):
|
||||
)
|
||||
|
||||
|
||||
def collection_take(request, pk):
|
||||
def collection_take_start(request, pk):
|
||||
"""The starting page for taking / reviewing a case collection
|
||||
|
||||
Args:
|
||||
request (_type_): _description_
|
||||
pk (_type_): _description_
|
||||
|
||||
Returns:
|
||||
_type_: _description_
|
||||
"""
|
||||
collection = get_object_or_404(CaseCollection, pk=pk)
|
||||
|
||||
valid_user = (collection.check_logged_in_user(request),)
|
||||
|
||||
cid_exam = None
|
||||
if valid_user:
|
||||
cid_exam = collection.get_cid_user_exams(user_user=request.user).first()
|
||||
|
||||
template_variables = {
|
||||
"collection": collection,
|
||||
"valid_user": collection.check_logged_in_user(request),
|
||||
"valid_user": valid_user,
|
||||
"cid_exam": cid_exam,
|
||||
}
|
||||
|
||||
match collection.collection_type:
|
||||
case "REP":
|
||||
return render(request, "atlas/collection_take.html", template_variables)
|
||||
return render(
|
||||
request, "atlas/collection_take_start.html", template_variables
|
||||
)
|
||||
case "REV":
|
||||
return render(request, "atlas/collection_review.html", template_variables)
|
||||
return render(
|
||||
request, "atlas/collection_review_start.html", template_variables
|
||||
)
|
||||
|
||||
|
||||
@user_is_collection_author_or_atlas_editor
|
||||
@@ -1253,13 +1273,36 @@ def collection_take_overview_user(request, pk):
|
||||
def collection_take_overview(
|
||||
request, pk: int, cid: int | None = None, passcode: str | None = None
|
||||
):
|
||||
"""
|
||||
Summary page that shows which questions a user has attempted
|
||||
(with / without answers)
|
||||
|
||||
Args:
|
||||
request (_type_): _description_
|
||||
pk (int): _description_
|
||||
cid (int | None, optional): _description_. Defaults to None.
|
||||
passcode (str | None, optional): _description_. Defaults to None.
|
||||
|
||||
Returns:
|
||||
_type_: _description_
|
||||
"""
|
||||
collection = get_object_or_404(CaseCollection, pk=pk)
|
||||
|
||||
if not collection.active and not collection.self_review:
|
||||
raise Http404("Exam not found")
|
||||
collection.check_user_can_take(cid, passcode, request)
|
||||
|
||||
if not collection.check_cid_user(cid, passcode, request):
|
||||
raise Http404("Error accessing exam")
|
||||
cid_user_exam = collection.get_or_create_cid_user_exam(
|
||||
cid=cid, user_user=request.user
|
||||
)
|
||||
|
||||
if request.htmx:
|
||||
if "finish" in request.POST:
|
||||
cid_user_exam.completed = True
|
||||
cid_user_exam.save()
|
||||
|
||||
return HttpResponse("True")
|
||||
else:
|
||||
raise Http404()
|
||||
|
||||
|
||||
cases = collection.cases.all().order_by("casedetail__sort_order").prefetch_related()
|
||||
|
||||
@@ -1285,10 +1328,6 @@ def collection_take_overview(
|
||||
else:
|
||||
question_answer_tuples.append((q, None))
|
||||
|
||||
cid_user_exam = collection.get_or_create_cid_user_exam(
|
||||
cid=cid, user_user=request.user
|
||||
)
|
||||
|
||||
return render(
|
||||
request,
|
||||
"atlas/collection_take_overview.html",
|
||||
@@ -1304,10 +1343,6 @@ def collection_take_overview(
|
||||
)
|
||||
|
||||
|
||||
def collection_case_view_review(request, pk: int, case_number: int):
|
||||
return collection_case_view_take(request, pk, case_number, None, None)
|
||||
|
||||
|
||||
def collection_case_view_take_user(request, pk: int, case_number: int):
|
||||
return collection_case_view_take(request, pk, case_number)
|
||||
|
||||
@@ -1315,54 +1350,72 @@ def collection_case_view_take_user(request, pk: int, case_number: int):
|
||||
def collection_case_view_take(
|
||||
request, pk: int, case_number: int, cid=None, passcode=None
|
||||
):
|
||||
"""
|
||||
Displays the page from which the user takes a case in the collection
|
||||
|
||||
Args:
|
||||
request (_type_): _description_
|
||||
pk (int): _description_
|
||||
case_number (int): _description_
|
||||
cid (_type_, optional): _description_. Defaults to None.
|
||||
passcode (_type_, optional): _description_. Defaults to None.
|
||||
|
||||
Raises:
|
||||
Http404: If user does not have access
|
||||
|
||||
Returns:
|
||||
_type_: _description_
|
||||
"""
|
||||
collection = get_object_or_404(CaseCollection, pk=pk)
|
||||
|
||||
form = None
|
||||
answer: CidReportAnswer | UserReportAnswer
|
||||
|
||||
if collection.collection_type != collection.COLLECTION_TYPE_CHOICES.REVIEW:
|
||||
if not collection.active and not collection.self_review:
|
||||
raise Http404("Exam not found")
|
||||
|
||||
if cid is not None and not collection.check_cid_user(cid, passcode, request):
|
||||
raise Http404("Error accessing exam")
|
||||
|
||||
cid_user_exam = collection.get_or_create_cid_user_exam(
|
||||
cid=cid, user_user=request.user
|
||||
)
|
||||
collection.check_user_can_take(cid, passcode, request)
|
||||
|
||||
cases = collection.cases.all().order_by("casedetail__sort_order").prefetch_related()
|
||||
case = cases[case_number]
|
||||
|
||||
if collection.collection_type == "REP":
|
||||
if not collection.review_only():
|
||||
cid_user_exam = collection.get_or_create_cid_user_exam(
|
||||
cid=cid, user_user=request.user
|
||||
)
|
||||
case_detail = CaseDetail.objects.get(case=case, collection=collection)
|
||||
|
||||
if cid is not None:
|
||||
answer = case_detail.cidreportanswer_set.filter(cid=cid).first()
|
||||
ReportAnswerForm = CidReportAnswerForm
|
||||
else:
|
||||
answer = case_detail.userreportanswer_set.filter(user=request.user).first()
|
||||
ReportAnswerForm = UserReportAnswerForm
|
||||
if cid_user_exam.start_time is None:
|
||||
cid_user_exam.start_time = timezone.now()
|
||||
cid_user_exam.save()
|
||||
|
||||
if collection.collection_type == "REP":
|
||||
case_detail = CaseDetail.objects.get(case=case, collection=collection)
|
||||
|
||||
if cid is not None:
|
||||
answer = case_detail.cidreportanswer_set.filter(cid=cid).first()
|
||||
ReportAnswerForm = CidReportAnswerForm
|
||||
else:
|
||||
answer = case_detail.userreportanswer_set.filter(
|
||||
user=request.user
|
||||
).first()
|
||||
ReportAnswerForm = UserReportAnswerForm
|
||||
|
||||
if request.method == "POST":
|
||||
if collection.collection_type == "REP":
|
||||
|
||||
if not collection.publish_results:
|
||||
if answer:
|
||||
form = ReportAnswerForm(request.POST, instance=answer)
|
||||
else:
|
||||
form = ReportAnswerForm(request.POST)
|
||||
if form.is_valid():
|
||||
answer = form.save(commit=False)
|
||||
answer.set_cid_or_user(cid=cid, user=request.user)
|
||||
answer.question = case_detail
|
||||
# answer.published_date = timezone.now()
|
||||
answer.save()
|
||||
|
||||
cid_user_exam.end_time = timezone.now()
|
||||
cid_user_exam.save()
|
||||
if not cid_user_exam.completed:
|
||||
if form.is_valid():
|
||||
answer = form.save(commit=False)
|
||||
answer.set_cid_or_user(cid=cid, user=request.user)
|
||||
answer.question = case_detail
|
||||
# answer.published_date = timezone.now()
|
||||
answer.save()
|
||||
|
||||
cid_user_exam.end_time = timezone.now()
|
||||
cid_user_exam.save()
|
||||
|
||||
if cid is not None:
|
||||
kwargs = {"pk": pk, "cid": cid, "passcode": passcode}
|
||||
@@ -1375,7 +1428,7 @@ def collection_case_view_take(
|
||||
|
||||
else:
|
||||
kwargs = {"pk": pk}
|
||||
redirect_url = "atlas:collection_case_view_review"
|
||||
redirect_url = "atlas:collection_case_view_take"
|
||||
|
||||
if "next" in request.POST:
|
||||
return redirect(redirect_url, case_number=case_number + 1, **kwargs)
|
||||
@@ -1399,6 +1452,8 @@ def collection_case_view_take(
|
||||
previous = case_number > 0
|
||||
next = case_number < (len(cases) - 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
|
||||
if collection.publish_results:
|
||||
show_title = collection.show_title_post
|
||||
show_history = collection.show_history_post
|
||||
@@ -1431,23 +1486,38 @@ def collection_case_view_take(
|
||||
"show_description": show_description,
|
||||
"show_discussion": show_discussion,
|
||||
"show_report": show_report,
|
||||
"cid_user_exam": cid_user_exam,
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@user_is_collection_author_or_atlas_editor
|
||||
def collection_case_view(request, pk, case_number):
|
||||
"""Edit/management overview of the case (as part of the collection)
|
||||
|
||||
Args:
|
||||
request (_type_): _description_
|
||||
pk (_type_): _description_
|
||||
case_number (_type_): _description_
|
||||
|
||||
Raises:
|
||||
Http404: _description_
|
||||
|
||||
Returns:
|
||||
_type_: _description_
|
||||
"""
|
||||
collection = get_object_or_404(CaseCollection, pk=pk)
|
||||
|
||||
form = None
|
||||
answer = None
|
||||
|
||||
if collection.collection_type != collection.COLLECTION_TYPE_CHOICES.REVIEW:
|
||||
if not collection.active and not collection.self_review:
|
||||
raise Http404("Exam not found")
|
||||
|
||||
cases = collection.cases.all().order_by("casedetail__sort_order").prefetch_related()
|
||||
case = cases[case_number]
|
||||
|
||||
try:
|
||||
case = cases[case_number]
|
||||
except IndexError: # Catch an invalid case_number
|
||||
s = f"Invalid case number: {case_number}"
|
||||
raise Http404(s)
|
||||
|
||||
series_list = case.series.all().prefetch_related("images", "examination", "plane")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user