Refactor CaseDetail references to Casedetail across templates and views

- Updated all instances of 'case_detail' to 'casedetail' in templates to maintain consistency.
- Adjusted view functions to use 'casedetail' instead of 'case_detail' for better clarity.
- Renamed the field 'case_detail' to 'casedetail' in the CasePrior model to align with the new naming convention.
- Ensured that all related logic and references in forms and data handling reflect this change.
This commit is contained in:
Ross
2025-11-17 10:34:27 +00:00
parent 7f4570417e
commit 12b7fa6629
19 changed files with 230 additions and 208 deletions
+125 -109
View File
@@ -2757,8 +2757,8 @@ def collection_take_start(request, pk, cid=None, passcode=None):
@user_is_collection_author_or_atlas_editor
def collection_case_priors(request, exam_id, case_id):
case_detail = CaseDetail.objects.get(case=case_id, collection=exam_id)
collection = case_detail.collection
casedetail = CaseDetail.objects.get(case=case_id, collection=exam_id)
collection = casedetail.collection
if request.htmx:
# Ensure we can render the updated single-card partial and return it so HTMX
@@ -2767,7 +2767,7 @@ def collection_case_priors(request, exam_id, case_id):
if "remove" in request.POST:
prior_pk = request.POST["remove"]
try:
p = CasePrior.objects.get(case_detail=case_detail, prior_case=prior_pk)
p = CasePrior.objects.get(casedetail=casedetail, prior_case=prior_pk)
p.delete()
except CasePrior.DoesNotExist:
# Already removed; continue and render the not-added card
@@ -2785,7 +2785,7 @@ def collection_case_priors(request, exam_id, case_id):
"added": added,
"relation": relation,
"visibility": visibility,
"case_detail": case_detail,
"casedetail": casedetail,
"collection": collection,
},
request=request,
@@ -2807,7 +2807,7 @@ def collection_case_priors(request, exam_id, case_id):
"added": added,
"relation": relation,
"visibility": visibility,
"case_detail": case_detail,
"casedetail": casedetail,
"collection": collection,
"error": "You need to enter text to describe the relationship between the cases",
},
@@ -2816,7 +2816,7 @@ def collection_case_priors(request, exam_id, case_id):
return HttpResponse(html)
prior_case = Case.objects.get(pk=request.POST["prior_case_id"])
p, created = CasePrior.objects.get_or_create(
case_detail=case_detail, prior_case=prior_case
casedetail=casedetail, prior_case=prior_case
)
p.relation_text = request.POST.get("relation", "")
p.prior_visibility = request.POST.get("prior_visibility", "AL")
@@ -2833,7 +2833,7 @@ def collection_case_priors(request, exam_id, case_id):
"added": added,
"relation": relation,
"visibility": visibility,
"case_detail": case_detail,
"casedetail": casedetail,
"collection": collection,
},
request=request,
@@ -2842,15 +2842,15 @@ def collection_case_priors(request, exam_id, case_id):
else:
return HttpResponse("False", status=400)
collection = case_detail.collection
collection = casedetail.collection
added_priors = CasePrior.objects.filter(case_detail=case_detail)
added_priors = CasePrior.objects.filter(casedetail=casedetail)
added_relation_map = {}
for prior in added_priors:
added_relation_map[prior.prior_case] = (prior.relation_text, prior.prior_visibility)
case = case_detail.case
case = casedetail.case
available_cases = case.get_all_prior_cases()
@@ -2864,22 +2864,22 @@ def collection_case_priors(request, exam_id, case_id):
form = PriorCaseForm()
case_number, case_count = collection.get_index_of_case(
case_detail.case, case_count=True
casedetail.case, case_count=True
)
previous = collection.get_previous_case(case_detail.case)
next = collection.get_next_case(case_detail.case)
previous = collection.get_previous_case(casedetail.case)
next = collection.get_next_case(casedetail.case)
return render(
request,
"atlas/collection_case_priors.html",
{
"case_detail": case_detail,
"casedetail": casedetail,
"form": form,
#"model_form": model_form,
# "example_form": example_form,
"collection": collection,
"case": case_detail.case,
"case": casedetail.case,
"previous": previous,
"next": next,
"collection_length": case_count,
@@ -2892,9 +2892,9 @@ def collection_case_priors(request, exam_id, case_id):
@user_is_collection_author_or_atlas_editor
def collection_case_questions(request, exam_id, case_id):
case_detail = CaseDetail.objects.get(case=case_id, collection=exam_id)
casedetail = CaseDetail.objects.get(case=case_id, collection=exam_id)
collection = case_detail.collection
collection = casedetail.collection
if not collection.collection_type == "QUE":
raise Http404("Collection not in question mode")
@@ -2903,29 +2903,29 @@ def collection_case_questions(request, exam_id, case_id):
# Called if the user saves the correct answer form
if request.POST.get("submit") == "answer":
# answers = request.POST
case_detail.question_answers = json.loads(request.POST.get("json_answer"))
case_detail.save()
casedetail.question_answers = json.loads(request.POST.get("json_answer"))
casedetail.save()
example_form = JsonAnswerForm(
request.POST, question_schema=case_detail.question_schema
request.POST, question_schema=casedetail.question_schema
)
form = CaseQuestionForm(instance=case_detail)
form = CaseQuestionForm(instance=casedetail)
# Called if the user saves the main form
elif request.POST.get("submit") == "save":
form = CaseQuestionForm(request.POST, instance=case_detail)
form = CaseQuestionForm(request.POST, instance=casedetail)
if form.is_valid():
form.save()
# Add any additional logic or redirection here
# example_form = JsonAnswerForm(request.POST, question_schema=case_detail.question_schema)
# example_form = JsonAnswerForm(request.POST, question_schema=casedetail.question_schema)
post_data = request.POST.copy()
if (
case_detail.question_schema is not None
and case_detail.question_answers is not None
casedetail.question_schema is not None
and casedetail.question_answers is not None
):
question_keys = set(case_detail.question_schema["properties"].keys())
answer_keys = set(case_detail.question_answers.keys())
question_keys = set(casedetail.question_schema["properties"].keys())
answer_keys = set(casedetail.question_answers.keys())
answers = {}
for key, value in case_detail.question_answers.items():
for key, value in casedetail.question_answers.items():
if key in question_keys:
answers[key] = value
@@ -2935,35 +2935,35 @@ def collection_case_questions(request, exam_id, case_id):
answers[key] = ""
post_data["json_answer"] = json.dumps(answers)
case_detail.question_answers = answers
case_detail.save()
casedetail.question_answers = answers
casedetail.save()
example_form = JsonAnswerForm(
post_data, question_schema=case_detail.question_schema
post_data, question_schema=casedetail.question_schema
)
form = CaseQuestionForm(instance=case_detail)
form = CaseQuestionForm(instance=casedetail)
# This shouldn't happen
else:
assert False
form = CaseQuestionForm(request.POST, instance=case_detail)
form = CaseQuestionForm(request.POST, instance=casedetail)
else:
post_data = request.POST.copy()
post_data["json_answer"] = json.dumps(case_detail.question_answers)
post_data["json_answer"] = json.dumps(casedetail.question_answers)
example_form = JsonAnswerForm(
post_data, question_schema=case_detail.question_schema
post_data, question_schema=casedetail.question_schema
)
form = CaseQuestionForm(instance=case_detail)
form = CaseQuestionForm(instance=casedetail)
pass
# post_data = None
# if case_detail.question_schema is not None and case_detail.question_answers is not None:
# question_keys = set(case_detail.question_schema["properties"].keys())
# answer_keys = set(case_detail.question_answers.keys())
# if casedetail.question_schema is not None and casedetail.question_answers is not None:
# question_keys = set(casedetail.question_schema["properties"].keys())
# answer_keys = set(casedetail.question_answers.keys())
# answers = {}
# for key, value in case_detail.question_answers.items():
# for key, value in casedetail.question_answers.items():
# if key in question_keys:
# answers[key] = value
@@ -2974,28 +2974,28 @@ def collection_case_questions(request, exam_id, case_id):
# post_data = request.POST.copy()
# post_data["json_answer"]= json.dumps(answers)
# case_detail.question_answers = answers
# example_form = JsonAnswerForm(post_data, question_schema=case_detail.question_schema)
# casedetail.question_answers = answers
# example_form = JsonAnswerForm(post_data, question_schema=casedetail.question_schema)
# form = CaseQuestionForm(instance=case_detail)
# form = CaseQuestionForm(instance=casedetail)
# blank_form = JsonAnswerForm(question_schema=case_detail.question_schema)
# blank_form = JsonAnswerForm(question_schema=casedetail.question_schema)
case_number, case_count = collection.get_index_of_case(
case_detail.case, case_count=True
casedetail.case, case_count=True
)
previous = collection.get_previous_case(case_detail.case)
next = collection.get_next_case(case_detail.case)
previous = collection.get_previous_case(casedetail.case)
next = collection.get_next_case(casedetail.case)
return render(
request,
"atlas/collection_case_questions.html",
{
"case_detail": case_detail,
"casedetail": casedetail,
"form": form,
"example_form": example_form,
"collection": collection,
"case": case_detail.case,
"case": casedetail.case,
"previous": previous,
"next": next,
"collection_length": case_count,
@@ -3005,12 +3005,12 @@ def collection_case_questions(request, exam_id, case_id):
@user_is_collection_author_or_atlas_editor
def collection_case_details(request, exam_id, case_id):
case_detail = CaseDetail.objects.get(case=case_id, collection=exam_id)
casedetail = CaseDetail.objects.get(case=case_id, collection=exam_id)
collection = case_detail.collection
collection = casedetail.collection
if request.method == "POST":
form = CaseDetailForm(request.POST, instance=case_detail)
form = CaseDetailForm(request.POST, instance=casedetail)
if form.is_valid():
form.save()
if request.htmx:
@@ -3020,23 +3020,23 @@ def collection_case_details(request, exam_id, case_id):
if request.htmx:
return HttpResponse("Invalid form", status=400)
else:
form = CaseDetailForm(instance=case_detail)
form = CaseDetailForm(instance=casedetail)
case_number, case_count = collection.get_index_of_case(
case_detail.case, case_count=True
casedetail.case, case_count=True
)
previous = collection.get_previous_case(case_detail.case)
next = collection.get_next_case(case_detail.case)
previous = collection.get_previous_case(casedetail.case)
next = collection.get_next_case(casedetail.case)
return render(
request,
"atlas/collection_case_details.html",
{
"case_detail": case_detail,
"casedetail": casedetail,
"form": form,
"collection": collection,
"case": case_detail.case,
"case": casedetail.case,
"previous": previous,
"next": next,
"collection_length": case_count,
@@ -3054,14 +3054,14 @@ def collection_mark_overview(request, pk):
cases = collection.cases.all().order_by("casedetail__sort_order").prefetch_related()
case_details = CaseDetail.objects.filter(
casedetails = CaseDetail.objects.filter(
case__in=cases, collection=collection
).prefetch_related("case")
answers = CidReportAnswer.objects.filter(question__in=case_details)
answers = CidReportAnswer.objects.filter(question__in=casedetails)
case_map = {}
for cd in case_details:
for cd in casedetails:
case_map[cd] = []
for answer in answers:
@@ -3073,7 +3073,7 @@ def collection_mark_overview(request, pk):
{
"collection": collection,
"answers": answers,
"case_details": case_details,
"casedetails": casedetails,
"case_map": case_map,
},
)
@@ -3091,9 +3091,9 @@ def collection_mark_question(request, pk, case_number):
previous = case_number > 0
next = case_number < (case_count - 1)
case_detail = CaseDetail.objects.filter(case=case, collection=collection)
casedetail = CaseDetail.objects.filter(case=case, collection=collection)
answers = CidReportAnswer.objects.filter(question__in=case_detail)
answers = CidReportAnswer.objects.filter(question__in=casedetail)
answer_forms = []
if request.method == "POST":
@@ -3107,7 +3107,7 @@ def collection_mark_question(request, pk, case_number):
if form.is_valid():
answer = form.save(commit=False)
# answer.cid = cid
# answer.question = case_detail
# answer.question = casedetail
# answer.published_date = timezone.now()
answer.save()
@@ -3145,7 +3145,7 @@ def collection_mark_question(request, pk, case_number):
"collection": collection,
"series_list": series_list,
"answers": answers,
"case_detail": case_detail,
"casedetail": casedetail,
"case": case,
"case_number": case_number,
"answer_forms": answer_forms,
@@ -3228,13 +3228,13 @@ def collection_take_overview(
cases = collection.cases.all().order_by("casedetail__sort_order").prefetch_related()
case_details = CaseDetail.objects.filter(case__in=cases, collection=collection)
casedetails = CaseDetail.objects.filter(case__in=cases, collection=collection)
if cid is not None:
answers = CidReportAnswer.objects.filter(cid=cid, question__in=case_details)
answers = CidReportAnswer.objects.filter(cid=cid, question__in=casedetails)
else:
answers = UserReportAnswer.objects.filter(
user=request.user, question__in=case_details
user=request.user, question__in=casedetails
)
answer_question_map = {}
@@ -3243,7 +3243,7 @@ def collection_take_overview(
question_answer_tuples = []
answer_count = 0
for cd in case_details:
for cd in casedetails:
self_review = cid_user_exam.selfreview_set.filter(case=cd.case)
if cd in answer_question_map and (
answer_question_map[cd].answer or answer_question_map[cd].json_answer
@@ -3290,7 +3290,7 @@ def collection_case_view_take_answers(
cid=cid, user_user=request.user
)
case_detail = CaseDetail.objects.get(case=case, collection=collection)
casedetail = CaseDetail.objects.get(case=case, collection=collection)
return render(
request,
@@ -3298,7 +3298,7 @@ def collection_case_view_take_answers(
{
"collection": collection,
"case": case,
"case_detail": case_detail,
"casedetail": casedetail,
},
)
@@ -3347,23 +3347,23 @@ def collection_case_view_take(
cid_user_exam.start_time = timezone.now()
cid_user_exam.save()
case_detail = CaseDetail.objects.get(case=case, collection=collection)
casedetail = CaseDetail.objects.get(case=case, collection=collection)
if not collection.review_only():
if collection.collection_type == "REP":
if cid is not None:
answer = case_detail.cidreportanswer_set.filter(cid=cid).first()
answer = casedetail.cidreportanswer_set.filter(cid=cid).first()
ReportAnswerForm = CidReportAnswerForm
else:
answer = case_detail.userreportanswer_set.filter(
answer = casedetail.userreportanswer_set.filter(
user=request.user
).first()
ReportAnswerForm = UserReportAnswerForm
elif collection.collection_type == "QUE":
if cid is not None:
answer = case_detail.cidreportanswer_set.filter(cid=cid).first()
answer = casedetail.cidreportanswer_set.filter(cid=cid).first()
ReportAnswerForm = CidQuestionAnswerForm
else:
answer = case_detail.userreportanswer_set.filter(
answer = casedetail.userreportanswer_set.filter(
user=request.user
).first()
ReportAnswerForm = UserQuestionAnswerForm
@@ -3381,9 +3381,9 @@ def collection_case_view_take(
if not answer and collection.collection_type in ("REP", "QUE"):
try:
if cid is not None:
answer = CidReportAnswer(question=case_detail, cid=cid)
answer = CidReportAnswer(question=casedetail, cid=cid)
else:
answer = UserReportAnswer(question=case_detail, user=request.user)
answer = UserReportAnswer(question=casedetail, user=request.user)
answer.started_at = timezone.now()
answer.save()
except Exception:
@@ -3396,10 +3396,10 @@ def collection_case_view_take(
if not collection.publish_results:
if answer:
form = ReportAnswerForm(
request.POST, instance=answer, case_detail=case_detail
request.POST, instance=answer, casedetail=casedetail
)
else:
form = ReportAnswerForm(request.POST, case_detail=case_detail)
form = ReportAnswerForm(request.POST, casedetail=casedetail)
if not cid_user_exam.completed and not (
answer is not None and answer.completed
@@ -3407,7 +3407,7 @@ def collection_case_view_take(
if form.is_valid():
answer = form.save(commit=False)
answer.set_cid_or_user(cid=cid, user=request.user)
answer.question = case_detail
answer.question = casedetail
# Record submission timestamp
answer.submitted_at = timezone.now()
# answer.published_date = timezone.now()
@@ -3478,7 +3478,7 @@ def collection_case_view_take(
)
else:
if collection.collection_type in ("REP", "QUE"):
form = ReportAnswerForm(instance=answer, case_detail=case_detail)
form = ReportAnswerForm(instance=answer, casedetail=casedetail)
series_list = case.series.all().prefetch_related("images", "examination", "plane")
@@ -3517,7 +3517,7 @@ def collection_case_view_take(
resources = case.caseresource_set.filter(pre_review=True)
prior_cases = case_detail.caseprior_set.all()
prior_cases = casedetail.caseprior_set.all()
series_to_load = []
@@ -3543,7 +3543,7 @@ def collection_case_view_take(
"form": form,
"collection": collection,
"case": case,
"case_detail": case_detail,
"casedetail": casedetail,
"series_list": series_list,
"series_to_load": series_to_load,
"case_number": case_number,
@@ -3636,14 +3636,14 @@ def collection_case_dicom_json_review(request, exam_id, case_id):
return collection_case_dicom_json(request, exam_id, case_id, review=True)
def collection_case_dicom_json(request, exam_id, case_id, review=False):
case_detail = CaseDetail.objects.get(case=case_id, collection=exam_id)
casedetail = CaseDetail.objects.get(case=case_id, collection=exam_id)
if review:
priors = case_detail.caseprior_set.exclude(prior_visibility="NO")
priors = casedetail.caseprior_set.exclude(prior_visibility="NO")
else:
priors = case_detail.caseprior_set.exclude(prior_visibility__in=["NO", "RE"])
priors = casedetail.caseprior_set.exclude(prior_visibility__in=["NO", "RE"])
return JsonResponse(case_detail.case.get_case_dicom_json(priors=priors))
return JsonResponse(casedetail.case.get_case_dicom_json(priors=priors))
def case_dicom_json(request, pk):
@@ -3664,12 +3664,12 @@ def delete_collection_cid_answers(request, exam_id, cid):
cases = collection.cases.all().order_by("casedetail__sort_order").prefetch_related()
case_details = CaseDetail.objects.filter(
casedetails = CaseDetail.objects.filter(
case__in=cases, collection=collection
).prefetch_related("case")
cid_user_answers = CidReportAnswer.objects.filter(
question__in=case_details, cid=cid
question__in=casedetails, cid=cid
)
temp = {}
@@ -3686,11 +3686,11 @@ def delete_collection_answers(request, exam_id):
cases = collection.cases.all().order_by("casedetail__sort_order").prefetch_related()
case_details = CaseDetail.objects.filter(
casedetails = CaseDetail.objects.filter(
case__in=cases, collection=collection
).prefetch_related("case")
cid_user_answers = CidReportAnswer.objects.filter(question__in=case_details)
cid_user_answers = CidReportAnswer.objects.filter(question__in=casedetails)
temp = {}
for ans in cid_user_answers:
@@ -3719,11 +3719,11 @@ def collection_scores_cid(request, pk):
cases = collection.cases.all().order_by("casedetail__sort_order").prefetch_related()
case_details = CaseDetail.objects.filter(
casedetails = CaseDetail.objects.filter(
case__in=cases, collection=collection
).prefetch_related("case")
cid_user_answers = CidReportAnswer.objects.filter(question__in=case_details)
cid_user_answers = CidReportAnswer.objects.filter(question__in=casedetails)
cids = set()
@@ -4126,7 +4126,7 @@ def collection_question_schemas(request, exam_id: int):
questions = collection.cases.all().prefetch_related()
case_details = (
casedetails = (
CaseDetail.objects.filter(case__in=questions, collection=collection)
.prefetch_related("case")
.order_by("sort_order")
@@ -4137,7 +4137,7 @@ def collection_question_schemas(request, exam_id: int):
"atlas/collection_question_schemas.html",
{
"collection": collection,
"case_details": case_details,
"casedetails": casedetails,
},
)
@@ -4255,10 +4255,10 @@ def collection_reset_answers_user(request, exam_id: int, user_id: int):
collection = get_object_or_404(CaseCollection, pk=exam_id)
# Select all case details (answers are linked to these)
case_details = collection.casedetail_set.all().prefetch_related()
casedetails = collection.casedetail_set.all().prefetch_related()
# Delete all answers
for case in case_details:
for case in casedetails:
user_answers = case.userreportanswer_set.filter(user_id=user_id)
user_answers.delete()
@@ -4276,10 +4276,10 @@ def collection_reset_answers_ciduser(request, exam_id: int, cid: int):
collection = get_object_or_404(CaseCollection, pk=exam_id)
# Select all case details (answers are linked to these)
case_details = collection.casedetail_set.all().prefetch_related()
casedetails = collection.casedetail_set.all().prefetch_related()
# Delete all answers
for case in case_details:
for case in casedetails:
cid_answers = case.cidreportanswer_set.filter(cid=cid)
cid_answers.delete()
@@ -4297,10 +4297,10 @@ def collection_reset_answers(request, exam_id: int):
collection = get_object_or_404(CaseCollection, pk=exam_id)
# Select all case details (answers are linked to these)
case_details = collection.casedetail_set.all().prefetch_related()
casedetails = collection.casedetail_set.all().prefetch_related()
# Delete all answers
for case in case_details:
for case in casedetails:
cid_answers = case.cidreportanswer_set.all()
cid_answers.delete()
@@ -4522,22 +4522,38 @@ def collection_case_displaysetup(request, collection_id, case_id):
View to set up the display options for a specific case in a collection.
This can include setting which series to display, annotations, etc.
"""
case_detail = get_object_or_404(CaseDetail, case__pk=case_id, collection__pk=collection_id)
casedetail = get_object_or_404(CaseDetail, case__pk=case_id, collection__pk=collection_id)
if request.method == "POST":
data = json.loads(request.body.decode("utf-8"))
if data.get("reset_viewerstate"):
case_detail.default_viewerstate = None
case_detail.save()
casedetail.default_viewerstate = None
casedetail.save()
return HttpResponse("<span class='text-success'>Viewer state reset to default.</span>")
viewerstate = data.get("viewerstate")
if viewerstate is not None:
case_detail.default_viewerstate = viewerstate
case_detail.save()
casedetail.default_viewerstate = viewerstate
casedetail.save()
return HttpResponse("<span class='text-success'>Viewer state saved.</span>")
else:
return HttpResponse("<span class='text-danger'>No viewer state provided.</span>", status=400)
collection = casedetail.collection
case_number, case_count = collection.get_index_of_case(
casedetail.case, case_count=True
)
previous = collection.get_previous_case(casedetail.case)
next = collection.get_next_case(casedetail.case)
return render(request, "atlas/collection_case_displaysetup.html", {
"case_detail": case_detail
"casedetail": casedetail,
"collection": collection,
"case_number": case_number,
"case_count": case_count,
"previous": previous,
"next": next,
"collection_length": case_count,
})