diff --git a/frontend/src/components/BatchCourses.vue b/frontend/src/components/BatchCourses.vue
index 9134c42c..e29169d5 100644
--- a/frontend/src/components/BatchCourses.vue
+++ b/frontend/src/components/BatchCourses.vue
@@ -110,6 +110,7 @@ const openCourseModal = () => {
}
const getCoursesColumns = () => {
+ console.log(courses.data)
return [
{
label: 'Title',
@@ -118,13 +119,13 @@ const getCoursesColumns = () => {
},
{
label: 'Lessons',
- key: 'lesson_count',
+ key: 'lessons',
align: 'right',
},
{
label: 'Enrollments',
align: 'right',
- key: 'enrollment_count',
+ key: 'enrollments',
},
]
}
diff --git a/frontend/src/components/BatchStudents.vue b/frontend/src/components/BatchStudents.vue
index 496a10ec..099abfa4 100644
--- a/frontend/src/components/BatchStudents.vue
+++ b/frontend/src/components/BatchStudents.vue
@@ -20,10 +20,10 @@
>
-
@@ -42,9 +42,19 @@
/>
-
+
{{ row[column.key] }}
+
+ {{ Math.ceil(row.courses[column.key]) }}
+
+
+ {{ row.assessments[column.key] }}
+
@@ -74,7 +84,11 @@
diff --git a/frontend/src/components/Modals/StudentModal.vue b/frontend/src/components/Modals/StudentModal.vue
index 54bd05b7..a6bab400 100644
--- a/frontend/src/components/Modals/StudentModal.vue
+++ b/frontend/src/components/Modals/StudentModal.vue
@@ -28,6 +28,7 @@
import { Dialog, createResource } from 'frappe-ui'
import { ref } from 'vue'
import Link from '@/components/Controls/Link.vue'
+import { showToast } from '@/utils'
const students = defineModel('reloadStudents')
const student = ref()
@@ -61,8 +62,11 @@ const addStudent = (close) => {
{
onSuccess() {
students.value.reload()
- close()
student.value = null
+ close()
+ },
+ onError(err) {
+ showToast(__('Error'), __(err.messages?.[0] || err), 'x')
},
}
)
diff --git a/lms/lms/utils.py b/lms/lms/utils.py
index 933d626d..7b8d7430 100644
--- a/lms/lms/utils.py
+++ b/lms/lms/utils.py
@@ -874,26 +874,6 @@ def is_onboarding_complete():
}
-def has_submitted_assessment(assessment, type, member=None):
- if not member:
- member = frappe.session.user
-
- doctype = (
- "LMS Assignment Submission" if type == "LMS Assignment" else "LMS Quiz Submission"
- )
- docfield = "assignment" if type == "LMS Assignment" else "quiz"
-
- filters = {}
- filters[docfield] = assessment
- filters["member"] = member
- return frappe.db.exists(doctype, filters)
-
-
-def has_graded_assessment(submission):
- status = frappe.db.get_value("LMS Assignment Submission", submission, "status")
- return False if status == "Not Graded" else True
-
-
def get_evaluator(course, batch):
evaluator = None
evaluator = frappe.db.get_value(
@@ -1459,13 +1439,11 @@ def get_quiz_details(assessment, member):
@frappe.whitelist()
def get_batch_students(batch):
students = []
-
students_list = frappe.get_all(
"Batch Student", filters={"parent": batch}, fields=["student", "name"]
)
- batch_courses = frappe.get_all("Batch Course", {"parent": batch}, pluck="course")
-
+ batch_courses = frappe.get_all("Batch Course", {"parent": batch}, ["course", "title"])
assessments = frappe.get_all(
"LMS Assessment",
filters={"parent": batch},
@@ -1483,29 +1461,62 @@ def get_batch_students(batch):
)
detail.last_active = format_datetime(detail.last_active, "dd MMM YY")
detail.name = student.name
- students.append(detail)
+ detail.courses = frappe._dict()
+ detail.assessments = frappe._dict()
+ """ Iterate through courses and track their progress """
for course in batch_courses:
progress = frappe.db.get_value(
- "LMS Enrollment", {"course": course, "member": student.student}, "progress"
+ "LMS Enrollment", {"course": course.course, "member": student.student}, "progress"
)
-
+ detail.courses[course.title] = progress
if progress == 100:
courses_completed += 1
- detail.courses_completed = courses_completed
-
+ """ Iterate through assessments and track their progress """
for assessment in assessments:
- if has_submitted_assessment(
+ title = frappe.db.get_value("LMS Assignment", assessment.assessment_name, "title")
+ status = has_submitted_assessment(
assessment.assessment_name, assessment.assessment_type, student.student
- ):
+ )
+ detail.assessments[title] = status
+ if status not in ["Not Attempted", 0]:
assessments_completed += 1
+ detail.courses_completed = courses_completed
detail.assessments_completed = assessments_completed
+ students.append(detail)
return students
+def has_submitted_assessment(assessment, assessment_type, member=None):
+ if not member:
+ member = frappe.session.user
+
+ if assessment_type == "LMS Assignment":
+ doctype = "LMS Assignment Submission"
+ docfield = "assignment"
+ fields = ["status"]
+ not_attempted = "Not Attempted"
+ elif assessment_type == "LMS Quiz":
+ doctype = "LMS Quiz Submission"
+ docfield = "quiz"
+ fields = ["score"]
+ not_attempted = 0
+
+ filters = {}
+ filters[docfield] = assessment
+ filters["member"] = member
+
+ attempt = frappe.db.exists(doctype, filters)
+ if attempt:
+ attempt_details = frappe.db.get_value(doctype, filters, fields)
+ return attempt_details
+ else:
+ return not_attempted
+
+
@frappe.whitelist()
def get_discussion_topics(doctype, docname, single_thread):
if single_thread: