From 719e47167865a1859244a3e78afbaa3801436b9c Mon Sep 17 00:00:00 2001 From: Jannat Patel Date: Tue, 16 Apr 2024 11:08:30 +0530 Subject: [PATCH] feat: evaluator unavailability --- .../src/components/Modals/EvaluationModal.vue | 6 +- frontend/src/pages/Profile.vue | 10 +- frontend/src/pages/ProfileCertificates.vue | 2 +- frontend/src/pages/ProfileEvaluator.vue | 280 +++++++++++++++++- .../{ProfileSettings.vue => ProfileRoles.vue} | 0 frontend/src/router.js | 8 +- lms/lms/api.py | 13 + .../course_evaluator/course_evaluator.json | 27 +- .../course_evaluator/course_evaluator.py | 19 +- .../lms_certificate_request.json | 4 +- .../lms_certificate_request.py | 25 ++ lms/lms/utils.py | 2 +- 12 files changed, 371 insertions(+), 25 deletions(-) rename frontend/src/pages/{ProfileSettings.vue => ProfileRoles.vue} (100%) diff --git a/frontend/src/components/Modals/EvaluationModal.vue b/frontend/src/components/Modals/EvaluationModal.vue index 05a129b5..1921ecae 100644 --- a/frontend/src/components/Modals/EvaluationModal.vue +++ b/frontend/src/components/Modals/EvaluationModal.vue @@ -25,7 +25,7 @@
{{ __('Date') }}
- +
@@ -57,7 +57,7 @@ + + 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), }