Add prerequisites handling to CaseCollection and implement user access checks
This commit is contained in:
+39
-4
@@ -105,6 +105,7 @@ from .models import (
|
||||
SeriesImage,
|
||||
UncategorisedDicom,
|
||||
UserReportAnswer,
|
||||
PrerequisiteRequired
|
||||
)
|
||||
from .tables import (
|
||||
CaseCollectionTable,
|
||||
@@ -2192,11 +2193,21 @@ def collection_take_start(request, pk, cid=None, passcode=None):
|
||||
collection = get_object_or_404(CaseCollection, pk=pk)
|
||||
print(f"Collection: {collection}")
|
||||
|
||||
try:
|
||||
try:
|
||||
collection.check_user_can_take(cid, passcode, request.user)
|
||||
valid_user = True
|
||||
except Http404:
|
||||
valid_user = False
|
||||
except PrerequisiteRequired as e:
|
||||
# Show a friendly page linking to the required collection rather than 404
|
||||
prereq = getattr(e, 'prereq', None)
|
||||
return render(
|
||||
request,
|
||||
'atlas/prerequisite_required.html',
|
||||
{'message': str(e), 'prereq': prereq},
|
||||
)
|
||||
|
||||
|
||||
#valid_user = collection.check_logged_in_user(request)
|
||||
|
||||
|
||||
@@ -2611,7 +2622,11 @@ def collection_take_overview(
|
||||
"""
|
||||
collection = get_object_or_404(CaseCollection, pk=pk)
|
||||
|
||||
collection.check_user_can_take(cid, passcode, request.user)
|
||||
try:
|
||||
collection.check_user_can_take(cid, passcode, request.user)
|
||||
except PrerequisiteRequired as e:
|
||||
prereq = getattr(e, 'prereq', None)
|
||||
return render(request, 'atlas/prerequisite_required.html', {'message': str(e), 'prereq': prereq})
|
||||
|
||||
cid_user_exam = collection.get_or_create_cid_user_exam(
|
||||
cid=cid, user_user=request.user
|
||||
@@ -2684,7 +2699,11 @@ def collection_case_view_take_answers(
|
||||
""" """
|
||||
collection = get_object_or_404(CaseCollection, pk=pk)
|
||||
|
||||
collection.check_user_can_take(cid, passcode, request.user)
|
||||
try:
|
||||
collection.check_user_can_take(cid, passcode, request.user)
|
||||
except PrerequisiteRequired as e:
|
||||
prereq = getattr(e, 'prereq', None)
|
||||
return render(request, 'atlas/prerequisite_required.html', {'message': str(e), 'prereq': prereq})
|
||||
|
||||
case, case_count = collection.get_case_by_index(case_number, case_count=True)
|
||||
|
||||
@@ -2733,7 +2752,11 @@ def collection_case_view_take(
|
||||
form = None
|
||||
answer: None | CidReportAnswer | UserReportAnswer = None
|
||||
|
||||
collection.check_user_can_take(cid, passcode, request.user)
|
||||
try:
|
||||
collection.check_user_can_take(cid, passcode, request.user)
|
||||
except PrerequisiteRequired as e:
|
||||
prereq = getattr(e, 'prereq', None)
|
||||
return render(request, 'atlas/prerequisite_required.html', {'message': str(e), 'prereq': prereq})
|
||||
|
||||
case, case_count = collection.get_case_by_index(case_number, case_count=True)
|
||||
|
||||
@@ -2818,6 +2841,18 @@ def collection_case_view_take(
|
||||
# If this was a timed-out submission, mark as completed
|
||||
if request.POST.get('timed_out') == '1':
|
||||
answer.completed = True
|
||||
## Also mark the overall exam as completed for this user/CID
|
||||
#try:
|
||||
# cid_user_exam.completed = True
|
||||
# cid_user_exam.save()
|
||||
# # Record an exam status entry
|
||||
# collection.exam_user_status.create(
|
||||
# cid_user_exam=cid_user_exam,
|
||||
# status="submitted",
|
||||
# extra="autosubmit",
|
||||
# )
|
||||
#except Exception:
|
||||
# logger.exception("Failed to mark cid_user_exam completed on autosubmit")
|
||||
|
||||
answer.save()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user