From 926444767b06288b596656ce2d95e3a34f938ea7 Mon Sep 17 00:00:00 2001 From: Jannat Patel Date: Thu, 16 Feb 2023 20:11:03 +0530 Subject: [PATCH 1/3] feat: event for evaluation --- .../lms_certificate_request.py | 44 +++++++++++++++++++ lms/lms/doctype/lms_course/lms_course.json | 3 +- .../doctype/lms_settings/lms_settings.json | 40 ++++++++++++++--- lms/lms/doctype/lms_settings/lms_settings.py | 33 +++++++++++++- 4 files changed, 111 insertions(+), 9 deletions(-) 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 61e95d06..38fc472e 100644 --- a/lms/lms/doctype/lms_certificate_request/lms_certificate_request.py +++ b/lms/lms/doctype/lms_certificate_request/lms_certificate_request.py @@ -12,6 +12,10 @@ class LMSCertificateRequest(Document): def validate(self): self.validate_if_existing_requests() + def after_insert(self): + if frappe.db.get_single_value("LMS Settings", "send_calendar_invite_for_evaluations"): + self.create_event() + def validate_if_existing_requests(self): existing_requests = frappe.get_all( "LMS Certificate Request", @@ -30,6 +34,46 @@ class LMSCertificateRequest(Document): ) ) + def create_event(self): + calendar = frappe.db.get_value("Google Calendar", {"user": self.evaluator}, "name") + + if calendar: + event = frappe.get_doc( + { + "doctype": "Event", + "subject": f"Evaluation of {self.member_name}", + "starts_on": f"{self.date} {self.start_time}", + "ends_on": f"{self.date} {self.end_time}", + } + ) + event.save() + + participants = [self.member, self.evaluator] + for participant in participants: + contact_name = frappe.db.get_value("Contact", {"email_id": participant}, "name") + frappe.get_doc( + { + "doctype": "Event Participants", + "reference_doctype": "Contact", + "reference_docname": contact_name, + "email": participant, + "parent": event.name, + "parenttype": "Event", + "parentfield": "event_participants", + } + ).save() + + event.reload() + event.update( + { + "sync_with_google_calendar": 1, + "add_video_conferencing": 1, + "google_calendar": calendar, + } + ) + + event.save() + @frappe.whitelist() def create_certificate_request(course, date, day, start_time, end_time): diff --git a/lms/lms/doctype/lms_course/lms_course.json b/lms/lms/doctype/lms_course/lms_course.json index f2e4ce4a..cb656a26 100644 --- a/lms/lms/doctype/lms_course/lms_course.json +++ b/lms/lms/doctype/lms_course/lms_course.json @@ -261,7 +261,7 @@ } ], "make_attachments_public": 1, - "modified": "2022-09-14 13:26:53.153822", + "modified": "2023-02-16 10:11:17.557472", "modified_by": "Administrator", "module": "LMS", "name": "LMS Course", @@ -295,7 +295,6 @@ } ], "search_fields": "title", - "show_title_field_in_link": 1, "sort_field": "creation", "sort_order": "DESC", "states": [], diff --git a/lms/lms/doctype/lms_settings/lms_settings.json b/lms/lms/doctype/lms_settings/lms_settings.json index fe272759..e2f7d108 100644 --- a/lms/lms/doctype/lms_settings/lms_settings.json +++ b/lms/lms/doctype/lms_settings/lms_settings.json @@ -5,14 +5,18 @@ "editable_grid": 1, "engine": "InnoDB", "field_order": [ - "search_placeholder", - "portal_course_creation", "default_home", "is_onboarding_complete", + "column_break_zdel", + "send_calendar_invite_for_evaluations", + "force_profile_completion", + "section_break_szgq", + "search_placeholder", + "portal_course_creation", "column_break_2", "custom_certificate_template", "livecode_url", - "force_profile_completion", + "signup_settings_tab", "signup_settings_section", "terms_of_use", "terms_page", @@ -23,6 +27,7 @@ "column_break_12", "cookie_policy", "cookie_policy_page", + "mentor_request_tab", "mentor_request_section", "mentor_request_creation", "mentor_request_status_update" @@ -82,8 +87,7 @@ }, { "fieldname": "signup_settings_section", - "fieldtype": "Section Break", - "label": "Signup Settings" + "fieldtype": "Section Break" }, { "default": "0", @@ -152,12 +156,36 @@ "fieldname": "default_home", "fieldtype": "Check", "label": "Make LMS the default home" + }, + { + "fieldname": "column_break_zdel", + "fieldtype": "Column Break" + }, + { + "default": "0", + "fieldname": "send_calendar_invite_for_evaluations", + "fieldtype": "Check", + "label": "Send calendar invite for evaluations" + }, + { + "fieldname": "section_break_szgq", + "fieldtype": "Section Break" + }, + { + "fieldname": "signup_settings_tab", + "fieldtype": "Tab Break", + "label": "Signup Settings" + }, + { + "fieldname": "mentor_request_tab", + "fieldtype": "Tab Break", + "label": "Mentor Request" } ], "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2023-02-07 19:53:46.073914", + "modified": "2023-02-15 17:13:11.802215", "modified_by": "Administrator", "module": "LMS", "name": "LMS Settings", diff --git a/lms/lms/doctype/lms_settings/lms_settings.py b/lms/lms/doctype/lms_settings/lms_settings.py index d8afde6e..4d90bc41 100644 --- a/lms/lms/doctype/lms_settings/lms_settings.py +++ b/lms/lms/doctype/lms_settings/lms_settings.py @@ -4,7 +4,38 @@ import frappe from frappe import _ from frappe.model.document import Document +from frappe.utils import get_url_to_list class LMSSettings(Document): - pass + def validate(self): + self.validate_google_settings() + + def validate_google_settings(self): + if self.send_calendar_invite_for_evaluations: + google_settings = frappe.get_single("Google Settings") + + if not google_settings.enable: + frappe.throw( + _("Enable Google API in Google Settings to send calendar invites for evaluations.") + ) + + if not google_settings.client_id or not google_settings.client_secret: + frappe.throw( + _( + "Enter Client Id and Client Secret in Google Settings to send calendar invites for evaluations." + ) + ) + + calendars = frappe.db.count("Google Calendar") + if not calendars: + frappe.throw( + _( + "Please add {1} for {3} to send calendar invites for evaluations." + ).format( + get_url_to_list("Google Calendar"), + frappe.bold("Google Calendar"), + get_url_to_list("Course Evaluator"), + frappe.bold("Course Evaluator"), + ) + ) From 619a2f9d80413fcb6930744daf119f204b60f1f7 Mon Sep 17 00:00:00 2001 From: Jannat Patel Date: Thu, 16 Feb 2023 20:20:16 +0530 Subject: [PATCH 2/3] fix: only link calendars that are enabled --- .../lms_certificate_request/lms_certificate_request.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 38fc472e..0570d615 100644 --- a/lms/lms/doctype/lms_certificate_request/lms_certificate_request.py +++ b/lms/lms/doctype/lms_certificate_request/lms_certificate_request.py @@ -35,7 +35,9 @@ class LMSCertificateRequest(Document): ) def create_event(self): - calendar = frappe.db.get_value("Google Calendar", {"user": self.evaluator}, "name") + calendar = frappe.db.get_value( + "Google Calendar", {"user": self.evaluator, "enable": 1}, "name" + ) if calendar: event = frappe.get_doc( From 8e1ef1dc77e6f50c9bec7546d5835c5171631d3b Mon Sep 17 00:00:00 2001 From: Jannat Patel Date: Fri, 17 Feb 2023 10:52:50 +0530 Subject: [PATCH 3/3] fix: layout of certification request --- .../lms_certificate_evaluation.js | 2 +- .../lms_certificate_request.js | 17 +++++++++++------ .../lms_certificate_request.json | 17 ++++++++++++++--- 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/lms/lms/doctype/lms_certificate_evaluation/lms_certificate_evaluation.js b/lms/lms/doctype/lms_certificate_evaluation/lms_certificate_evaluation.js index 329f701d..5e93d55d 100644 --- a/lms/lms/doctype/lms_certificate_evaluation/lms_certificate_evaluation.js +++ b/lms/lms/doctype/lms_certificate_evaluation/lms_certificate_evaluation.js @@ -3,7 +3,7 @@ frappe.ui.form.on("LMS Certificate Evaluation", { refresh: function (frm) { - if (frm.doc.status == "Pass") { + if (!frm.is_new() && frm.doc.status == "Pass") { frm.add_custom_button(__("Create LMS Certificate"), () => { frappe.model.open_mapped_doc({ method: "lms.lms.doctype.lms_certificate_evaluation.lms_certificate_evaluation.create_lms_certificate", diff --git a/lms/lms/doctype/lms_certificate_request/lms_certificate_request.js b/lms/lms/doctype/lms_certificate_request/lms_certificate_request.js index d352c1b6..cb024880 100644 --- a/lms/lms/doctype/lms_certificate_request/lms_certificate_request.js +++ b/lms/lms/doctype/lms_certificate_request/lms_certificate_request.js @@ -3,12 +3,17 @@ frappe.ui.form.on("LMS Certificate Request", { refresh: function (frm) { - frm.add_custom_button(__("Create LMS Certificate Evaluation"), () => { - frappe.model.open_mapped_doc({ - method: "lms.lms.doctype.lms_certificate_request.lms_certificate_request.create_lms_certificate_evaluation", - frm: frm, - }); - }); + if (!frm.is_new()) { + frm.add_custom_button( + __("Create LMS Certificate Evaluation"), + () => { + frappe.model.open_mapped_doc({ + method: "lms.lms.doctype.lms_certificate_request.lms_certificate_request.create_lms_certificate_evaluation", + frm: frm, + }); + } + ); + } }, onload: function (frm) { 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 cbe66fb9..f789c44a 100644 --- a/lms/lms/doctype/lms_certificate_request/lms_certificate_request.json +++ b/lms/lms/doctype/lms_certificate_request/lms_certificate_request.json @@ -7,12 +7,14 @@ "engine": "InnoDB", "field_order": [ "course", - "member", - "member_name", "evaluator", "column_break_4", + "member", + "member_name", + "section_break_lifi", "date", "day", + "column_break_ddyh", "start_time", "end_time" ], @@ -80,11 +82,19 @@ "fieldtype": "Data", "label": "Member Name", "read_only": 1 + }, + { + "fieldname": "section_break_lifi", + "fieldtype": "Section Break" + }, + { + "fieldname": "column_break_ddyh", + "fieldtype": "Column Break" } ], "index_web_pages_for_search": 1, "links": [], - "modified": "2022-04-06 11:33:33.711545", + "modified": "2023-02-17 09:26:13.776325", "modified_by": "Administrator", "module": "LMS", "name": "LMS Certificate Request", @@ -99,6 +109,7 @@ "read": 1, "report": 1, "role": "System Manager", + "select": 1, "share": 1, "write": 1 }