Numerous improvements to case questions

This commit is contained in:
Ross
2024-06-24 08:59:15 +01:00
parent db43bcf557
commit 64cebf50a0
11 changed files with 348 additions and 74 deletions
+127 -39
View File
@@ -42,6 +42,7 @@ from .forms import (
CaseDetailForm,
CaseForm,
CaseResourceFormSet,
CidQuestionAnswerForm,
CidReportAnswerForm,
CidReportAnswerMarkForm,
ConditionAutocompleteForm,
@@ -57,6 +58,7 @@ from .forms import (
SeriesFindingForm,
CaseDifferentialFormSet,
StructureForm,
UserQuestionAnswerForm,
UserReportAnswerForm,
)
from .models import (
@@ -186,6 +188,7 @@ def case_detail(request, pk):
# logging.debug(atlas.subspecialty.first().name.all())
return render(request, "atlas/case_detail.html", {"case": case})
@login_required
@user_is_author_or_atlas_series_checker_or_atlas_marker
def series_thumbnail(request, pk, finding_pk=None):
@@ -372,6 +375,7 @@ def resource_detail(request, pk):
return render(request, "atlas/resource_detail.html", {"resource": resource})
@login_required
def resource_view(request, pk):
resource = get_object_or_404(Resource, pk=pk)
@@ -452,10 +456,12 @@ def user_uploads_series(request, series_instance_uid: str):
{"dicoms": dicoms, "series_id": series_instance_uid},
)
@login_required
def new_uploads(request):
return render(request, "atlas/new_uploads.html", {})
@login_required
@user_passes_test(lambda u: u.is_superuser)
def all_uploads(request, case_id: int | None = None):
@@ -712,7 +718,8 @@ class CaseCollectionUpdate(RevisionMixin, AuthorOrCheckerRequiredMixin, UpdateVi
context["case_formset"].full_clean()
else:
context["case_formset"] = CaseCollectionCaseFormSet(
instance=self.object, form_kwargs={"user": self.request.user, "collection": self.object}
instance=self.object,
form_kwargs={"user": self.request.user, "collection": self.object},
)
context["collection"] = context["casecollection"]
@@ -1554,7 +1561,7 @@ def collection_take_start(request, pk):
}
match collection.collection_type:
case "REP":
case x if x in ("REP", "QUE"):
return render(
request, "atlas/collection_take_start.html", template_variables
)
@@ -1563,28 +1570,37 @@ def collection_take_start(request, pk):
request, "atlas/collection_review_start.html", template_variables
)
@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)
collection = case_detail.collection
if not collection.collection_type == "QUE":
raise Http404("Collection not in question mode")
if request.method == "POST":
if request.method == 'POST':
# Called if the user saves the correct answer form
if request.POST.get('submit') == 'answer':
#answers = request.POST
if request.POST.get("submit") == "answer":
# answers = request.POST
case_detail.question_answers = json.loads(request.POST.get("json_answer"))
case_detail.save()
example_form = JsonAnswerForm(request.POST, case_detail=case_detail)
form = CaseDetailForm(instance=case_detail)
# Called if the user saves the main form
elif request.POST.get('submit') == 'save':
elif request.POST.get("submit") == "save":
form = CaseDetailForm(request.POST, instance=case_detail)
if form.is_valid():
form.save()
# Add any additional logic or redirection here
#example_form = JsonAnswerForm(request.POST, case_detail=case_detail)
if case_detail.question_schema is not None and case_detail.question_answers is not None:
# example_form = JsonAnswerForm(request.POST, case_detail=case_detail)
post_data = request.POST.copy()
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())
@@ -1598,10 +1614,8 @@ def collection_case_details(request, exam_id, case_id):
for key in diff:
answers[key] = ""
post_data = request.POST.copy()
post_data["json_answer"]= json.dumps(answers)
case_detail.question_answers = answers
post_data["json_answer"] = json.dumps(answers)
case_detail.question_answers = answers
case_detail.save()
example_form = JsonAnswerForm(post_data, case_detail=case_detail)
@@ -1613,14 +1627,14 @@ def collection_case_details(request, exam_id, case_id):
else:
post_data = request.POST.copy()
post_data["json_answer"]= json.dumps(case_detail.question_answers)
post_data["json_answer"] = json.dumps(case_detail.question_answers)
example_form = JsonAnswerForm(post_data, case_detail=case_detail)
form = CaseDetailForm(instance=case_detail)
pass
#post_data = None
# post_data = None
#if case_detail.question_schema is not None and case_detail.question_answers is not 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())
@@ -1634,23 +1648,37 @@ def collection_case_details(request, exam_id, case_id):
# for key in diff:
# answers[key] = ""
# post_data = request.POST.copy()
# post_data["json_answer"]= json.dumps(answers)
# case_detail.question_answers = answers
#example_form = JsonAnswerForm(post_data, case_detail=case_detail)
# example_form = JsonAnswerForm(post_data, case_detail=case_detail)
#form = CaseDetailForm(instance=case_detail)
# form = CaseDetailForm(instance=case_detail)
#blank_form = JsonAnswerForm(case_detail=case_detail)
# blank_form = JsonAnswerForm(case_detail=case_detail)
case_number, case_count = collection.get_index_of_case(case_detail.case, case_count=True)
previous = collection.get_previous_case(case_detail.case)
next = collection.get_next_case(case_detail.case)
return render(
request, "atlas/collection_case_detail.html", {"case_detail": case_detail,
"form": form, "example_form": example_form,
}
request,
"atlas/collection_case_detail.html",
{
"case_detail": case_detail,
"form": form,
"example_form": example_form,
"collection": collection,
"case": case_detail.case,
"previous": previous,
"next": next,
"collection_length": case_count,
"case_number": case_number,
},
)
@user_is_collection_author_or_atlas_editor
def collection_mark_overview(request, pk):
collection = get_object_or_404(CaseCollection, pk=pk)
@@ -1861,14 +1889,15 @@ def collection_take_overview(
},
)
def collection_case_view_take_user_answers(request, pk: int, case_number: int):
return collection_case_view_take_answers(request, pk, case_number)
def collection_case_view_take_answers(
request, pk: int, case_number: int, cid=None, passcode=None
):
"""
"""
""" """
collection = get_object_or_404(CaseCollection, pk=pk)
collection.check_user_can_take(cid, passcode, request.user)
@@ -1891,6 +1920,7 @@ def collection_case_view_take_answers(
},
)
def collection_case_view_take_user(request, pk: int, case_number: int):
return collection_case_view_take(request, pk, case_number)
@@ -1932,9 +1962,8 @@ def collection_case_view_take(
cid_user_exam.save()
if not collection.review_only():
case_detail = CaseDetail.objects.get(case=case, collection=collection)
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
@@ -1943,12 +1972,24 @@ def collection_case_view_take(
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()
ReportAnswerForm = CidQuestionAnswerForm
else:
answer = case_detail.userreportanswer_set.filter(
user=request.user
).first()
ReportAnswerForm = UserQuestionAnswerForm
if request.method == "POST":
if collection.collection_type == "REP":
if collection.collection_type in ("REP", "QUE"):
if not collection.publish_results:
if answer:
form = ReportAnswerForm(request.POST, instance=answer, case_detail=case_detail)
form = ReportAnswerForm(
request.POST, instance=answer, case_detail=case_detail
)
else:
form = ReportAnswerForm(request.POST, case_detail=case_detail)
@@ -1993,7 +2034,7 @@ def collection_case_view_take(
**kwargs,
)
else:
if collection.collection_type == "REP":
if collection.collection_type in ("REP", "QUE"):
form = ReportAnswerForm(instance=answer, case_detail=case_detail)
series_list = case.series.all().prefetch_related("images", "examination", "plane")
@@ -2007,9 +2048,13 @@ def collection_case_view_take(
if (
collection.publish_results
or cid_user_exam.completed
or (answer is not None and answer.completed)
or (
not collection.feedback_once_collection_complete
and answer is not None
and answer.completed
)
):
completed = True
question_completed = True
show_title = collection.show_title_post
show_history = collection.show_history_post
show_description = collection.show_description_post
@@ -2020,7 +2065,7 @@ def collection_case_view_take(
resources = case.caseresource_set.all()
else:
completed = False
question_completed = False
show_title = collection.show_title_pre
show_history = collection.show_history_pre
show_description = collection.show_description_pre
@@ -2051,7 +2096,7 @@ def collection_case_view_take(
"show_report": show_report,
"resources": resources,
"cid_user_exam": cid_user_exam,
"completed": completed,
"question_completed": question_completed,
"self_review": self_review,
},
)
@@ -2525,6 +2570,7 @@ class CaseAuthorUpdate(RevisionMixin, AuthorRequiredMixin, UpdateView):
context["collection"] = context["object"]
return context
class SeriesAuthorUpdate(RevisionMixin, AuthorRequiredMixin, UpdateView):
model = Series
form_class = SeriesAuthorForm
@@ -2535,9 +2581,48 @@ class SeriesAuthorUpdate(RevisionMixin, AuthorRequiredMixin, UpdateView):
context["collection"] = context["object"]
return context
def question_schemas_preset(request):
schemas = [
json.dumps({'type': 'object', 'title': 'Questions', 'required': ['laterality', 'diagnosis'], 'properties': {'test': {'type': 'string', 'title': 'test string', 'description': 'What side is the lesion on?'}, 'diagnosis': {'enum': ['Meningioma', 'Schwannoma', 'Neurofibroma', 'Ependymoma'], 'type': 'string', 'title': 'Diagnosis', 'description': 'What is the diagnosis?'}, 'laterality': {'enum': ['left', 'right'], 'type': 'string', 'title': 'Laterality', 'widget': 'radio', 'description': 'What side is the lesion on?'}, 'laterality (copy 2)': {'enum': ['left', 'right'], 'type': 'string', 'title': 'Lateralityaoue', 'widget': 'radio', 'description': 'What side is the lesion on?'}}}),
json.dumps(
{
"type": "object",
"title": "Questions",
"required": ["laterality", "diagnosis"],
"properties": {
"test": {
"type": "string",
"title": "test string",
"description": "What side is the lesion on?",
},
"diagnosis": {
"enum": [
"Meningioma",
"Schwannoma",
"Neurofibroma",
"Ependymoma",
],
"type": "string",
"title": "Diagnosis",
"description": "What is the diagnosis?",
},
"laterality": {
"enum": ["left", "right"],
"type": "string",
"title": "Laterality",
"widget": "radio",
"description": "What side is the lesion on?",
},
"laterality (copy 2)": {
"enum": ["left", "right"],
"type": "string",
"title": "Lateralityaoue",
"widget": "radio",
"description": "What side is the lesion on?",
},
},
}
),
]
return render(
@@ -2548,14 +2633,17 @@ def question_schemas_preset(request):
},
)
def collection_question_schemas(request, exam_id: int):
collection = get_object_or_404(CaseCollection, pk=exam_id)
questions = collection.cases.all().prefetch_related()
case_details = CaseDetail.objects.filter(
case__in=questions, collection=collection
).prefetch_related("case").order_by("sort_order")
case_details = (
CaseDetail.objects.filter(case__in=questions, collection=collection)
.prefetch_related("case")
.order_by("sort_order")
)
return render(
request,
@@ -2564,4 +2652,4 @@ def collection_question_schemas(request, exam_id: int):
"collection": collection,
"case_details": case_details,
},
)
)