refactor: added enrollment api

This commit is contained in:
Shivam Mishra 2019-05-30 16:35:15 +05:30
parent f22793f91b
commit dfdb92f4b1
2 changed files with 99 additions and 29 deletions

View File

@ -77,23 +77,18 @@ def get_portal_programs():
is_published and (student_is_enrolled or student_can_self_enroll) is_published and (student_is_enrolled or student_can_self_enroll)
Returns: 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}) published_programs = frappe.get_all("Program", filters={"is_published": True})
if not published_programs: if not published_programs:
return None return None
program_list = [frappe.get_doc("Program", program) for program in published_programs] program_list = [frappe.get_doc("Program", program) for program in published_programs]
portal_programs = [] portal_programs = [program for program in program_list if allowed_program_access(program.name) or program.allow_self_enroll]
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 return portal_programs
def get_enrollment_status(program, student=None): def allowed_program_access(program, student=None):
"""Returns enrollment status for current student """Returns enrollment status for current student
Args: Args:
@ -103,6 +98,8 @@ def get_enrollment_status(program, student=None):
Returns: Returns:
bool: Is current user enrolled or not bool: Is current user enrolled or not
""" """
if has_super_access():
return True
if not student: if not student:
student = get_current_student() student = get_current_student()
if student and get_enrollment('program', program, student.name): if student and get_enrollment('program', program, student.name):
@ -122,25 +119,66 @@ def get_enrollment(master, document, student):
string: Enrollment Name if exists else returns empty string string: Enrollment Name if exists else returns empty string
""" """
if master == 'program': 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': if master == 'course':
enrollments = frappe.get_all("Course Enrollment", filters={'student':student, 'course': document}) enrollments = frappe.get_all("Course Enrollment", filters={'student':student, 'course': document})
if enrollments: if enrollments:
return enrollment[0].name return enrollments[0].name
else: else:
return '' return None
# def check_super_access(): @frappe.whitelist()
# current_user = frappe.get_doc('User', frappe.session.user) def enroll_in_program(program_name, student=None):
# roles = set([role.role for role in current_user.roles]) """Enroll student in program
# return bool(roles & {'Administrator', 'Instructor', 'Education Manager', 'System Manager', 'Academic User'})
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): # def get_program_enrollment(program_name):
# """ # """
# Function to get program enrollments for a particular student for a program # Function to get program enrollments for a particular student for a program
# """ # """
# student = get_current_student() # student get_current_student()
# if not student: # if not student:
# return None # return None
# else: # else:
@ -169,6 +207,7 @@ def get_enrollment(master, document, student):
def create_student_from_current_user(): def create_student_from_current_user():
user = frappe.get_doc("User", frappe.session.user) user = frappe.get_doc("User", frappe.session.user)
student = frappe.get_doc({ student = frappe.get_doc({
"doctype": "Student", "doctype": "Student",
"first_name": user.first_name, "first_name": user.first_name,
@ -176,6 +215,7 @@ def create_student_from_current_user():
"student_email_id": user.email, "student_email_id": user.email,
"user": frappe.session.user "user": frappe.session.user
}) })
student.save(ignore_permissions=True) student.save(ignore_permissions=True)
return student return student

View File

@ -1,20 +1,50 @@
{% macro hero(title, description, is_enrolled) %} {% macro hero(title, description, has_access) %}
<div class='container pb-5'> <div class='container pb-5'>
<h1>{{ title }} </h1> <h1>{{ title }} </h1>
<p class='lead' style="max-width: 100%;">{{ description }}</p> <p class='lead' style="max-width: 100%;">{{ description }}</p>
<p class="mt-4"> <p class="mt-4">
{% if frappe.session.user == 'Guest' %} {% if frappe.session.user == 'Guest' %}
<a id="signup" class="btn btn-primary btn-lg" href="/login#signup">Sign Up</a> <a id="signup" class="btn btn-primary btn-lg" href="/login#signup">Sign Up</a>
{% elif not is_enrolled %} {% elif not has_access %}
<button id="enroll" class="btn btn-primary btn-lg" onclick="enroll()">Enroll</button> <button id="enroll" class="btn btn-primary btn-lg" onclick="enroll()" disabled>Enroll</button>
{% endif %} {% endif %}
</p> </p>
</div> </div>
{% block script %} {% block script %}
<script type="text/javascript"> <script type="text/javascript">
frappe.ready(() => {
btn = document.getElementById('enroll');
if (btn) btn.disabled = false;
})
function enroll() { 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> </script>
{% endblock %} {% endblock %}