From 61f547733c6b6f2a42785924c65fef9280984d9c Mon Sep 17 00:00:00 2001 From: Fahid Latheef Alungal Date: Wed, 23 Jul 2025 01:22:33 +0530 Subject: [PATCH 1/4] fix: Continue Learning button not working for SCORM Chapters --- frontend/src/pages/Lesson.vue | 9 +++++++++ lms/lms/utils.py | 12 ++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/frontend/src/pages/Lesson.vue b/frontend/src/pages/Lesson.vue index bbf5a96f..5e59b7da 100644 --- a/frontend/src/pages/Lesson.vue +++ b/frontend/src/pages/Lesson.vue @@ -425,6 +425,15 @@ const setupLesson = (data) => { }) return } + if (data.is_scorm_package) { + router.push({ + name: 'SCORMChapter', + params: { + courseName: props.courseName, + chapterName: data.chapter_name, + }, + }) + } lessonProgress.value = data.membership?.progress if (data.content) editor.value = renderEditor('editor', data.content) if ( diff --git a/lms/lms/utils.py b/lms/lms/utils.py index 9f6ef546..5adde244 100644 --- a/lms/lms/utils.py +++ b/lms/lms/utils.py @@ -1222,14 +1222,22 @@ def get_course_outline(course, progress=False): @frappe.whitelist(allow_guest=True) def get_lesson(course, chapter, lesson): chapter_name = frappe.db.get_value("Chapter Reference", {"parent": course, "idx": chapter}, "chapter") + is_scorm_chapter = frappe.db.get_value("Course Chapter", chapter_name, "is_scorm_package") 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", "is_scorm_package"], + ["include_in_preview", "title"], as_dict=1, ) - if not lesson_details or lesson_details.is_scorm_package: + + if is_scorm_chapter: + return { + "is_scorm_package": True, + "chapter_name": chapter_name, + } + + if not lesson_details: return {} membership = get_membership(course) From ee7debeef79b5728870408a1847de74c3dc42dd2 Mon Sep 17 00:00:00 2001 From: Fahid Latheef Alungal Date: Tue, 2 Sep 2025 00:28:26 +0530 Subject: [PATCH 2/4] fix: added missing index for first lesson for SCORM --- lms/lms/api.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lms/lms/api.py b/lms/lms/api.py index 5099f786..9c019509 100644 --- a/lms/lms/api.py +++ b/lms/lms/api.py @@ -1020,7 +1020,7 @@ def upsert_chapter(title, course, is_scorm_package, scorm_package, name=None): chapter.save() if is_scorm_package and not len(chapter.lessons): - add_lesson(title, chapter.name, course) + add_lesson(title, chapter.name, course, 1) return chapter @@ -1092,7 +1092,7 @@ def get_launch_file(extract_path): return launch_file -def add_lesson(title, chapter, course): +def add_lesson(title, chapter, course, idx): lesson = frappe.new_doc("Course Lesson") lesson.update( { @@ -1107,6 +1107,7 @@ def add_lesson(title, chapter, course): lesson_reference.update( { "lesson": lesson.name, + "idx": idx, "parent": chapter, "parenttype": "Course Chapter", "parentfield": "lessons", From 2e79190977881ac3f466ac83e0d42c8525d5d588 Mon Sep 17 00:00:00 2001 From: Fahid Latheef Alungal Date: Tue, 2 Sep 2025 01:36:18 +0530 Subject: [PATCH 3/4] fix: added Patch to update wrong indexes for SCORM Lesson References --- lms/patches.txt | 3 ++- lms/patches/v2_0/fix_scorm_lesson_reference_idx.py | 13 +++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 lms/patches/v2_0/fix_scorm_lesson_reference_idx.py diff --git a/lms/patches.txt b/lms/patches.txt index 79b4afad..42f6430b 100644 --- a/lms/patches.txt +++ b/lms/patches.txt @@ -110,4 +110,5 @@ lms.patches.v2_0.link_zoom_account_to_batch lms.patches.v2_0.sidebar_for_certified_members lms.patches.v2_0.move_batch_instructors_to_evaluators lms.patches.v2_0.enable_programming_exercises_in_sidebar -lms.patches.v2_0.count_in_program \ No newline at end of file +lms.patches.v2_0.count_in_program +lms.patches.v2_0.fix_scorm_lesson_reference_idx diff --git a/lms/patches/v2_0/fix_scorm_lesson_reference_idx.py b/lms/patches/v2_0/fix_scorm_lesson_reference_idx.py new file mode 100644 index 00000000..a57aeef1 --- /dev/null +++ b/lms/patches/v2_0/fix_scorm_lesson_reference_idx.py @@ -0,0 +1,13 @@ +import frappe + + +def execute(): + scorm_lessons = frappe.get_all("Course Lesson", filters={"is_scorm_package": 1}, pluck="name") + table = frappe.qb.DocType("Lesson Reference") + + q = frappe.qb.from_(table).select(table.name).where(table.lesson.isin(scorm_lessons) & table.idx == 0) + wrong_idx_lesson_references = q.run(pluck=True) + + for lesson_reference in wrong_idx_lesson_references: + # For SCORM, there is only 1 lesson per chapter, so directly setting 1 is fine + frappe.db.set_value("Lesson Reference", lesson_reference, "idx", 1) From a3e7d1f981eefc86980e650914732692efca94aa Mon Sep 17 00:00:00 2001 From: Fahid Latheef Alungal Date: Tue, 2 Sep 2025 02:29:19 +0530 Subject: [PATCH 4/4] refactor: derive is_scorm_package from Lesson instead of Chapter --- lms/lms/utils.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/lms/lms/utils.py b/lms/lms/utils.py index 5adde244..98a6ab72 100644 --- a/lms/lms/utils.py +++ b/lms/lms/utils.py @@ -1222,24 +1222,23 @@ def get_course_outline(course, progress=False): @frappe.whitelist(allow_guest=True) def get_lesson(course, chapter, lesson): chapter_name = frappe.db.get_value("Chapter Reference", {"parent": course, "idx": chapter}, "chapter") - is_scorm_chapter = frappe.db.get_value("Course Chapter", chapter_name, "is_scorm_package") 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"], + ["include_in_preview", "title", "is_scorm_package"], as_dict=1, ) - if is_scorm_chapter: + if not lesson_details: + return {} + + if lesson_details.is_scorm_package: return { "is_scorm_package": True, "chapter_name": chapter_name, } - if not lesson_details: - return {} - membership = get_membership(course) course_info = frappe.db.get_value( "LMS Course",