feat: added course progress apis
This commit is contained in:
@@ -249,14 +249,42 @@ def get_student_topic_details(topic, course_name, program):
|
|||||||
course_enrollment = get_or_create_course_enrollment(course_name, program)
|
course_enrollment = get_or_create_course_enrollment(course_name, program)
|
||||||
progress = student.get_topic_progress(course_enrollment.name, topic)
|
progress = student.get_topic_progress(course_enrollment.name, topic)
|
||||||
if not progress:
|
if not progress:
|
||||||
return {'label':'Open', 'indicator': 'blue'}
|
return None
|
||||||
count = sum([activity['is_complete'] for activity in progress])
|
count = sum([activity['is_complete'] for activity in progress])
|
||||||
if count == 0:
|
if count == 0:
|
||||||
return {'label':'Open', 'indicator': 'blue'}
|
return {'completed': False, 'started': False}
|
||||||
elif count == len(progress):
|
elif count == len(progress):
|
||||||
return {'label':'Completed', 'indicator': 'green'}
|
return {'completed': True, 'started': True}
|
||||||
elif count < len(progress):
|
elif count < len(progress):
|
||||||
return {'label':'In Progress', 'indicator': 'orange'}
|
return {'completed': False, 'started': True}
|
||||||
|
|
||||||
|
def get_student_course_details(course, program):
|
||||||
|
"""
|
||||||
|
Return the porgress of a course in a program as well as the content to continue from.
|
||||||
|
:param topic_name:
|
||||||
|
:param course_name:
|
||||||
|
"""
|
||||||
|
course_progress = []
|
||||||
|
for course_topic in course.topics:
|
||||||
|
topic = frappe.get_doc("Topic", course_topic.topic)
|
||||||
|
progress = get_student_topic_details(topic, course.name, program)
|
||||||
|
if progress:
|
||||||
|
course_progress.append(progress)
|
||||||
|
|
||||||
|
if course_progress:
|
||||||
|
number_of_completed_topics = sum([activity['completed'] for activity in course_progress])
|
||||||
|
total_topics = len(course_progress)
|
||||||
|
print("course_progress", course_progress)
|
||||||
|
print("number_of_completed_topics", number_of_completed_topics)
|
||||||
|
print("total_topics", total_topics)
|
||||||
|
if number_of_completed_topics == 0:
|
||||||
|
return {'completed': False, 'started': False}
|
||||||
|
if number_of_completed_topics == total_topics:
|
||||||
|
return {'completed': True, 'started': True}
|
||||||
|
if number_of_completed_topics < total_topics:
|
||||||
|
return {'completed': False, 'started': True}
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
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)
|
||||||
|
|||||||
@@ -67,7 +67,13 @@
|
|||||||
</div>
|
</div>
|
||||||
{% if has_access %}
|
{% if has_access %}
|
||||||
<div class='card-footer'>
|
<div class='card-footer'>
|
||||||
<span class="indicator {{ progress[topic.name].indicator }}"> {{ progress[topic.name].label }} </span>
|
{% if progress[topic.name].completed %}
|
||||||
|
<span class="indicator green">Completed</span>
|
||||||
|
{% elif progress[topic.name].started %}
|
||||||
|
<span class="indicator orange">In Progress</span>
|
||||||
|
{% else %}
|
||||||
|
<span class="indicator blue">Open</span>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
{% else %}
|
{% else %}
|
||||||
|
|||||||
@@ -34,8 +34,8 @@
|
|||||||
|
|
||||||
{% macro card(course, index, length) %}
|
{% macro card(course, index, length) %}
|
||||||
<div class="col-sm-{{ 12 if length%3 == 1 and index == 1 else 6 if length%3 == 2 and index in [1,2] else 4}} mb-4 text-left">
|
<div class="col-sm-{{ 12 if length%3 == 1 and index == 1 else 6 if length%3 == 2 and index in [1,2] else 4}} mb-4 text-left">
|
||||||
<div class="card h-100">
|
|
||||||
<a href="/lms/course?name={{ course.name }}&program={{ program.name }}" class="no-decoration no-underline">
|
<a href="/lms/course?name={{ course.name }}&program={{ program.name }}" class="no-decoration no-underline">
|
||||||
|
<div class="card h-100">
|
||||||
{% if course.hero_image %}
|
{% if course.hero_image %}
|
||||||
<div class="card-hero-img" style="background-image: url({{ course.hero_image }})"></div>
|
<div class="card-hero-img" style="background-image: url({{ course.hero_image }})"></div>
|
||||||
{% else %}
|
{% else %}
|
||||||
@@ -47,8 +47,19 @@
|
|||||||
<h5 class='card-title'>{{ course.course_name }}</h5>
|
<h5 class='card-title'>{{ course.course_name }}</h5>
|
||||||
<div>{{ course.course_intro }}</div>
|
<div>{{ course.course_intro }}</div>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
{% if has_access and progress[course.name] %}
|
||||||
|
<div class='card-footer'>
|
||||||
|
{% if progress[course.name].completed %}
|
||||||
|
<span class="indicator green">Completed</span>
|
||||||
|
{% elif progress[course.name].started %}
|
||||||
|
<span class="indicator orange">In Progress</span>
|
||||||
|
{% else %}
|
||||||
|
<span class="indicator blue">Open</span>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
|
||||||
@@ -57,8 +68,8 @@
|
|||||||
{{ hero(program.program_name, program.description, has_access) }}
|
{{ hero(program.program_name, program.description, has_access) }}
|
||||||
<div class='container'>
|
<div class='container'>
|
||||||
<div class="row mt-5">
|
<div class="row mt-5">
|
||||||
{% for course in program.courses %}
|
{% for course in courses %}
|
||||||
{{ card(frappe.get_doc("Course", course.course), loop.index, program.courses|length) }}
|
{{ card(course, loop.index, courses|length) }}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -7,10 +7,16 @@ no_cache = 1
|
|||||||
def get_context(context):
|
def get_context(context):
|
||||||
context.education_settings = frappe.get_single("Education Settings")
|
context.education_settings = frappe.get_single("Education Settings")
|
||||||
context.program = get_program(frappe.form_dict['program'])
|
context.program = get_program(frappe.form_dict['program'])
|
||||||
|
context.courses = [frappe.get_doc("Course", course.course) for course in context.program.courses]
|
||||||
context.has_access = utils.allowed_program_access(frappe.form_dict['program'])
|
context.has_access = utils.allowed_program_access(frappe.form_dict['program'])
|
||||||
|
context.progress = get_course_progress(context.courses, context.program)
|
||||||
|
|
||||||
def get_program(program_name):
|
def get_program(program_name):
|
||||||
try:
|
try:
|
||||||
return frappe.get_doc('Program', program_name)
|
return frappe.get_doc('Program', program_name)
|
||||||
except frappe.DoesNotExistError:
|
except frappe.DoesNotExistError:
|
||||||
frappe.throw(_("Program {0} does not exist.".format(program_name)))
|
frappe.throw(_("Program {0} does not exist.".format(program_name)))
|
||||||
|
|
||||||
|
def get_course_progress(courses, program):
|
||||||
|
progress = {course.name: utils.get_student_course_details(course, program) for course in courses}
|
||||||
|
return progress
|
||||||
Reference in New Issue
Block a user