From 7397bf389eedc0348b6e5ff1fa6e765f284fd54f Mon Sep 17 00:00:00 2001 From: Jannat Patel Date: Fri, 19 Aug 2022 11:43:49 +0530 Subject: [PATCH] feat: add a new quiz --- lms/lms/doctype/lms_course/lms_course.py | 1 + lms/lms/doctype/lms_quiz/lms_quiz.py | 29 +++++++++++++++++ lms/public/js/common_functions.js | 3 -- lms/www/batch/quiz.js | 41 +++++++++++++++--------- 4 files changed, 56 insertions(+), 18 deletions(-) diff --git a/lms/lms/doctype/lms_course/lms_course.py b/lms/lms/doctype/lms_course/lms_course.py index 001c440a..ad3fae22 100644 --- a/lms/lms/doctype/lms_course/lms_course.py +++ b/lms/lms/doctype/lms_course/lms_course.py @@ -258,6 +258,7 @@ def save_chapter(course, title, chapter_description, idx, chapter): return doc.name + @frappe.whitelist() def save_lesson(title, body, chapter, preview, idx, lesson): if lesson: diff --git a/lms/lms/doctype/lms_quiz/lms_quiz.py b/lms/lms/doctype/lms_quiz/lms_quiz.py index 22d19337..7cb5e101 100644 --- a/lms/lms/doctype/lms_quiz/lms_quiz.py +++ b/lms/lms/doctype/lms_quiz/lms_quiz.py @@ -5,6 +5,7 @@ import frappe from frappe.model.document import Document import json from frappe import _ +from frappe.utils import cstr class LMSQuiz(Document): def validate(self): @@ -77,3 +78,31 @@ def quiz_summary(quiz, results): }).save(ignore_permissions=True) return score + + +@frappe.whitelist() +def save_quiz(quiz_title, questions): + doc = frappe.get_doc({ + "doctype": "LMS Quiz", + "title": quiz_title + }) + doc.save(ignore_permissions=True) + for index, row in enumerate(json.loads(questions)): + question_details = { + "doctype": "LMS Quiz Question", + "parent": doc.name, + "question": row["question"], + "parenttype": "LMS Quiz", + "parentfield": "questions", + "idx": index + 1 + } + + for num in range(1,5): + question_details["option_" + cstr(num)] = row["option_" + cstr(num)] + question_details["explanation_" + cstr(num)] = row["explanation_" + cstr(num)] + question_details["is_correct_" + cstr(num)] = row["is_correct_" + cstr(num)] + + question_doc = frappe.get_doc(question_details) + question_doc.save(ignore_permissions=True) + + return doc.name diff --git a/lms/public/js/common_functions.js b/lms/public/js/common_functions.js index dedd0250..c44dcb9e 100644 --- a/lms/public/js/common_functions.js +++ b/lms/public/js/common_functions.js @@ -135,9 +135,6 @@ const scroll_to_chapter_container = () => { const save_chapter = (e) => { let target = $(e.currentTarget); let parent = target.closest(".chapter-parent"); - console.log(parent) - console.log(parent.find(".chapter-description")) - debugger; frappe.call({ method: "lms.lms.doctype.lms_course.lms_course.save_chapter", args: { diff --git a/lms/www/batch/quiz.js b/lms/www/batch/quiz.js index 86b98ddd..09ba2404 100644 --- a/lms/www/batch/quiz.js +++ b/lms/www/batch/quiz.js @@ -12,7 +12,7 @@ frappe.ready(() => { const add_question = (e) => { - let add_after = $(".quiz-card").length ? $(".quiz-card") : $("#quiz-title"); + let add_after = $(".quiz-card").length ? $(".quiz-card:last") : $("#quiz-title"); let question_template = `
`; @@ -52,16 +52,14 @@ const save_question = (e) => { if (!$("#quiz-title").text()) { frappe.throw(__("Quiz Title is mandatory.")); } - console.log(get_questions()); - debugger; frappe.call({ - method: lms.lms.doctype.lms_quiz.lms_quiz.save_quiz, + method: "lms.lms.doctype.lms_quiz.lms_quiz.save_quiz", args: { - "quiz-title": $("#quiz-title"), + "quiz_title": $("#quiz-title").text(), "questions": get_questions() }, callback: (data) => { - + window.location.href = "/quizzes"; } }); }; @@ -70,22 +68,35 @@ const save_question = (e) => { const get_questions = () => { let questions = []; - $(".quiz-card").each((i, elem) => { + $(".quiz-card").each((i, el) => { - if (!$(elem).find(".question").text()) + if (!$(el).find(".question").text()) return; - let question_details = {}; - question_details["question"] = $(elem).find(".question").text(); + let details = {}; + let one_correct_option = false; + details["question"] = $(el).find(".question").text(); Array.from({length: 4}, (x, i) => { let num = i + 1; - question_details[`option_${num}`] = $(`.option-${num} .option-input:first`).text(); - question_details[`explanation_${num}`] = $(`.option-${num} .option-input:last`).text(); - question_details[`is_correct_${num}`] = $(`.option-${num} .option-checkbox`).find("input").prop("checked"); + details[`option_${num}`] = $(el).find(`.option-${num} .option-input:first`).text(); + details[`explanation_${num}`] = $(el).find(`.option-${num} .option-input:last`).text(); + + let is_correct = $(el).find(`.option-${num} .option-checkbox`).find("input").prop("checked"); + if (is_correct) + one_correct_option = true; + + details[`is_correct_${num}`] = is_correct; }); - questions.push(question_details); + + if (!details["option_1"] || !details["option_2"]) { + frappe.throw(__("Each question must have at least two options.")) + } + + if (!one_correct_option) + frappe.throw(__("Each question must have at least one correct option.")) + questions.push(details); }); - return questions + return questions; };