feat: SCORM
This commit is contained in:
@@ -3,6 +3,9 @@
|
||||
|
||||
import json
|
||||
import frappe
|
||||
import zipfile
|
||||
import os
|
||||
import xml.etree.ElementTree as ET
|
||||
from frappe.translate import get_all_translations
|
||||
from frappe import _
|
||||
from frappe.query_builder import DocType
|
||||
@@ -10,6 +13,7 @@ from frappe.query_builder.functions import Count
|
||||
from frappe.utils import time_diff, now_datetime, get_datetime, flt
|
||||
from typing import Optional
|
||||
from lms.lms.utils import get_average_rating, get_lesson_count
|
||||
from xml.dom.minidom import parseString
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
@@ -876,3 +880,70 @@ def give_dicussions_permission():
|
||||
"delete": 1,
|
||||
}
|
||||
).save(ignore_permissions=True)
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def add_chapter(title, course, is_scorm_package, scorm_package):
|
||||
values = frappe._dict(
|
||||
{"title": title, "course": course, "is_scorm_package": is_scorm_package}
|
||||
)
|
||||
|
||||
scorm_package = frappe._dict(scorm_package)
|
||||
if is_scorm_package:
|
||||
package = frappe.get_doc("File", scorm_package.name)
|
||||
zip_path = package.get_full_path()
|
||||
|
||||
# Extract the zip file
|
||||
extract_path = frappe.get_site_path("public", "files", "scorm", course, title)
|
||||
zipfile.ZipFile(zip_path).extractall(extract_path)
|
||||
|
||||
values.update(
|
||||
{
|
||||
"scorm_package": scorm_package.name,
|
||||
"scorm_package_path": extract_path,
|
||||
"manifest_file": get_manifest_file(extract_path),
|
||||
"launch_file": get_launch_file(extract_path),
|
||||
}
|
||||
)
|
||||
|
||||
chapter = frappe.new_doc("Course Chapter")
|
||||
print(values.title)
|
||||
chapter.update(values)
|
||||
print(chapter.title)
|
||||
chapter.insert()
|
||||
|
||||
return chapter
|
||||
|
||||
|
||||
def get_manifest_file(extract_path):
|
||||
manifest_file = None
|
||||
for root, dirs, files in os.walk(extract_path):
|
||||
for file in files:
|
||||
if file == "imsmanifest.xml":
|
||||
manifest_file = os.path.join(root, file)
|
||||
break
|
||||
if manifest_file:
|
||||
break
|
||||
return manifest_file
|
||||
|
||||
|
||||
def get_launch_file(extract_path):
|
||||
launch_file = None
|
||||
manifest_file = get_manifest_file(extract_path)
|
||||
print(extract_path)
|
||||
|
||||
if manifest_file:
|
||||
with open(manifest_file) as file:
|
||||
data = file.read()
|
||||
print(data)
|
||||
dom = parseString(data)
|
||||
resource = dom.getElementsByTagName("resource")
|
||||
for res in resource:
|
||||
if res.getAttribute("adlcp:scormtype") == "sco":
|
||||
launch_file = res.getAttribute("href")
|
||||
break
|
||||
|
||||
if launch_file:
|
||||
launch_file = os.path.join(os.path.dirname(manifest_file), launch_file)
|
||||
|
||||
return launch_file
|
||||
|
||||
@@ -8,9 +8,16 @@
|
||||
"editable_grid": 1,
|
||||
"engine": "InnoDB",
|
||||
"field_order": [
|
||||
"course",
|
||||
"column_break_3",
|
||||
"title",
|
||||
"column_break_3",
|
||||
"course",
|
||||
"scorm_section",
|
||||
"is_scorm_package",
|
||||
"scorm_package",
|
||||
"scorm_package_path",
|
||||
"column_break_dlnw",
|
||||
"manifest_file",
|
||||
"launch_file",
|
||||
"section_break_5",
|
||||
"lessons"
|
||||
],
|
||||
@@ -43,6 +50,49 @@
|
||||
"fieldtype": "Table",
|
||||
"label": "Lessons",
|
||||
"options": "Lesson Reference"
|
||||
},
|
||||
{
|
||||
"default": "0",
|
||||
"fieldname": "is_scorm_package",
|
||||
"fieldtype": "Check",
|
||||
"label": "Is SCORM Package"
|
||||
},
|
||||
{
|
||||
"depends_on": "is_scorm_package",
|
||||
"fieldname": "manifest_file",
|
||||
"fieldtype": "Code",
|
||||
"label": "Manifest File",
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"depends_on": "is_scorm_package",
|
||||
"fieldname": "launch_file",
|
||||
"fieldtype": "Code",
|
||||
"label": "Launch File",
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "scorm_section",
|
||||
"fieldtype": "Section Break",
|
||||
"label": "SCORM"
|
||||
},
|
||||
{
|
||||
"fieldname": "scorm_package",
|
||||
"fieldtype": "Link",
|
||||
"label": "SCORM Package",
|
||||
"options": "File",
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "column_break_dlnw",
|
||||
"fieldtype": "Column Break"
|
||||
},
|
||||
{
|
||||
"depends_on": "is_scorm_package",
|
||||
"fieldname": "scorm_package_path",
|
||||
"fieldtype": "Code",
|
||||
"label": "SCORM Package Path",
|
||||
"read_only": 1
|
||||
}
|
||||
],
|
||||
"index_web_pages_for_search": 1,
|
||||
@@ -53,7 +103,7 @@
|
||||
"link_fieldname": "chapter"
|
||||
}
|
||||
],
|
||||
"modified": "2024-10-29 16:54:20.904683",
|
||||
"modified": "2024-11-11 16:25:45.586160",
|
||||
"modified_by": "Administrator",
|
||||
"module": "LMS",
|
||||
"name": "Course Chapter",
|
||||
|
||||
@@ -1128,7 +1128,7 @@ def get_course_outline(course, progress=False):
|
||||
chapter_details = frappe.db.get_value(
|
||||
"Course Chapter",
|
||||
chapter.chapter,
|
||||
["name", "title"],
|
||||
["name", "title", "is_scorm_package", "launch_file"],
|
||||
as_dict=True,
|
||||
)
|
||||
chapter_details["idx"] = chapter.idx
|
||||
|
||||
Reference in New Issue
Block a user