From 7087fde686d5b85aa907283cb8efa72eb3a00a20 Mon Sep 17 00:00:00 2001 From: Jannat Patel Date: Thu, 28 Dec 2023 11:59:44 +0530 Subject: [PATCH] feat: quiz base --- frontend/package.json | 3 +- frontend/src/components/CourseOutline.vue | 37 +++-- frontend/src/components/CourseReviews.vue | 4 +- frontend/src/components/Quiz.vue | 83 ++++++++++ frontend/src/main.js | 4 - frontend/src/pages/Lesson.vue | 177 +++++++++++++++++++--- frontend/yarn.lock | 39 +++++ lms/lms/doctype/lms_quiz/lms_quiz.json | 11 +- lms/lms/utils.py | 17 ++- 9 files changed, 334 insertions(+), 41 deletions(-) create mode 100644 frontend/src/components/Quiz.vue diff --git a/frontend/package.json b/frontend/package.json index 8c9e5cfd..0a505648 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -16,7 +16,8 @@ "tailwindcss": "^3.2.7", "vue": "^3.2.25", "dayjs": "^1.11.6", - "vue-router": "^4.0.12" + "vue-router": "^4.0.12", + "markdown-it": "^14.0.0" }, "devDependencies": { "@vitejs/plugin-vue": "^2.0.0", diff --git a/frontend/src/components/CourseOutline.vue b/frontend/src/components/CourseOutline.vue index 5e383814..a2365452 100644 --- a/frontend/src/components/CourseOutline.vue +++ b/frontend/src/components/CourseOutline.vue @@ -1,7 +1,7 @@ \ No newline at end of file diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 7f71fbc5..6eb18631 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -742,6 +742,11 @@ engine.io-parser@~5.2.1: resolved "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz" integrity sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ== +entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + entities@~3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz" @@ -1109,6 +1114,13 @@ linkify-it@^4.0.1: dependencies: uc.micro "^1.0.1" +linkify-it@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-5.0.0.tgz#9ef238bfa6dc70bd8e7f9572b52d369af569b421" + integrity sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ== + dependencies: + uc.micro "^2.0.0" + linkifyjs@^4.1.0: version "4.1.3" resolved "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.1.3.tgz" @@ -1157,11 +1169,28 @@ markdown-it@^13.0.1: mdurl "^1.0.1" uc.micro "^1.0.5" +markdown-it@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-14.0.0.tgz#b4b2ddeb0f925e88d981f84c183b59bac9e3741b" + integrity sha512-seFjF0FIcPt4P9U39Bq1JYblX0KZCjDLFFQPHpL5AzHpqPEKtosxmdq/LTVZnjfH7tjt9BxStm+wXcDBNuYmzw== + dependencies: + argparse "^2.0.1" + entities "^4.4.0" + linkify-it "^5.0.0" + mdurl "^2.0.0" + punycode.js "^2.3.1" + uc.micro "^2.0.0" + mdurl@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz" integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== +mdurl@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-2.0.0.tgz#80676ec0433025dd3e17ee983d0fe8de5a2237e0" + integrity sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w== + merge2@^1.3.0: version "1.4.1" resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" @@ -1515,6 +1544,11 @@ prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.13.3, pros prosemirror-state "^1.0.0" prosemirror-transform "^1.1.0" +punycode.js@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7" + integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== + qalendar@^3.6.1: version "3.6.1" resolved "https://registry.npmjs.org/qalendar/-/qalendar-3.6.1.tgz" @@ -1702,6 +1736,11 @@ uc.micro@^1.0.1, uc.micro@^1.0.5: resolved "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz" integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== +uc.micro@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.0.0.tgz#84b3c335c12b1497fd9e80fcd3bfa7634c363ff1" + integrity sha512-DffL94LsNOccVn4hyfRe5rdKa273swqeA5DJpMOeFmEn1wCDc7nAbbB0gXlgBCL7TNzeTv6G7XVWzan7iJtfig== + update-browserslist-db@^1.0.13: version "1.0.13" resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz" diff --git a/lms/lms/doctype/lms_quiz/lms_quiz.json b/lms/lms/doctype/lms_quiz/lms_quiz.json index a00e1617..ddacb265 100644 --- a/lms/lms/doctype/lms_quiz/lms_quiz.json +++ b/lms/lms/doctype/lms_quiz/lms_quiz.json @@ -122,7 +122,7 @@ ], "index_web_pages_for_search": 1, "links": [], - "modified": "2023-11-07 10:11:49.126789", + "modified": "2023-12-27 12:21:19.289520", "modified_by": "Administrator", "module": "LMS", "name": "LMS Quiz", @@ -163,6 +163,15 @@ "role": "Course Creator", "share": 1, "write": 1 + }, + { + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "LMS Student", + "share": 1 } ], "show_title_field_in_link": 1, diff --git a/lms/lms/utils.py b/lms/lms/utils.py index ab29d491..c75cc8ec 100644 --- a/lms/lms/utils.py +++ b/lms/lms/utils.py @@ -1269,21 +1269,22 @@ def get_course_outline(course): """Returns the course outline.""" outline = [] chapters = frappe.get_all( - "Chapter Reference", {"parent": course}, ["chapter"], order_by="idx" + "Chapter Reference", {"parent": course}, ["chapter", "idx"], order_by="idx" ) for chapter in chapters: chapter_details = frappe.db.get_value( "Course Chapter", chapter.chapter, - ["name", "title", "description", "idx"], + ["name", "title", "description"], as_dict=True, ) + chapter_details["idx"] = chapter.idx chapter_details.lessons = get_lessons(course, chapter_details) outline.append(chapter_details) return outline -@frappe.whitelist() +@frappe.whitelist(allow_guest=True) def get_lesson(course, chapter, lesson): chapter_name = frappe.db.get_value( "Chapter Reference", {"parent": course, "idx": chapter}, "chapter" @@ -1291,6 +1292,16 @@ def get_lesson(course, chapter, lesson): lesson_name = frappe.db.get_value( "Lesson Reference", {"parent": chapter_name, "idx": lesson}, "lesson" ) + lesson_details = frappe.db.get_value( + "Course Lesson", lesson_name, ["include_in_preview", "title"], as_dict=1 + ) + membership = get_membership(course) + if not lesson_details.include_in_preview and not membership: + return { + "no_preview": 1, + "title": lesson_details.title, + } + lesson_details = frappe.db.get_value( "Course Lesson", lesson_name,