reoorganise atlas modules

This commit is contained in:
Ross
2023-07-24 09:19:08 +01:00
parent 9a5088c03a
commit e6469e70f0
10 changed files with 275 additions and 114 deletions
+118 -48
View File
@@ -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")