feat: set cmi.launch_data from scorm_content for resumability

- Replaced already_completed with progress_already_exists variable
- Added scorm_details parameter to save_progress whitelisted function
- Added Separate logic for SCORM chapter progress in save_progress
This commit is contained in:
FahidLatheef
2025-01-21 16:23:28 +05:30
parent 70b2a11cb7
commit 281e155480
2 changed files with 63 additions and 12 deletions
+44 -3
View File
@@ -8,6 +8,7 @@ from frappe.utils.telemetry import capture
from lms.lms.utils import get_course_progress
from ...md import find_macros
import json
from pydantic import BaseModel
class CourseLesson(Document):
@@ -73,8 +74,16 @@ class CourseLesson(Document):
return [frappe.get_doc("LMS Exercise", name) for name in exercises]
class SCORMDetails(BaseModel):
is_complete: bool
scorm_content: str | None = None
@frappe.whitelist()
def save_progress(lesson, course):
def save_progress(lesson: str, course: str, scorm_details: SCORMDetails | None = None):
"""
Note: Pass the argument scorm_details only if it is SCORM related save_progress
"""
membership = frappe.db.exists(
"LMS Enrollment", {"course": course, "member": frappe.session.user}
)
@@ -82,14 +91,23 @@ def save_progress(lesson, course):
return 0
frappe.db.set_value("LMS Enrollment", membership, "current_lesson", lesson)
already_completed = frappe.db.exists(
progress_already_exists = frappe.db.exists(
"LMS Course Progress", {"lesson": lesson, "member": frappe.session.user}
)
lesson_already_completed = frappe.db.exists(
"LMS Course Progress",
{"lesson": lesson, "member": frappe.session.user, "status": "Complete"},
)
quiz_completed = get_quiz_progress(lesson)
assignment_completed = get_assignment_progress(lesson)
if not already_completed and quiz_completed and assignment_completed:
if (
not progress_already_exists
and quiz_completed
and assignment_completed
and not scorm_details
):
frappe.get_doc(
{
"doctype": "LMS Course Progress",
@@ -98,6 +116,29 @@ def save_progress(lesson, course):
"member": frappe.session.user,
}
).save(ignore_permissions=True)
elif scorm_details and not lesson_already_completed and not progress_already_exists:
# Create new SCORM progress
frappe.get_doc(
{
"doctype": "LMS Course Progress",
"lesson": lesson,
"status": "Complete" if scorm_details.is_complete else "Partially Complete",
"member": frappe.session.user,
"scorm_content": "" if scorm_details.is_complete else scorm_details.scorm_content,
}
).save(ignore_permissions=True)
elif scorm_details and not lesson_already_completed and progress_already_exists:
# Update Existing SCORM Progress
frappe.db.set_value(
"LMS Course Progress",
progress_already_exists,
{
"lesson": lesson,
"status": "Complete" if scorm_details.is_complete else "Partially Complete",
"member": frappe.session.user,
"scorm_content": "" if scorm_details.is_complete else scorm_details.scorm_content,
},
)
progress = get_course_progress(course)
capture_progress_for_analytics(progress, course)