refactor: added lms utilities for enrollment and program list
diff --git a/erpnext/education/utils.py b/erpnext/education/utils.py
index bf766ad..398a2a5 100644
--- a/erpnext/education/utils.py
+++ b/erpnext/education/utils.py
@@ -57,9 +57,10 @@
# LMS Utils
def get_current_student():
- """
- Returns student user name, example EDU-STU-2018-00001 (Based on the naming series).
- Takes email from from frappe.session.user
+ """Returns current student from frappe.session.user
+
+ Returns:
+ object: Student Document
"""
email = frappe.session.user
if email in ('Administrator', 'Guest'):
@@ -70,41 +71,101 @@
except (IndexError, frappe.DoesNotExistError):
return None
-def check_super_access():
- current_user = frappe.get_doc('User', frappe.session.user)
- roles = set([role.role for role in current_user.roles])
- return bool(roles & {'Administrator', 'Instructor', 'Education Manager', 'System Manager', 'Academic User'})
+def get_portal_programs():
+ """Returns a list of all program to be displayed on the portal
+ Programs are returned based on the following logic
+ is_published and (student_is_enrolled or student_can_self_enroll)
-def get_program_enrollment(program_name):
+ Returns:
+ list of dict: List of all programs and to be displayed on the portal along with enrollment status
"""
- Function to get program enrollments for a particular student for a program
- """
- student = get_current_student()
- if not student:
+ published_programs = frappe.get_all("Program", filters={"is_published": True})
+ if not published_programs:
return None
+
+ program_list = [frappe.get_doc("Program", program) for program in published_programs]
+ portal_programs = []
+
+ for program in program_list:
+ enrollment_status = get_enrollment_status(program.name)
+ if enrollment_status or program.allow_self_enroll:
+ portal_programs.append({'program': program, 'is_enrolled': enrollment_status})
+
+ return portal_programs
+
+def get_enrollment_status(program, student=None):
+ """Returns enrollment status for current student
+
+ Args:
+ program (string): Name of the program
+ student (object): instance of Student document
+
+ Returns:
+ bool: Is current user enrolled or not
+ """
+ if not student:
+ student = get_current_student()
+ if student and get_enrollment('program', program, student.name):
+ return True
else:
- enrollment = frappe.get_all("Program Enrollment", filters={'student':student.name, 'program': program_name})
- if enrollment:
- return enrollment[0].name
- else:
- return None
+ return False
-def get_program_and_enrollment_status(program_name):
- program = frappe.get_doc('Program', program_name)
- is_enrolled = bool(get_program_enrollment(program_name)) or check_super_access()
- return {'program': program, 'is_enrolled': is_enrolled}
+def get_enrollment(master, document, student):
+ """Gets enrollment for course or program
-def get_course_enrollment(course_name):
- student = get_current_student()
- if not student:
- return None
- enrollment_name = frappe.get_all("Course Enrollment", filters={'student': student.name, 'course':course_name})
- try:
- name = enrollment_name[0].name
- enrollment = frappe.get_doc("Course Enrollment", name)
- return enrollment
- except:
- return None
+ Args:
+ master (string): can either be program or course
+ document (string): program or course name
+ student (string): Student ID
+
+ Returns:
+ string: Enrollment Name if exists else returns empty string
+ """
+ if master == 'program':
+ enrollments = frappe.get_all("Program Enrollment", filters={'student':student, 'program': document})
+ if master == 'course':
+ enrollments = frappe.get_all("Course Enrollment", filters={'student':student, 'course': document})
+
+ if enrollments:
+ return enrollment[0].name
+ else:
+ return ''
+
+# def check_super_access():
+# current_user = frappe.get_doc('User', frappe.session.user)
+# roles = set([role.role for role in current_user.roles])
+# return bool(roles & {'Administrator', 'Instructor', 'Education Manager', 'System Manager', 'Academic User'})
+
+# def get_program_enrollment(program_name):
+# """
+# Function to get program enrollments for a particular student for a program
+# """
+# student = get_current_student()
+# if not student:
+# return None
+# else:
+# enrollment = frappe.get_all("Program Enrollment", filters={'student':student.name, 'program': program_name})
+# if enrollment:
+# return enrollment[0].name
+# else:
+# return None
+
+# def get_program_and_enrollment_status(program_name):
+# program = frappe.get_doc('Program', program_name)
+# is_enrolled = bool(get_program_enrollment(program_name)) or check_super_access()
+# return {'program': program, 'is_enrolled': is_enrolled}
+
+# def get_course_enrollment(course_name):
+# student = get_current_student()
+# if not student:
+# return None
+# enrollment_name = frappe.get_all("Course Enrollment", filters={'student': student.name, 'course':course_name})
+# try:
+# name = enrollment_name[0].name
+# enrollment = frappe.get_doc("Course Enrollment", name)
+# return enrollment
+# except:
+# return None
def create_student_from_current_user():
user = frappe.get_doc("User", frappe.session.user)
diff --git a/erpnext/www/lms/all_programs.py b/erpnext/www/lms/all_programs.py
index aa10e2b..c0c18c3 100644
--- a/erpnext/www/lms/all_programs.py
+++ b/erpnext/www/lms/all_programs.py
@@ -6,10 +6,4 @@
def get_context(context):
context.education_settings = frappe.get_single("Education Settings")
- context.all_programs = get_all_programs()
-
-def get_all_programs():
- program_names = frappe.get_all("Program", filters={"is_published": True})
- if program_names:
- program_list = [utils.get_program_and_enrollment_status(program['name']) for program in program_names]
- return program_list
+ context.all_programs = utils.get_portal_programs()
\ No newline at end of file
diff --git a/erpnext/www/lms/index.py b/erpnext/www/lms/index.py
index 15ca0b4..00f66e7 100644
--- a/erpnext/www/lms/index.py
+++ b/erpnext/www/lms/index.py
@@ -13,15 +13,4 @@
def get_featured_programs():
- featured_program_names = frappe.get_all("Program", filters={"is_published": True, "is_featured": True})
- if featured_program_names:
- featured_list = [utils.get_program_and_enrollment_status(program['name']) for program in featured_program_names]
- return featured_list
- else:
- return get_all_programs()[:2]
-
-def get_all_programs():
- program_names = frappe.get_all("Program", filters={"is_published": True})
- if program_names:
- program_list = [utils.get_program_and_enrollment_status(program['name']) for program in program_names]
- return program_list
+ return utils.get_portal_programs()
\ No newline at end of file
diff --git a/erpnext/www/lms/program.py b/erpnext/www/lms/program.py
index f38e652..827b11a 100644
--- a/erpnext/www/lms/program.py
+++ b/erpnext/www/lms/program.py
@@ -7,6 +7,7 @@
def get_context(context):
context.education_settings = frappe.get_single("Education Settings")
context.program = get_program(frappe.form_dict['name'])
+ context.is_enrolled = utils.get_enrollment_status(program)
def get_program(program_name):
try: