diff --git a/anatomy/views.py b/anatomy/views.py index 7c3be34e..ef2327ec 100644 --- a/anatomy/views.py +++ b/anatomy/views.py @@ -294,6 +294,157 @@ def mark(request, exam_pk, sk, unmarked_exam_answers_only=True, review=False): n = sk + question_details = { + "total": len(questions), + "current": n + 1, + } + + try: + question: AnatomyQuestion = questions[sk] + except IndexError: + raise Http404("Exam question does not exist") + + if request.method == "POST": + + form = MarkAnatomyQuestionForm(request.POST) + # ******************************* + # TODO: convert to JSON request + # ******************************* + if form.is_valid(): + # If skip button is pressed skip the question without marking + if "skip" in request.POST: + return redirect(mark_url, exam_pk=exam_pk, sk=n + 1) + + cd = form.cleaned_data + + marked_answers = json.loads(cd.get("marked_answers")) + + # This should probably use json (or something else...) + # ajax..... + to_run = ( + ("correct", Answer.MarkOptions.CORRECT), + ("half-correct", Answer.MarkOptions.HALF_MARK), + ("incorrect", Answer.MarkOptions.INCORRECT), + ) + + for status_string, status in to_run: + for ans in marked_answers[status_string]: + ans = ans.strip() + if ans == "": + continue + + a = Answer.objects.filter( + answer__iexact=ans, question_id=question.pk + ).first() + + if a is None: + a = Answer() + a.question_id = question.pk + a.answer = ans + + a.status = status + a.save() + + if "next" in request.POST: + return redirect(mark_url, exam_pk=exam_pk, sk=n + 1) + elif "previous" in request.POST: + return redirect(mark_url, exam_pk=exam_pk, sk=n - 1) + + # Reset user answers (relies on the functional javascript) + unmarked_user_answers = set() + else: + form = MarkAnatomyQuestionForm() + + # correct_answers = question.answers.filter(status=Answer.MarkOptions.CORRECT) + # half_mark_answers = question.answers.filter(status=Answer.MarkOptions.HALF_MARK) + # incorrect_answers = question.answers.filter(status=Answer.MarkOptions.INCORRECT) + + correct_answers = [] + half_mark_answers = [] + incorrect_answers = [] + review_user_answers = [] + unmarked_answers_bool = False + unmarked_user_answers = [] + + if review: + unmarked_user_answers = question.get_user_answers( + exam_pk=exam_pk, include_normal=False + ) + elif unmarked_exam_answers_only: + unmarked_user_answers = question.get_unmarked_user_answers(exam_pk=exam_pk) + else: + unmarked_user_answers = question.get_unmarked_user_answers() + + if not unmarked_exam_answers_only: + correct_answers = question.answers.filter(status=Answer.MarkOptions.CORRECT) + half_mark_answers = question.answers.filter(status=Answer.MarkOptions.HALF_MARK) + incorrect_answers = question.answers.filter(status=Answer.MarkOptions.INCORRECT) + + answer_suggest_incorrect: list = [] + + + if review: + for ans in unmarked_user_answers: + # duplicated from user answer model.... + marked_ans = question.answers.filter(answer_compare__iexact=ans).first() + mark = "unmarked" + if marked_ans is not None: + if marked_ans.status == Answer.MarkOptions.CORRECT: + mark = "correct" + elif marked_ans.status == Answer.MarkOptions.HALF_MARK: + mark = "half-correct" + elif marked_ans.status == Answer.MarkOptions.INCORRECT: + mark = "incorrect" + if mark == "unmarked": + unmarked_answers_bool = True + review_user_answers.append((ans, mark)) + else: + for ans in unmarked_user_answers: + for suggest_incorrect in question.answer_suggest_incorrect: + if suggest_incorrect in ans: + answer_suggest_incorrect.append(ans) + break + + words_present: set = set() + words_present_in_correct: set = set() + + for ans in correct_answers: + answer_words = set(ans.get_constituent_words()) + words_present.update(answer_words) + words_present_in_correct.update(answer_words) + + for ans in half_mark_answers: + answer_words = set(ans.get_constituent_words()) + words_present.update(answer_words) + words_present_in_correct.update(answer_words) + + for ans in incorrect_answers: + answer_words = set(ans.get_constituent_words()) + words_present.update(answer_words) + + words_suggest_incorrect = words_present - words_present_in_correct - set(question.answer_suggest_incorrect) + + return render( + request, + "anatomy/mark.html", + { + "exam": exam, + "form": form, + "review": review, + "question": question, + "question_number": n, + "question_details": question_details, + "unmarked_answers_bool": unmarked_answers_bool, + "user_answers": unmarked_user_answers, + "review_user_answers": review_user_answers, + "correct_answers": correct_answers, + "half_mark_answers": half_mark_answers, + "incorrect_answers": incorrect_answers, + "unmarked_exam_answers_only": unmarked_exam_answers_only, + "answer_suggest_incorrect": answer_suggest_incorrect, + "words_suggest_incorrect": words_suggest_incorrect, + }, + ) @login_required @@ -472,157 +623,6 @@ def exam_review_question_summary(request, pk: int, q_index: int): return render(request, "anatomy/partials/exam_review_question_summary_fragment.html", context) - question_details = { - "total": len(questions), - "current": n + 1, - } - - try: - question: AnatomyQuestion = questions[sk] - except IndexError: - raise Http404("Exam question does not exist") - - if request.method == "POST": - - form = MarkAnatomyQuestionForm(request.POST) - # ******************************* - # TODO: convert to JSON request - # ******************************* - if form.is_valid(): - # If skip button is pressed skip the question without marking - if "skip" in request.POST: - return redirect(mark_url, exam_pk=exam_pk, sk=n + 1) - - cd = form.cleaned_data - - marked_answers = json.loads(cd.get("marked_answers")) - - # This should probably use json (or something else...) - # ajax..... - to_run = ( - ("correct", Answer.MarkOptions.CORRECT), - ("half-correct", Answer.MarkOptions.HALF_MARK), - ("incorrect", Answer.MarkOptions.INCORRECT), - ) - - for status_string, status in to_run: - for ans in marked_answers[status_string]: - ans = ans.strip() - if ans == "": - continue - - a = Answer.objects.filter( - answer__iexact=ans, question_id=question.pk - ).first() - - if a is None: - a = Answer() - a.question_id = question.pk - a.answer = ans - - a.status = status - a.save() - - if "next" in request.POST: - return redirect(mark_url, exam_pk=exam_pk, sk=n + 1) - elif "previous" in request.POST: - return redirect(mark_url, exam_pk=exam_pk, sk=n - 1) - - # Reset user answers (relies on the functional javascript) - unmarked_user_answers = set() - else: - form = MarkAnatomyQuestionForm() - - # correct_answers = question.answers.filter(status=Answer.MarkOptions.CORRECT) - # half_mark_answers = question.answers.filter(status=Answer.MarkOptions.HALF_MARK) - # incorrect_answers = question.answers.filter(status=Answer.MarkOptions.INCORRECT) - - correct_answers = [] - half_mark_answers = [] - incorrect_answers = [] - review_user_answers = [] - unmarked_answers_bool = False - unmarked_user_answers = [] - - if review: - unmarked_user_answers = question.get_user_answers( - exam_pk=exam_pk, include_normal=False - ) - elif unmarked_exam_answers_only: - unmarked_user_answers = question.get_unmarked_user_answers(exam_pk=exam_pk) - else: - unmarked_user_answers = question.get_unmarked_user_answers() - - if not unmarked_exam_answers_only: - correct_answers = question.answers.filter(status=Answer.MarkOptions.CORRECT) - half_mark_answers = question.answers.filter(status=Answer.MarkOptions.HALF_MARK) - incorrect_answers = question.answers.filter(status=Answer.MarkOptions.INCORRECT) - - answer_suggest_incorrect: list = [] - - - if review: - for ans in unmarked_user_answers: - # duplicated from user answer model.... - marked_ans = question.answers.filter(answer_compare__iexact=ans).first() - mark = "unmarked" - if marked_ans is not None: - if marked_ans.status == Answer.MarkOptions.CORRECT: - mark = "correct" - elif marked_ans.status == Answer.MarkOptions.HALF_MARK: - mark = "half-correct" - elif marked_ans.status == Answer.MarkOptions.INCORRECT: - mark = "incorrect" - if mark == "unmarked": - unmarked_answers_bool = True - review_user_answers.append((ans, mark)) - else: - for ans in unmarked_user_answers: - for suggest_incorrect in question.answer_suggest_incorrect: - if suggest_incorrect in ans: - answer_suggest_incorrect.append(ans) - break - - words_present: set = set() - words_present_in_correct: set = set() - - for ans in correct_answers: - answer_words = set(ans.get_constituent_words()) - words_present.update(answer_words) - words_present_in_correct.update(answer_words) - - for ans in half_mark_answers: - answer_words = set(ans.get_constituent_words()) - words_present.update(answer_words) - words_present_in_correct.update(answer_words) - - for ans in incorrect_answers: - answer_words = set(ans.get_constituent_words()) - words_present.update(answer_words) - - words_suggest_incorrect = words_present - words_present_in_correct - set(question.answer_suggest_incorrect) - - return render( - request, - "anatomy/mark.html", - { - "exam": exam, - "form": form, - "review": review, - "question": question, - "question_number": n, - "question_details": question_details, - "unmarked_answers_bool": unmarked_answers_bool, - "user_answers": unmarked_user_answers, - "review_user_answers": review_user_answers, - "correct_answers": correct_answers, - "half_mark_answers": half_mark_answers, - "incorrect_answers": incorrect_answers, - "unmarked_exam_answers_only": unmarked_exam_answers_only, - "answer_suggest_incorrect": answer_suggest_incorrect, - "words_suggest_incorrect": words_suggest_incorrect, - }, - ) #@login_required