@@ -57,7 +57,7 @@
+
+
+
+ {{ __('My availability') }}
+
+
+
+
+
+ {{ __('Day') }}
+
+
+ {{ __('Start Time') }}
+
+
+ {{ __('End Time') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ __('I am unavailable') }}
+
+
+ {
+ updateUnavailability.submit({
+ field: 'unavailable_from',
+ value: from,
+ })
+ }
+ "
+ />
+ {
+ updateUnavailability.submit({
+ field: 'unavailable_to',
+ value: to,
+ })
+ }
+ "
+ />
+
+
+
+
+
diff --git a/frontend/src/pages/ProfileSettings.vue b/frontend/src/pages/ProfileRoles.vue
similarity index 100%
rename from frontend/src/pages/ProfileSettings.vue
rename to frontend/src/pages/ProfileRoles.vue
diff --git a/frontend/src/router.js b/frontend/src/router.js
index 0b5a09ca..5b7fcddb 100644
--- a/frontend/src/router.js
+++ b/frontend/src/router.js
@@ -73,13 +73,13 @@ const routes = [
component: () => import('@/pages/ProfileCertificates.vue'),
},
{
- name: 'ProfileSettings',
- path: 'settings',
- component: () => import('@/pages/ProfileSettings.vue'),
+ name: 'ProfileRoles',
+ path: 'roles',
+ component: () => import('@/pages/ProfileRoles.vue'),
},
{
name: 'ProfileEvaluator',
- path: 'evaluator',
+ path: 'evaluations',
component: () => import('@/pages/ProfileEvaluator.vue'),
},
],
diff --git a/lms/lms/api.py b/lms/lms/api.py
index 2b8e6b44..6d8bd0c8 100644
--- a/lms/lms/api.py
+++ b/lms/lms/api.py
@@ -298,3 +298,16 @@ def get_unsplash_photos(keyword=None):
return get_by_keyword(keyword)
return frappe.cache().get_value("unsplash_photos", generator=get_list)
+
+
+@frappe.whitelist()
+def get_evaluator_details(evaluator):
+ frappe.only_for("Batch Evaluator")
+
+ if frappe.db.exists("Course Evaluator", {"evaluator": evaluator}):
+ return frappe.get_doc("Course Evaluator", evaluator, as_dict=1)
+ else:
+ doc = frappe.new_doc("Course Evaluator")
+ doc.evaluator = evaluator
+ doc.insert()
+ return doc.as_dict()
diff --git a/lms/lms/doctype/course_evaluator/course_evaluator.json b/lms/lms/doctype/course_evaluator/course_evaluator.json
index 72ecf771..963c68e8 100644
--- a/lms/lms/doctype/course_evaluator/course_evaluator.json
+++ b/lms/lms/doctype/course_evaluator/course_evaluator.json
@@ -8,7 +8,11 @@
"engine": "InnoDB",
"field_order": [
"evaluator",
- "schedule"
+ "schedule",
+ "unavailability_section",
+ "unavailable_from",
+ "column_break_ahzi",
+ "unavailable_to"
],
"fields": [
{
@@ -23,11 +27,30 @@
"fieldtype": "Table",
"label": "Schedule",
"options": "Evaluator Schedule"
+ },
+ {
+ "fieldname": "unavailability_section",
+ "fieldtype": "Section Break",
+ "label": "Unavailability"
+ },
+ {
+ "fieldname": "column_break_ahzi",
+ "fieldtype": "Column Break"
+ },
+ {
+ "fieldname": "unavailable_from",
+ "fieldtype": "Date",
+ "label": "From"
+ },
+ {
+ "fieldname": "unavailable_to",
+ "fieldtype": "Date",
+ "label": "To"
}
],
"index_web_pages_for_search": 1,
"links": [],
- "modified": "2024-04-15 11:21:52.182338",
+ "modified": "2024-04-15 18:45:08.614466",
"modified_by": "Administrator",
"module": "LMS",
"name": "Course Evaluator",
diff --git a/lms/lms/doctype/course_evaluator/course_evaluator.py b/lms/lms/doctype/course_evaluator/course_evaluator.py
index 36b6a25d..3a3de370 100644
--- a/lms/lms/doctype/course_evaluator/course_evaluator.py
+++ b/lms/lms/doctype/course_evaluator/course_evaluator.py
@@ -6,6 +6,7 @@ from frappe import _
from frappe.model.document import Document
from lms.lms.utils import get_evaluator
from datetime import datetime
+from frappe.utils import get_time
class CourseEvaluator(Document):
@@ -14,7 +15,7 @@ class CourseEvaluator(Document):
def validate_time_slots(self):
for schedule in self.schedule:
- if schedule.start_time >= schedule.end_time:
+ if get_time(schedule.start_time) >= get_time(schedule.end_time):
frappe.throw(_("Start Time cannot be greater than End Time"))
self.validate_overlaps(schedule)
@@ -26,11 +27,21 @@ class CourseEvaluator(Document):
overlap = False
for slot in same_day_slots:
- if schedule.start_time <= slot.start_time < schedule.end_time:
+ if (
+ get_time(schedule.start_time)
+ <= get_time(slot.start_time)
+ < get_time(schedule.end_time)
+ ):
overlap = True
- if schedule.start_time < slot.end_time <= schedule.end_time:
+ if (
+ get_time(schedule.start_time)
+ < get_time(slot.end_time)
+ <= get_time(schedule.end_time)
+ ):
overlap = True
- if slot.start_time < schedule.start_time and schedule.end_time < slot.end_time:
+ if get_time(slot.start_time) < get_time(schedule.start_time) and get_time(
+ schedule.end_time
+ ) < get_time(slot.end_time):
overlap = True
if overlap:
diff --git a/lms/lms/doctype/lms_certificate_request/lms_certificate_request.json b/lms/lms/doctype/lms_certificate_request/lms_certificate_request.json
index e4ec298b..7405fe6b 100644
--- a/lms/lms/doctype/lms_certificate_request/lms_certificate_request.json
+++ b/lms/lms/doctype/lms_certificate_request/lms_certificate_request.json
@@ -39,8 +39,6 @@
"reqd": 1
},
{
- "fetch_from": "course.evaluator",
- "fetch_if_empty": 1,
"fieldname": "evaluator",
"fieldtype": "Link",
"label": "Evaluator",
@@ -109,7 +107,7 @@
],
"index_web_pages_for_search": 1,
"links": [],
- "modified": "2024-04-15 11:23:03.933035",
+ "modified": "2024-04-16 11:01:28.336807",
"modified_by": "Administrator",
"module": "LMS",
"name": "LMS Certificate Request",
diff --git a/lms/lms/doctype/lms_certificate_request/lms_certificate_request.py b/lms/lms/doctype/lms_certificate_request/lms_certificate_request.py
index 3f1039fa..426d872a 100644
--- a/lms/lms/doctype/lms_certificate_request/lms_certificate_request.py
+++ b/lms/lms/doctype/lms_certificate_request/lms_certificate_request.py
@@ -11,10 +11,35 @@ from lms.lms.utils import get_evaluator
class LMSCertificateRequest(Document):
def validate(self):
+ self.set_evaluator()
+ self.validate_unavailability()
self.validate_slot()
self.validate_if_existing_requests()
self.validate_evaluation_end_date()
+ def set_evaluator(self):
+ if not self.evaluator:
+ self.evaluator = get_evaluator(self.course, self.batch_name)
+
+ def validate_unavailability(self):
+ unavailable = frappe.db.get_value(
+ "Course Evaluator", self.evaluator, ["unavailable_from", "unavailable_to"], as_dict=1
+ )
+ if (
+ unavailable.unavailable_from
+ and unavailable.unavailable_to
+ and getdate(self.date) >= unavailable.unavailable_from
+ and getdate(self.date) <= unavailable.unavailable_to
+ ):
+ frappe.throw(
+ _(
+ "Evaluator is unavailable from {0} to {1}. Please select a date after {1}"
+ ).format(
+ format_date(unavailable.unavailable_from, "medium"),
+ format_date(unavailable.unavailable_to, "medium"),
+ )
+ )
+
def validate_slot(self):
if frappe.db.exists(
"LMS Certificate Request",
diff --git a/lms/lms/utils.py b/lms/lms/utils.py
index c959e559..459da21c 100644
--- a/lms/lms/utils.py
+++ b/lms/lms/utils.py
@@ -1798,6 +1798,6 @@ def get_roles(name):
return {
"moderator": has_course_moderator_role(name),
"course_creator": has_course_instructor_role(name),
- "class_evaluator": has_course_evaluator_role(name),
+ "batch_evaluator": has_course_evaluator_role(name),
"lms_student": has_student_role(name),
}