feat: add a new quiz

This commit is contained in:
Jannat Patel
2022-08-19 11:43:49 +05:30
parent e1b16e9ae3
commit 7397bf389e
4 changed files with 56 additions and 18 deletions

View File

@@ -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:

View File

@@ -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

View File

@@ -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: {

View File

@@ -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 = `<div class="quiz-card">
<div contenteditable="true" data-placeholder="${__("Question")}" class="question mb-4"></div>
</div>`;
@@ -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;
};