refactor: added enrollment api
diff --git a/erpnext/education/utils.py b/erpnext/education/utils.py
index 398a2a5..09ac22c 100644
--- a/erpnext/education/utils.py
+++ b/erpnext/education/utils.py
@@ -60,7 +60,7 @@
"""Returns current student from frappe.session.user
Returns:
- object: Student Document
+ object: Student Document
"""
email = frappe.session.user
if email in ('Administrator', 'Guest'):
@@ -77,32 +77,29 @@
is_published and (student_is_enrolled or student_can_self_enroll)
Returns:
- list of dict: List of all programs and to be displayed on the portal along with enrollment status
+ list of objects: List of all programs and to be displayed on the portal along with enrollment status
"""
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})
+ portal_programs = [program for program in program_list if allowed_program_access(program.name) or program.allow_self_enroll]
return portal_programs
-def get_enrollment_status(program, student=None):
+def allowed_program_access(program, student=None):
"""Returns enrollment status for current student
Args:
- program (string): Name of the program
- student (object): instance of Student document
+ program (string): Name of the program
+ student (object): instance of Student document
Returns:
- bool: Is current user enrolled or not
+ bool: Is current user enrolled or not
"""
+ if has_super_access():
+ return True
if not student:
student = get_current_student()
if student and get_enrollment('program', program, student.name):
@@ -114,33 +111,74 @@
"""Gets enrollment for course or program
Args:
- master (string): can either be program or course
- document (string): program or course name
- student (string): Student ID
+ 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
+ string: Enrollment Name if exists else returns empty string
"""
if master == 'program':
- enrollments = frappe.get_all("Program Enrollment", filters={'student':student, 'program': document})
+ enrollments = frappe.get_all("Program Enrollment", filters={'student':student, 'program': document, 'docstatus': 1})
if master == 'course':
enrollments = frappe.get_all("Course Enrollment", filters={'student':student, 'course': document})
if enrollments:
- return enrollment[0].name
+ return enrollments[0].name
else:
- return ''
+ 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'})
+@frappe.whitelist()
+def enroll_in_program(program_name, student=None):
+ """Enroll student in program
+
+ Args:
+ program_name (string): Name of the program to be enrolled into
+ student (string, optional): name of student who has to be enrolled, if not
+ provided, a student will be created from the current user
+
+ Returns:
+ string: name of the program enrollment document
+ """
+ if has_super_access():
+ return
+
+ if not student == None:
+ student = frappe.get_doc("Student", student)
+ else:
+ # Check if self enrollment in allowed
+ program = frappe.get_doc('Program', program_name)
+ if not program.allow_self_enroll:
+ return frappe.throw("You are not allowed to enroll for this course")
+
+ student = get_current_student()
+ if not student:
+ student = create_student_from_current_user()
+
+ # Check if student is already enrolled in program
+ enrollment = get_enrollment('program', program_name, student.name)
+ if enrollment:
+ return enrollment
+
+ # Check if self enrollment in allowed
+ program = frappe.get_doc('Program', program_name)
+ if not program.allow_self_enroll:
+ return frappe.throw("You are not allowed to enroll for this course")
+
+ # Enroll in program
+ program_enrollment = student.enroll_in_program(program_name)
+ return program_enrollment.name
+
+def has_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()
+# student get_current_student()
# if not student:
# return None
# else:
@@ -169,6 +207,7 @@
def create_student_from_current_user():
user = frappe.get_doc("User", frappe.session.user)
+
student = frappe.get_doc({
"doctype": "Student",
"first_name": user.first_name,
@@ -176,6 +215,7 @@
"student_email_id": user.email,
"user": frappe.session.user
})
+
student.save(ignore_permissions=True)
return student
diff --git a/erpnext/www/lms/macros/hero.html b/erpnext/www/lms/macros/hero.html
index 8c09580..89011b2 100644
--- a/erpnext/www/lms/macros/hero.html
+++ b/erpnext/www/lms/macros/hero.html
@@ -1,20 +1,50 @@
-{% macro hero(title, description, is_enrolled) %}
+{% macro hero(title, description, has_access) %}
<div class='container pb-5'>
- <h1>{{ title}}</h1>
+ <h1>{{ title }} </h1>
<p class='lead' style="max-width: 100%;">{{ description }}</p>
<p class="mt-4">
{% if frappe.session.user == 'Guest' %}
<a id="signup" class="btn btn-primary btn-lg" href="/login#signup">Sign Up</a>
- {% elif not is_enrolled %}
- <button id="enroll" class="btn btn-primary btn-lg" onclick="enroll()">Enroll</button>
+ {% elif not has_access %}
+ <button id="enroll" class="btn btn-primary btn-lg" onclick="enroll()" disabled>Enroll</button>
{% endif %}
</p>
</div>
{% block script %}
<script type="text/javascript">
+ frappe.ready(() => {
+ btn = document.getElementById('enroll');
+ if (btn) btn.disabled = false;
+ })
+
function enroll() {
- console.log(frappe.utils.get_query_params())
+ let params = frappe.utils.get_query_params()
+ console.log(params.program)
+ let btn = document.getElementById('enroll');
+ btn.disbaled = true;
+ btn.innerText = 'Enrolling...'
+
+ let opts = {
+ method: 'erpnext.education.utils.enroll_in_program',
+ args: {
+ program_name: params.program
+ }
+ }
+
+ frappe.call(opts).then(res => {
+ console.log(res)
+ let success_dialog = new frappe.ui.Dialog({
+ title: __('Success'),
+ secondary_action: function() {
+ window.location.reload()
+ }
+ })
+ success_dialog.set_message('You have successfully enrolled for the program ');
+ success_dialog.$message.show()
+ success_dialog.show();
+ btn.disbaled = false;
+ })
}
</script>
{% endblock %}