Refactored lms.py, modified utils
diff --git a/erpnext/education/utils.py b/erpnext/education/utils.py
index 01abdd4..acfa388 100644
--- a/erpnext/education/utils.py
+++ b/erpnext/education/utils.py
@@ -55,6 +55,7 @@
return None
+# LMS Utils
def get_current_student():
"""
Returns student user name, example EDU-STU-2018-00001 (Based on the naming series).
@@ -89,7 +90,7 @@
return {'program': program, 'is_enrolled': is_enrolled}
def get_course_enrollment(course_name):
- student = utils.get_current_student()
+ student = get_current_student()
enrollment_name = frappe.get_all("Course Enrollment", filters={'student': student, 'course':course_name})
try:
name = enrollment_name[0].name
diff --git a/erpnext/www/lms.py b/erpnext/www/lms.py
index 7b972fb..4bb9901 100644
--- a/erpnext/www/lms.py
+++ b/erpnext/www/lms.py
@@ -2,7 +2,27 @@
import erpnext.education.utils as utils
import frappe
-# Academy Utils
+# LMS Utils to Update State for Vue Store
+@frappe.whitelist()
+def get_program_enrollments():
+ try:
+ student = frappe.get_doc("Student", utils.get_current_student())
+ return student.get_program_enrollments()
+ except:
+ return None
+
+@frappe.whitelist()
+def get_all_course_enrollments():
+ student = utils.get_current_student()
+ if student == None:
+ return None
+ try:
+ student = frappe.get_doc("Student", student)
+ return student.get_all_course_enrollments()
+ except:
+ return None
+
+# Vue Client Functions
@frappe.whitelist(allow_guest=True)
def get_portal_details():
"""
@@ -76,16 +96,6 @@
content_type = course.course_content[0].content_type
return dict(content=content, content_type=content_type)
-# Functions to get content details
-@frappe.whitelist()
-def get_content(content_name, content_type):
- try:
- content = frappe.get_doc(content_type, content_name)
- return content
- except:
- frappe.throw("{0} with name {1} does not exist".format(content_type, content_name))
- return None
-
@frappe.whitelist()
def get_next_content(content, content_type, course):
if frappe.session.user == "Guest":
@@ -94,6 +104,7 @@
content_list = [{'content_type':item.content_type, 'content':item.content} for item in course_doc.get_all_children()]
current_index = content_list.index({'content': content, 'content_type': content_type})
try:
+ # print(content_list[current_index + 1])
return content_list[current_index + 1]
except IndexError:
return None
@@ -179,27 +190,6 @@
utils.enroll_all_courses_in_program(program_enrollment, student)
return program_name
-@frappe.whitelist()
-def get_program_enrollments():
- if utils.get_current_student() == None:
- return None
- try:
- student = frappe.get_doc("Student", utils.get_current_student())
- return student.get_program_enrollments()
- except:
- return None
-
-@frappe.whitelist()
-def get_all_course_enrollments():
- student = utils.get_current_student()
- if student == None:
- return None
- try:
- student = frappe.get_doc("Student", student)
- return student.get_all_course_enrollments()
- except:
- return None
-
# Academty Activity
@frappe.whitelist()
def add_activity(enrollment, content_type, content):
@@ -218,51 +208,38 @@
def get_course_progress(course_enrollment):
course = frappe.get_doc('Course', course_enrollment.course)
+ contents = course.get_contents()
+ progress = []
+ for index, content in enumerate(contents):
+ if content.doctype in ('Article', 'Video'):
+ status = check_content_completion(content.name, content.doctype, course_enrollment.name)
+ progress.append({'content': content.name, 'content_type': content.doctype, 'is_complete': status})
+ elif content.doctype == 'Quiz':
+ status, score = check_quiz_completion(content, course_enrollment.name)
+ progress.append({'content': content.name, 'content_type': content.doctype, 'is_complete': status, 'score': score})
+ return progress
- content_activity, quiz_activity = course_enrollment.get_linked_activity()
- content_list, quiz_list = course.get_contents_based_on_type()
+def check_content_completion(content_name, content_type, enrollment_name):
+ activity = frappe.get_list("Course Activity", filters={'enrollment': enrollment_name, 'content_type': content_type, 'content': content_name})
+ if activity:
+ return True
+ else:
+ return False
+
+def check_quiz_completion(quiz, enrollment_name):
+ attempts = frappe.get_list("Quiz Activity", filters={'enrollment': enrollment_name, 'quiz': quiz.name}, fields=["name", "activity_date", "score", "status"])
+ if attempts and quiz.grading_basis == 'Last Attempt':
+ score = attempts[0]['score']
+ status = attempts[0]['status']
+ return status, score
- quiz_scores, is_quiz_complete, last_quiz_attempted = get_quiz_progress(quiz_list, quiz_activity)
- is_content_complete, last_content_viewed = get_content_progress(content_list, content_activity)
-
- quiz_data = {
- 'gradable_quiz_attempts': quiz_scores,
- 'complete': is_quiz_complete,
- 'last': last_quiz_attempted
- }
-
- content_data = {
- 'complete': is_content_complete,
- 'last': last_content_viewed
- }
+ elif attempts and quiz.grading_basis == 'Last Highest Score':
+ sorted_by_score = sorted(attempts, key = lambda i: int(i.score), reverse=True)
+ score = sorted_by_score[0]['score']
+ status = sorted_by_score[0]['status']
+ return status, score
- return quiz_data, content_data
+ return False, None
-def get_quiz_progress(quiz_list, quiz_activity):
- scores = []
- is_complete = True
- last_attempted = None
- for quiz in quiz_list:
- attempts = [attempt for attempt in quiz_activity if attempt.quiz==quiz.name]
- if attempts and quiz.grading_basis == 'Last Attempt':
- scores.append(attempts[0])
- last_attempted = quiz
- elif attempts and quiz.grading_basis == 'Last Highest Score':
- sorted_by_score = sorted(attempts, key = lambda i: int(i.score), reverse=True)
- scores.append(sorted_by_score[0])
- last_attempted = quiz
- elif not attempts:
- is_complete = False
- return scores, is_complete, last_attempted
-
-def get_content_progress(content_list, content_activity):
- is_complete = True
- last_viewed = None
- activity_list = [[activity.content, activity.content_type] for activity in content_activity]
- for item in content_list:
- current_content = [item.name, item.doctype]
- if current_content in activity_list:
- last_viewed = item
- else:
- is_complete = False
- return is_complete, last_viewed
\ No newline at end of file
+def get_course_meta():
+ pass
\ No newline at end of file