From bd9600cc08de9a33c73658438d3b8ea1559cc3a7 Mon Sep 17 00:00:00 2001 From: Jannat Patel Date: Fri, 16 May 2025 11:07:47 +0530 Subject: [PATCH] fix: list index error on quiz submission --- .../src/components/Modals/EvaluationModal.vue | 2 +- frontend/src/components/Quiz.vue | 2 +- frontend/src/pages/QuizSubmission.vue | 2 +- lms/lms/doctype/lms_quiz/lms_quiz.py | 108 +++++++++++------- 4 files changed, 70 insertions(+), 44 deletions(-) diff --git a/frontend/src/components/Modals/EvaluationModal.vue b/frontend/src/components/Modals/EvaluationModal.vue index 93488fe5..8c48ccae 100644 --- a/frontend/src/components/Modals/EvaluationModal.vue +++ b/frontend/src/components/Modals/EvaluationModal.vue @@ -148,7 +148,7 @@ function submitEvaluation(close) { unavailabilityMessage = false } - toast.warn(__('Evaluator is unavailable')) + toast.warning(__('Evaluator is unavailable')) }, }) } diff --git a/frontend/src/components/Quiz.vue b/frontend/src/components/Quiz.vue index 4b81c6ec..c1b0f04a 100644 --- a/frontend/src/components/Quiz.vue +++ b/frontend/src/components/Quiz.vue @@ -494,7 +494,7 @@ const getAnswers = () => { const checkAnswer = () => { let answers = getAnswers() if (!answers.length) { - toast.warn(__('Please select an option')) + toast.warning(__('Please select an option')) return } diff --git a/frontend/src/pages/QuizSubmission.vue b/frontend/src/pages/QuizSubmission.vue index 4438f30b..c173a148 100644 --- a/frontend/src/pages/QuizSubmission.vue +++ b/frontend/src/pages/QuizSubmission.vue @@ -155,7 +155,7 @@ const saveSubmission = () => { usePageMeta(() => { return { - title: `${submisisonDetails.doc.quiz_title}`, + title: `${submisisonDetails.doc?.quiz_title}`, icon: brand.favicon, } }) diff --git a/lms/lms/doctype/lms_quiz/lms_quiz.py b/lms/lms/doctype/lms_quiz/lms_quiz.py index f5acb29c..4c723c15 100644 --- a/lms/lms/doctype/lms_quiz/lms_quiz.py +++ b/lms/lms/doctype/lms_quiz/lms_quiz.py @@ -96,9 +96,7 @@ def set_total_marks(questions): @frappe.whitelist() def quiz_summary(quiz, results): - score = 0 results = results and json.loads(results) - is_open_ended = False percentage = 0 quiz_details = frappe.db.get_value( @@ -108,7 +106,32 @@ def quiz_summary(quiz, results): as_dict=1, ) + data = process_results(results, quiz) + results = data["results"] + score = data["score"] + is_open_ended = data["is_open_ended"] + score_out_of = quiz_details.total_marks + percentage = (score / score_out_of) * 100 + submission = create_submission( + quiz, results, score_out_of, quiz_details.passing_percentage + ) + + save_progress_after_quiz(quiz_details, percentage) + + return { + "score": score, + "score_out_of": score_out_of, + "submission": submission.name, + "pass": percentage == quiz_details.passing_percentage, + "percentage": percentage, + "is_open_ended": is_open_ended, + } + + +def process_results(results, quiz): + score = 0 + is_open_ended = False for result in results: question_details = frappe.db.get_value( @@ -123,55 +146,28 @@ def quiz_summary(quiz, results): result["marks_out_of"] = question_details.marks if question_details.type != "Open Ended": - correct = result["is_correct"][0] - for point in result["is_correct"]: - correct = correct and point - result["is_correct"] = correct + if len(result["is_correct"]): + correct = result["is_correct"][0] + for point in result["is_correct"]: + correct = correct and point + result["is_correct"] = correct + else: + result["is_correct"] = 0 marks = question_details.marks if correct else 0 result["marks"] = marks score += marks else: - result["is_correct"] = 0 is_open_ended = True - - percentage = (score / score_out_of) * 100 - result["answer"] = re.sub( - r']*src\s*=\s*["\'](?=data:)(.*?)["\']', _save_file, result["answer"] - ) - - submission = frappe.new_doc("LMS Quiz Submission") - # Score and percentage are calculated by the controller function - submission.update( - { - "doctype": "LMS Quiz Submission", - "quiz": quiz, - "result": results, - "score": 0, - "score_out_of": score_out_of, - "member": frappe.session.user, - "percentage": 0, - "passing_percentage": quiz_details.passing_percentage, - } - ) - submission.save(ignore_permissions=True) - - if ( - percentage >= quiz_details.passing_percentage - and quiz_details.lesson - and quiz_details.course - ): - save_progress(quiz_details.lesson, quiz_details.course) - elif not quiz_details.passing_percentage: - save_progress(quiz_details.lesson, quiz_details.course) + result["is_correct"] = 0 + result["answer"] = re.sub( + r']*src\s*=\s*["\'](?=data:)(.*?)["\']', _save_file, result["answer"] + ) return { + "results": results, "score": score, - "score_out_of": score_out_of, - "submission": submission.name, - "pass": percentage == quiz_details.passing_percentage, - "percentage": percentage, "is_open_ended": is_open_ended, } @@ -219,6 +215,36 @@ def get_corrupted_image_msg(): return _("Image: Corrupted Data Stream") +def create_submission(quiz, results, score_out_of, passing_percentage): + submission = frappe.new_doc("LMS Quiz Submission") + # Score and percentage are calculated by the controller function + submission.update( + { + "doctype": "LMS Quiz Submission", + "quiz": quiz, + "result": results, + "score": 0, + "score_out_of": score_out_of, + "member": frappe.session.user, + "percentage": 0, + "passing_percentage": passing_percentage, + } + ) + submission.save(ignore_permissions=True) + return submission + + +def save_progress_after_quiz(quiz_details, percentage): + if ( + percentage >= quiz_details.passing_percentage + and quiz_details.lesson + and quiz_details.course + ): + save_progress(quiz_details.lesson, quiz_details.course) + elif not quiz_details.passing_percentage: + save_progress(quiz_details.lesson, quiz_details.course) + + @frappe.whitelist() def get_question_details(question): if frappe.db.exists("LMS Quiz Question", question):