diff --git a/atlas/forms.py b/atlas/forms.py index 19c83027..69fb8692 100755 --- a/atlas/forms.py +++ b/atlas/forms.py @@ -14,6 +14,7 @@ from django.forms import inlineformset_factory from atlas.models import ( Case, CaseCollection, + CidReportAnswer, Differential, Finding, Series, @@ -396,3 +397,12 @@ SeriesImageFormSet = inlineformset_factory( extra=0, max_num=2000, ) + +class CidReportAnswerForm(ModelForm): + class Meta: + model = CidReportAnswer + fields = ["answer"] + + def __init__(self, *args, **kwargs): + super(CidReportAnswerForm, self).__init__(*args, **kwargs) + self.fields['answer'].required = False \ No newline at end of file diff --git a/atlas/views.py b/atlas/views.py index 840ad7ed..3cd3e7ad 100755 --- a/atlas/views.py +++ b/atlas/views.py @@ -2,6 +2,7 @@ import json from dal import autocomplete from django.shortcuts import render, get_object_or_404, redirect from django import forms +from django.utils import timezone # from django.contrib.auth.models import User from django.contrib.auth.decorators import login_required, user_passes_test @@ -26,10 +27,13 @@ from django.urls import reverse_lazy, reverse from django.http import Http404, JsonResponse from django.http import HttpResponseRedirect, HttpResponse +from generic.models import CidUser + from .forms import ( CaseCollectionCaseFormSet, CaseCollectionForm, CaseForm, + CidReportAnswerForm, ConditionForm, FindingForm, SeriesForm, @@ -42,6 +46,7 @@ from .forms import ( from .models import ( Case, CaseCollection, + CaseDetail, Condition, PathologicalProcess, Presentation, @@ -1066,15 +1071,55 @@ def collection_case_view_take(request, pk, case_number, cid, passcode): def collection_case_view(request, pk, case_number, take=False, cid=None, passcode=None): collection = get_object_or_404(CaseCollection, pk=pk) + + form = None if take: + if not collection.active: + raise Http404("Exam not found") + if not collection.check_cid_user(cid, passcode, request): raise Http404("Error accessing exam") - cases = collection.cases.all().order_by("casedetail__sort_order").prefetch_related() case = cases[case_number] + if take: + c = CidUser.objects.filter(cid=cid).first() + cid_user_exam = collection.get_or_create_cid_user_exam(cid_user=c) + case_detail = CaseDetail.objects.get(case=case, collection=collection) + answer = case_detail.get(cid=cid) + + if request.method == "POST": + if answer: + form = CidReportAnswerForm(request.POST, instance=answer) + else: + form = CidReportAnswerForm(request.POST) + if form.is_valid(): + answer = form.save(commit=False) + answer.cid = cid + answer.question = case_detail + # answer.published_date = timezone.now() + answer.save() + + cid_user_exam.end_time = timezone.now() + cid_user_exam.save() + + kwargs = {"pk": pk, "cid": cid, "passcode": passcode} + + if "next" in request.POST: + return redirect("atlas:collection_case_view_take", case_number=case_number + 1, **kwargs) + elif "previous" in request.POST: + return redirect("atlas:collection_case_view_take", case_number=case_number - 1, **kwargs) + #elif "finish" in request.POST: + # return redirect("atlas:collection_overview_take", **kwargs) + elif "goto" in request.POST: + return redirect( + "atlas:collection_case_view_take", case_number=int(request.POST.get("goto")), **kwargs + ) + else: + form = CidReportAnswerForm(instance=answer) + series_list = case.series.all().prefetch_related("images", "examination", "plane") previous = case_number > 0 @@ -1084,6 +1129,7 @@ def collection_case_view(request, pk, case_number, take=False, cid=None, passcod request, "atlas/collection_case_view.html", { + "form": form, "collection": collection, "case": case, "series_list": series_list, diff --git a/sbas/views.py b/sbas/views.py index 4e6cee31..358bacfa 100644 --- a/sbas/views.py +++ b/sbas/views.py @@ -6,6 +6,7 @@ from sbas.forms import CidUserAnswerForm, ExamForm from django.shortcuts import render, get_object_or_404, redirect from django.views.decorators.csrf import csrf_exempt from django import forms +from django.utils import timezone # from django.contrib.auth.models import User from django.contrib.auth.decorators import login_required, user_passes_test