From 5aba690318daa4900598210a50b30d12ac402f57 Mon Sep 17 00:00:00 2001 From: Jannat Patel Date: Fri, 19 Aug 2022 18:22:43 +0530 Subject: [PATCH] feat: update quiz --- .../doctype/course_lesson/course_lesson.py | 2 +- lms/lms/doctype/lms_course/lms_course.py | 15 +----- lms/lms/doctype/lms_quiz/lms_quiz.json | 6 +-- lms/lms/doctype/lms_quiz/lms_quiz.py | 53 +++++++++++++------ lms/lms/utils.py | 9 ++++ lms/www/batch/quiz.html | 37 +++++++------ lms/www/batch/quiz.js | 12 +++-- lms/www/batch/quiz.py | 9 ++-- lms/www/batch/quiz_list.html | 10 ++-- 9 files changed, 92 insertions(+), 61 deletions(-) diff --git a/lms/lms/doctype/course_lesson/course_lesson.py b/lms/lms/doctype/course_lesson/course_lesson.py index 04504d5e..ac639e24 100644 --- a/lms/lms/doctype/course_lesson/course_lesson.py +++ b/lms/lms/doctype/course_lesson/course_lesson.py @@ -29,7 +29,7 @@ class CourseLesson(Document): e = frappe.get_doc(doctype_map[section], name) e.lesson = self.name e.index_ = index - e.save() + e.save(ignore_permissions=True) index += 1 self.update_orphan_documents(doctype_map[section], documents) diff --git a/lms/lms/doctype/lms_course/lms_course.py b/lms/lms/doctype/lms_course/lms_course.py index ad3fae22..855c4034 100644 --- a/lms/lms/doctype/lms_course/lms_course.py +++ b/lms/lms/doctype/lms_course/lms_course.py @@ -5,7 +5,7 @@ from __future__ import unicode_literals import frappe from frappe.model.document import Document import json -from ...utils import slugify +from ...utils import generate_slug from frappe.utils import flt, cint from lms.lms.utils import get_chapters @@ -59,22 +59,11 @@ class LMSCourse(Document): frappe.enqueue(method=frappe.sendmail, queue='short', timeout=300, is_async=True, **email_args) frappe.db.set_value("LMS Course Interest", user.name, "email_sent", True) - @staticmethod - def find(name): - """Returns the course with specified name. - """ - return find("LMS Course", published=True, name=name) def autoname(self): if not self.name: - self.name = self.generate_slug(title=self.title) + self.name = generate_slug(self.title, "LMS Course") - def generate_slug(self, title): - result = frappe.get_all( - 'LMS Course', - fields=['name']) - slugs = set([row['name'] for row in result]) - return slugify(title, used_slugs=slugs) def __repr__(self): return f"" diff --git a/lms/lms/doctype/lms_quiz/lms_quiz.json b/lms/lms/doctype/lms_quiz/lms_quiz.json index e68caf67..99ffc184 100644 --- a/lms/lms/doctype/lms_quiz/lms_quiz.json +++ b/lms/lms/doctype/lms_quiz/lms_quiz.json @@ -2,7 +2,6 @@ "actions": [], "allow_import": 1, "allow_rename": 1, - "autoname": "field:title", "creation": "2021-06-07 10:50:17.893625", "doctype": "DocType", "editable_grid": 1, @@ -18,7 +17,9 @@ { "fieldname": "title", "fieldtype": "Data", + "in_list_view": 1, "label": "Title", + "reqd": 1, "unique": 1 }, { @@ -49,11 +50,10 @@ ], "index_web_pages_for_search": 1, "links": [], - "modified": "2022-05-16 14:47:55.364743", + "modified": "2022-08-19 17:54:41.685182", "modified_by": "Administrator", "module": "LMS", "name": "LMS Quiz", - "naming_rule": "By fieldname", "owner": "Administrator", "permissions": [ { diff --git a/lms/lms/doctype/lms_quiz/lms_quiz.py b/lms/lms/doctype/lms_quiz/lms_quiz.py index 7cb5e101..8b5f79cb 100644 --- a/lms/lms/doctype/lms_quiz/lms_quiz.py +++ b/lms/lms/doctype/lms_quiz/lms_quiz.py @@ -6,8 +6,15 @@ from frappe.model.document import Document import json from frappe import _ from frappe.utils import cstr +from lms.lms.utils import generate_slug class LMSQuiz(Document): + + def autoname(self): + if not self.name: + self.name = generate_slug(self.title, "LMS Quiz") + + def validate(self): self.validate_correct_answers() @@ -20,7 +27,7 @@ class LMSQuiz(Document): question.multiple = 1 if not len(correct_options): - frappe.throw(_("At least one answer must be correct for this question: {0}").format(frappe.bold(question.question))) + frappe.throw(_("At least one option must be correct for this question: {0}").format(frappe.bold(question.question))) def get_correct_options(self, question): @@ -81,28 +88,42 @@ def quiz_summary(quiz, results): @frappe.whitelist() -def save_quiz(quiz_title, questions): - doc = frappe.get_doc({ - "doctype": "LMS Quiz", +def save_quiz(quiz_title, questions, quiz): + if quiz: + doc = frappe.get_doc("LMS Quiz", quiz) + else: + doc = frappe.get_doc({ + "doctype": "LMS Quiz", + }) + + doc.update({ "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 - } + if row["question_name"]: + question_doc = frappe.get_doc("LMS Quiz Question", row["question_name"]) + else: + question_doc = frappe.get_doc({ + "doctype": "LMS Quiz Question", + "parent": doc.name, + "parenttype": "LMS Quiz", + "parentfield": "questions", + "idx": index + 1 + }) + + question_doc.update({ + "question": row["question"] + }) 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.update({ + "option_" + cstr(num): row["option_" + cstr(num)], + "explanation_" + cstr(num): row["explanation_" + cstr(num)], + "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/lms/utils.py b/lms/lms/utils.py index 93e811c8..88f617c1 100644 --- a/lms/lms/utils.py +++ b/lms/lms/utils.py @@ -33,6 +33,15 @@ def slugify(title, used_slugs=[]): return new_slug count = count+1 + +def generate_slug(title, doctype): + result = frappe.get_all( + doctype, + fields=['name']) + slugs = set([row['name'] for row in result]) + return slugify(title, used_slugs=slugs) + + def get_membership(course, member, batch=None): filters = { "member": member, diff --git a/lms/www/batch/quiz.html b/lms/www/batch/quiz.html index 619439a7..a09d96d1 100644 --- a/lms/www/batch/quiz.html +++ b/lms/www/batch/quiz.html @@ -21,7 +21,7 @@ {% macro BreadCrumb(quiz) %} @@ -32,42 +32,45 @@
{% if quiz.title %}{{ quiz.title }}{% endif %}
- -
- - -
+ {% if quiz.name %} data-name="{{ quiz.name }}" {% endif %} + contenteditable="true" >{% if quiz.title %}{{ quiz.title }}{% endif %}
- {% if quiz.question %} + {% if quiz.questions %} {% for question in quiz.questions %}
-
{% if question.question %} {{ question.question }} {% endif %}
+
{% if question.question %} {{ question.question }} {% endif %}
- {% for num in range(1,5) %} - {% set option = question["option_" + frappe.utils.cstr(num)] %} - {% set explanation = question["explanation_" + frappe.utils.cstr(num)] %} + {% for i in range(1,5) %} + {% set num = frappe.utils.cstr(i) %} + {% set option = question["option_" + num] %} + {% set explanation = question["explanation_" + num] %}
- -
+ +
{% if option %}{{ option }}{% endif %}
{% if explanation %}{{ explanation }}{% endif %}
- +
{% endfor %}
- {% endfor %} {% endif %} + + +
+ + +
{% endmacro %} diff --git a/lms/www/batch/quiz.js b/lms/www/batch/quiz.js index 09ba2404..10c6698f 100644 --- a/lms/www/batch/quiz.js +++ b/lms/www/batch/quiz.js @@ -8,6 +8,8 @@ frappe.ready(() => { save_question(e); }); + get_questions() + }); @@ -56,7 +58,8 @@ const save_question = (e) => { method: "lms.lms.doctype.lms_quiz.lms_quiz.save_quiz", args: { "quiz_title": $("#quiz-title").text(), - "questions": get_questions() + "questions": get_questions(), + "quiz": $("#quiz-title").data("name") || "" }, callback: (data) => { window.location.href = "/quizzes"; @@ -69,16 +72,17 @@ const get_questions = () => { let questions = []; $(".quiz-card").each((i, el) => { - if (!$(el).find(".question").text()) return; let details = {}; let one_correct_option = false; details["question"] = $(el).find(".question").text(); + details["question_name"] = $(el).find(".question").data("question") || ""; Array.from({length: 4}, (x, i) => { let num = i + 1; + details[`option_${num}`] = $(el).find(`.option-${num} .option-input:first`).text(); details[`explanation_${num}`] = $(el).find(`.option-${num} .option-input:last`).text(); @@ -89,12 +93,12 @@ const get_questions = () => { details[`is_correct_${num}`] = is_correct; }); - if (!details["option_1"] || !details["option_2"]) { + 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); }); diff --git a/lms/www/batch/quiz.py b/lms/www/batch/quiz.py index ee0247df..1dfdabed 100644 --- a/lms/www/batch/quiz.py +++ b/lms/www/batch/quiz.py @@ -8,13 +8,14 @@ def get_context(context): context.quiz = frappe._dict() context.quiz.edit_mode = 1 else: - fields_arr = [] + fields_arr = ["name","question"] for num in range(1,5): fields_arr.append("option_" + cstr(num)) fields_arr.append("is_correct_" + cstr(num)) fields_arr.append("explanation_" + cstr(num)) - fields_arr.append("question") - context.quiz = frappe.db.get_value("LMS Quiz", quizname, ["title"], as_dict=1) + + context.quiz = frappe.db.get_value("LMS Quiz", quizname, ["title", "name"], as_dict=1) context.quiz.questions = frappe.get_all("LMS Quiz Question", { "parent": quizname - }, fields_arr) + }, fields_arr, + order_by="idx") diff --git a/lms/www/batch/quiz_list.html b/lms/www/batch/quiz_list.html index c8e3a853..41891b1d 100644 --- a/lms/www/batch/quiz_list.html +++ b/lms/www/batch/quiz_list.html @@ -17,13 +17,17 @@
{{ _("Quiz List") }}
- - - + + + + {% for quiz in quiz_list %} +
{{ _("No.") }} {{ _("Quiz") }}
{{ _("No.") }} {{ _("Title") }} {{ _("ID") }}
{{ loop.index }} + {{ quiz.title }} + {{ quiz.name }}