+ {{
+ __(
+ 'The deadline to schedule evaluations has passed. Please contact the Instructor for assistance.'
+ )
+ }}
+
+
{{ __('Schedule an evaluation to get certified.') }}
@@ -125,6 +140,7 @@ import { formatTime } from '@/utils'
import { Button, createResource, call } from 'frappe-ui'
import EvaluationModal from '@/components/Modals/EvaluationModal.vue'
import { Menu, MenuButton, MenuItems, MenuItem } from '@headlessui/vue'
+import IsSameOrAfter from 'dayjs/esm/plugin/IsSameOrAfter'
const dayjs = inject('$dayjs')
const showEvalModal = ref(false)
@@ -173,6 +189,19 @@ const evaluationCourses = computed(() => {
})
})
+const canScheduleEvals = computed(() => {
+ return (
+ upcoming_evals.data?.length != evaluationCourses.length &&
+ !props.forHome &&
+ !endDateHasPassed.value
+ )
+})
+
+const endDateHasPassed = computed(() => {
+ dayjs.extend(IsSameOrAfter)
+ return dayjs().isSameOrAfter(dayjs(props.endDate), 'day')
+})
+
const cancelEvaluation = (evl) => {
$dialog({
title: __('Cancel this evaluation?'),
diff --git a/frontend/src/pages/Batch.vue b/frontend/src/pages/Batch.vue
index bf3b1135..ad5c47bb 100644
--- a/frontend/src/pages/Batch.vue
+++ b/frontend/src/pages/Batch.vue
@@ -144,20 +144,7 @@
-
{{ __('Feedback') }}
diff --git a/frontend/yarn.lock b/frontend/yarn.lock
index 95621ac6..3dc3918b 100644
--- a/frontend/yarn.lock
+++ b/frontend/yarn.lock
@@ -1896,9 +1896,9 @@
integrity sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==
"@types/node@*":
- version "25.0.7"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-25.0.7.tgz#afd2f0d34358631a287c6726dabe0c845abc2bae"
- integrity sha512-C/er7DlIZgRJO7WtTdYovjIFzGsz0I95UlMyR9anTb4aCpBSRWe5Jc1/RvLKUfzmOxHPGjSE5+63HgLtndxU4w==
+ version "25.0.8"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-25.0.8.tgz#e54e00f94fe1db2497b3e42d292b8376a2678c8d"
+ integrity sha512-powIePYMmC3ibL0UJ2i2s0WIbq6cg6UyVFQxSCpaPxxzAaziRfimGivjdF943sSGV6RADVbk0Nvlm5P/FB44Zg==
dependencies:
undici-types "~7.16.0"
diff --git a/lms/lms/doctype/lms_batch_enrollment/lms_batch_enrollment.json b/lms/lms/doctype/lms_batch_enrollment/lms_batch_enrollment.json
index c9f3e793..a2f05643 100644
--- a/lms/lms/doctype/lms_batch_enrollment/lms_batch_enrollment.json
+++ b/lms/lms/doctype/lms_batch_enrollment/lms_batch_enrollment.json
@@ -73,7 +73,7 @@
],
"index_web_pages_for_search": 1,
"links": [],
- "modified": "2025-12-04 12:53:38.246250",
+ "modified": "2026-01-14 08:53:16.672825",
"modified_by": "sayali@frappe.io",
"module": "LMS",
"name": "LMS Batch Enrollment",
@@ -108,6 +108,18 @@
"if_owner": 1,
"read": 1,
"role": "LMS Student"
+ },
+ {
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Batch Evaluator",
+ "share": 1,
+ "write": 1
}
],
"row_format": "Dynamic",
diff --git a/lms/lms/doctype/lms_batch_feedback/lms_batch_feedback.json b/lms/lms/doctype/lms_batch_feedback/lms_batch_feedback.json
index 89e99c33..683a8876 100644
--- a/lms/lms/doctype/lms_batch_feedback/lms_batch_feedback.json
+++ b/lms/lms/doctype/lms_batch_feedback/lms_batch_feedback.json
@@ -76,7 +76,7 @@
"grid_page_length": 50,
"index_web_pages_for_search": 1,
"links": [],
- "modified": "2025-05-21 15:58:51.667270",
+ "modified": "2026-01-14 08:53:38.088168",
"modified_by": "sayali@frappe.io",
"module": "LMS",
"name": "LMS Batch Feedback",
@@ -105,6 +105,30 @@
"role": "LMS Student",
"share": 1,
"write": 1
+ },
+ {
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Moderator",
+ "share": 1,
+ "write": 1
+ },
+ {
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Batch Evaluator",
+ "share": 1,
+ "write": 1
}
],
"row_format": "Dynamic",
diff --git a/lms/lms/doctype/lms_live_class/lms_live_class.json b/lms/lms/doctype/lms_live_class/lms_live_class.json
index e734da4a..d71727ed 100644
--- a/lms/lms/doctype/lms_live_class/lms_live_class.json
+++ b/lms/lms/doctype/lms_live_class/lms_live_class.json
@@ -177,7 +177,7 @@
"link_fieldname": "live_class"
}
],
- "modified": "2025-05-27 14:44:35.679712",
+ "modified": "2026-01-14 08:54:07.684781",
"modified_by": "sayali@frappe.io",
"module": "LMS",
"name": "LMS Live Class",
@@ -215,6 +215,18 @@
"report": 1,
"role": "LMS Student",
"share": 1
+ },
+ {
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Batch Evaluator",
+ "share": 1,
+ "write": 1
}
],
"row_format": "Dynamic",
diff --git a/lms/lms/doctype/lms_live_class/lms_live_class.py b/lms/lms/doctype/lms_live_class/lms_live_class.py
index f54372fc..dc6dfa2f 100644
--- a/lms/lms/doctype/lms_live_class/lms_live_class.py
+++ b/lms/lms/doctype/lms_live_class/lms_live_class.py
@@ -155,11 +155,17 @@ def create_attendance(live_class, data):
doc = frappe.new_doc("LMS Live Class Participant")
doc.live_class = live_class.name
doc.member = participant.get("user_email")
- doc.joined_at = participant.get("join_time")
- doc.left_at = participant.get("leave_time")
- doc.duration = participant.get("duration")
+ doc.joined_at = get_datetime(participant.get("join_time"))
+ doc.left_at = get_datetime(participant.get("leave_time"))
+ doc.duration = get_minutes(participant.get("duration"))
doc.insert()
def update_attendees_count(live_class, data):
frappe.db.set_value("LMS Live Class", live_class.name, "attendees", len(data))
+
+
+def get_minutes(duration_in_seconds):
+ if duration_in_seconds:
+ return int(duration_in_seconds) // 60
+ return 0
diff --git a/lms/lms/doctype/lms_live_class_participant/lms_live_class_participant.json b/lms/lms/doctype/lms_live_class_participant/lms_live_class_participant.json
index 7dff5dfd..f1117c12 100644
--- a/lms/lms/doctype/lms_live_class_participant/lms_live_class_participant.json
+++ b/lms/lms/doctype/lms_live_class_participant/lms_live_class_participant.json
@@ -89,8 +89,8 @@
"grid_page_length": 50,
"index_web_pages_for_search": 1,
"links": [],
- "modified": "2025-05-27 22:32:24.196643",
- "modified_by": "Administrator",
+ "modified": "2026-01-14 08:54:21.421321",
+ "modified_by": "sayali@frappe.io",
"module": "LMS",
"name": "LMS Live Class Participant",
"owner": "Administrator",
@@ -106,6 +106,30 @@
"role": "System Manager",
"share": 1,
"write": 1
+ },
+ {
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Moderator",
+ "share": 1,
+ "write": 1
+ },
+ {
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Batch Evaluator",
+ "share": 1,
+ "write": 1
}
],
"row_format": "Dynamic",