diff --git a/community/lms/doctype/lms_quiz/lms_quiz.py b/community/lms/doctype/lms_quiz/lms_quiz.py index de002046..b1fe65a9 100644 --- a/community/lms/doctype/lms_quiz/lms_quiz.py +++ b/community/lms/doctype/lms_quiz/lms_quiz.py @@ -46,34 +46,30 @@ class LMSQuiz(Document): return result[0] @frappe.whitelist() -def submit(quiz, result): +def quiz_summary(quiz, results): score = 0 - answer_map = { - "is_correct_1": "option_1", - "is_correct_2": "option_2", - "is_correct_3": "option_3", - "is_correct_4": "option_4" - } - result = json.loads(result) - quiz_details = frappe.get_doc("LMS Quiz", quiz) + results = json.loads(results) - for response in result: - match = list(filter(lambda x: x.question == response.get("question"), quiz_details.questions))[0] - correct_options = quiz_details.get_correct_options(match) - correct_answers = [ match.get(answer_map[option]) for option in correct_options ] + for result in results: + correct = result["is_correct"][0] + result["question"] = frappe.db.get_value("LMS Quiz Question", + {"parent": quiz, "idx": result["question_index"]}, + ["question"]) - if response.get("answer") == correct_answers: - response["result"] = "Right" - score += 1 - else: - response["result"] = "Wrong" - response["answer"] = ("").join([ ans if idx == len(response.get("answer")) -1 else ans + ", " for idx, ans in enumerate(response.get("answer")) ]) + for point in result["is_correct"]: + correct = correct and point + + result["result"] = "Right" if correct else "Wrong" + score += correct + + del result["is_correct"] + del result["question_index"] frappe.get_doc({ "doctype": "LMS Quiz Submission", "quiz": quiz, - "result": result, + "result": results, "score": score }).save(ignore_permissions=True) - update_progress(quiz_details.lesson) + return score diff --git a/community/lms/doctype/lms_quiz/test_lms_quiz.py b/community/lms/doctype/lms_quiz/test_lms_quiz.py index e2df8fda..77ca72c3 100644 --- a/community/lms/doctype/lms_quiz/test_lms_quiz.py +++ b/community/lms/doctype/lms_quiz/test_lms_quiz.py @@ -3,6 +3,39 @@ # import frappe import unittest +import frappe class TestLMSQuiz(unittest.TestCase): - pass + + @classmethod + def setUpClass(cls) -> None: + frappe.get_doc({ + "doctype": "LMS Quiz", + "title": "Test Quiz" + }).save() + + def test_with_multiple_options(self): + quiz = frappe.get_doc("LMS Quiz", "Test Quiz") + quiz.append("questions", { + "question": "Question multiple", + "option_1": "Option 1", + "is_correct_1": 1, + "option_2": "Option 2", + "is_correct_2": 1 + }) + quiz.save() + self.assertTrue(quiz.questions[0].multiple) + + def test_with_no_correct_option(self): + quiz = frappe.get_doc("LMS Quiz", "Test Quiz") + quiz.append("questions", { + "question": "Question no correct option", + "option_1": "Option 1", + "option_2": "Option 2", + }) + self.assertRaises(frappe.ValidationError, quiz.save) + + @classmethod + def tearDownClass(cls) -> None: + frappe.db.delete("LMS Quiz", "Test Quiz") + frappe.db.delete("LMS Quiz Question", {"parent": "Test Quiz"}) diff --git a/community/lms/doctype/lms_quiz_question/lms_quiz_question.json b/community/lms/doctype/lms_quiz_question/lms_quiz_question.json index b42c6bad..924e696a 100644 --- a/community/lms/doctype/lms_quiz_question/lms_quiz_question.json +++ b/community/lms/doctype/lms_quiz_question/lms_quiz_question.json @@ -9,15 +9,23 @@ "options_section", "option_1", "is_correct_1", + "column_break_5", + "explanation_1", "section_break_5", "option_2", "is_correct_2", + "column_break_10", + "explanation_2", "column_break_4", "option_3", "is_correct_3", + "column_break_15", + "explanation_3", "section_break_11", "option_4", "is_correct_4", + "column_break_20", + "explanation_4", "multiple" ], "fields": [ @@ -101,12 +109,52 @@ { "fieldname": "section_break_11", "fieldtype": "Section Break" + }, + { + "depends_on": "option_1", + "fieldname": "explanation_1", + "fieldtype": "Data", + "label": "Explanation" + }, + { + "depends_on": "option_2", + "fieldname": "explanation_2", + "fieldtype": "Data", + "label": "Explanation" + }, + { + "depends_on": "option_3", + "fieldname": "explanation_3", + "fieldtype": "Data", + "label": "Explanation" + }, + { + "depends_on": "option_4", + "fieldname": "explanation_4", + "fieldtype": "Data", + "label": "Explanation" + }, + { + "fieldname": "column_break_5", + "fieldtype": "Column Break" + }, + { + "fieldname": "column_break_10", + "fieldtype": "Column Break" + }, + { + "fieldname": "column_break_15", + "fieldtype": "Column Break" + }, + { + "fieldname": "column_break_20", + "fieldtype": "Column Break" } ], "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2021-06-22 16:54:13.133859", + "modified": "2021-07-19 19:35:28.446236", "modified_by": "Administrator", "module": "LMS", "name": "LMS Quiz Question", diff --git a/community/public/css/style.css b/community/public/css/style.css index b2b98732..6c6e6a9f 100644 --- a/community/public/css/style.css +++ b/community/public/css/style.css @@ -333,7 +333,7 @@ input[type=checkbox] { .card-divider { border: 1px solid #F4F5F6; - margin-bottom: 16px; + margin-bottom: 1rem; } .card-divider-dark { @@ -487,23 +487,30 @@ input[type=checkbox] { --star-fill: #74808B; } -div.custom-checkbox>label>input { +.custom-checkbox { + display: flex; + align-items: center; +} + +.custom-checkbox>label>input { visibility: hidden; } -div.custom-checkbox>label>img { - height: 20px; - width: 20px; +.custom-checkbox>label>.empty-checkbox { + height: 1.5rem; + width: 1.5rem; border: 1px solid black; border-radius: 5px; } -div.custom-checkbox>label>input:checked+img { - background: url(/assets/community/images/Vector.png); +.custom-checkbox>label>input:checked+.empty-checkbox { + background: url(/assets/community/icons/tick.svg); background-repeat: no-repeat; background-position: center center; - background-size: 15px 15px; - object-fit: contain; +} + +.quiz-label { + margin-bottom: 0; } .course-card-wide { @@ -1013,8 +1020,24 @@ div.custom-checkbox>label>input:checked+img { color: red; } +.quiz-footer { + display: flex; + align-items: center; + justify-content: space-between; +} + .question { flex-direction: column; + width: 688px; + margin: auto; +} + +.question p { + margin-bottom: 0; +} + +.active-question .card-divider { + margin-top: 1rem; } .dark-links { @@ -1057,7 +1080,7 @@ div.custom-checkbox>label>input:checked+img { } .course-content-parent .course-home-headings { - margin: 0px 0px 16px; + margin: 0px 0px 1rem; } .lesson-pagination { diff --git a/community/public/icons/minus-circle-green.svg b/community/public/icons/minus-circle-green.svg new file mode 100644 index 00000000..b1715e62 --- /dev/null +++ b/community/public/icons/minus-circle-green.svg @@ -0,0 +1,4 @@ + diff --git a/community/public/icons/minus-circle.svg b/community/public/icons/minus-circle.svg new file mode 100644 index 00000000..3ec77aab --- /dev/null +++ b/community/public/icons/minus-circle.svg @@ -0,0 +1 @@ + diff --git a/community/public/icons/tick.svg b/community/public/icons/tick.svg index 2275a8d4..1c209899 100644 --- a/community/public/icons/tick.svg +++ b/community/public/icons/tick.svg @@ -1,3 +1 @@ - + \ No newline at end of file diff --git a/community/public/icons/wrong.svg b/community/public/icons/wrong.svg new file mode 100644 index 00000000..454f1c3d --- /dev/null +++ b/community/public/icons/wrong.svg @@ -0,0 +1,3 @@ + diff --git a/community/templates/quiz.html b/community/templates/quiz.html index 0f851400..64457e47 100644 --- a/community/templates/quiz.html +++ b/community/templates/quiz.html @@ -1,33 +1,59 @@ -{% set last_submission = quiz.get_last_submission_details() %} -{% if last_submission %} -