Numerous improvements to case questions
This commit is contained in:
+127
-39
@@ -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,
|
||||
},
|
||||
)
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user