feat: course progress summary

This commit is contained in:
pateljannat
2021-09-28 18:03:12 +05:30
parent 153b439510
commit fb0f9885c1
6 changed files with 148 additions and 2 deletions

View File

@@ -329,6 +329,8 @@ class LMSCourse(Document):
def get_course_progress(self, member=None):
""" Returns the course progress of the session user """
lesson_count = len(self.get_lessons())
if not lesson_count:
return 0
completed_lessons = frappe.db.count("LMS Course Progress",
{
"course": self.name,
@@ -336,8 +338,6 @@ class LMSCourse(Document):
"status": "Complete"
})
precision = cint(frappe.db.get_default("float_precision")) or 3
if not lesson_count:
return 0
return flt(((completed_lessons/lesson_count) * 100), precision)
def get_neighbours(self, current, lessons):

View File

View File

@@ -0,0 +1,14 @@
// Copyright (c) 2016, FOSS United and contributors
// For license information, please see license.txt
/* eslint-disable */
frappe.query_reports["Course Progress Summary"] = {
"filters": [
{
"fieldname": "course",
"label": __("Course"),
"fieldtype": "Link",
"options": "LMS Course"
}
]
};

View File

@@ -0,0 +1,26 @@
{
"add_total_row": 0,
"columns": [],
"creation": "2021-09-28 15:31:27.205036",
"disable_prepared_report": 0,
"disabled": 0,
"docstatus": 0,
"doctype": "Report",
"filters": [],
"idx": 0,
"is_standard": "Yes",
"modified": "2021-09-28 17:09:40.761819",
"modified_by": "Administrator",
"module": "LMS",
"name": "Course Progress Summary",
"owner": "Administrator",
"prepared_report": 0,
"ref_doctype": "LMS Batch Membership",
"report_name": "Course Progress Summary",
"report_type": "Script Report",
"roles": [
{
"role": "System Manager"
}
]
}

View File

@@ -0,0 +1,106 @@
# Copyright (c) 2013, FOSS United and contributors
# License: MIT. See LICENSE
import frappe
from frappe.utils import rounded
from frappe import _
def execute(filters=None):
columns, data = [], []
columns = get_columns()
data = get_data(filters)
charts = get_charts(data)
return columns, data, [], charts
def get_data(filters=None):
summary = []
query_filter = {}
if filters:
query_filter = {
"course": filters.course
}
memberships = frappe.get_all(
"LMS Batch Membership",
query_filter,
["name", "course", "member", "member_name"],
order_by="course")
current_course = memberships[0].course
for membership in memberships:
if current_course != membership.course:
current_course = membership.course
course_details = frappe.get_doc("LMS Course", current_course)
summary.append(frappe._dict({
"course": course_details.title,
"member": membership.member_name,
"progress": rounded(course_details.get_course_progress(membership.member))
}))
return summary
def get_columns():
return [
{
"fieldname": "course",
"fieldtype": "Link",
"label": _("Course"),
"options": "LMS Course",
"width": 300
},
{
"fieldname": "member",
"fieldtype": "Link",
"label": _("Member"),
"options": "User",
"width": 150
},
{
"fieldname": "progress",
"fieldtype": "Data",
"label": _("Progress (%)"),
"width": 150
}
]
def get_charts(data):
if not data:
return None
labels = []
completed = 0
less_than_hundred = 0
less_than_seventy = 0
less_than_forty = 0
less_than_ten = 0
for row in data:
if row.progress == 100:
completed += 1
elif row.progress < 100 and row.progress > 70:
less_than_hundred += 1
elif row.progress < 70 and row.progress > 40:
less_than_seventy += 1
elif row.progress < 40 and row.progress > 10:
less_than_forty += 1
elif row.progress < 10:
less_than_ten += 1
charts = {
"data": {
"labels": ["0-10", "10-40", "40-70", "70-99", "100"],
"datasets": [
{
"name": "Progress (%)",
"values": [less_than_ten, less_than_forty, less_than_seventy, less_than_hundred, completed]
}
]
},
"type": "pie",
"colors": ["#ff0e0e", "#ff9966", "#ffcc00", "#99cc33", "#339900"]
}
return charts