diff --git a/community/lms/doctype/lms_course/lms_course.json b/community/lms/doctype/lms_course/lms_course.json index 0c104240..cad65d29 100644 --- a/community/lms/doctype/lms_course/lms_course.json +++ b/community/lms/doctype/lms_course/lms_course.json @@ -87,9 +87,14 @@ "group": "Mentors", "link_doctype": "LMS Course Mentor Mapping", "link_fieldname": "course" + }, + { + "group": "Mentors", + "link_doctype": "LMS Mentor Request", + "link_fieldname": "course" } ], - "modified": "2021-05-03 05:52:30.396824", + "modified": "2021-05-05 14:17:26.297602", "modified_by": "Administrator", "module": "LMS", "name": "LMS Course", diff --git a/community/lms/doctype/lms_mentor_request/lms_mentor_request.py b/community/lms/doctype/lms_mentor_request/lms_mentor_request.py index b98a2f45..d8b7ca6a 100644 --- a/community/lms/doctype/lms_mentor_request/lms_mentor_request.py +++ b/community/lms/doctype/lms_mentor_request/lms_mentor_request.py @@ -8,86 +8,118 @@ from frappe.model.document import Document from frappe import _ class LMSMentorRequest(Document): - def on_update(self): - if self.has_value_changed('status'): - template = frappe.db.get_single_value('LMS Settings', 'mentor_request_status_update') - if not template: - return + def on_update(self): + if self.has_value_changed('status'): - email_template = frappe.get_doc('Email Template', template) - message = frappe.render_template(email_template.response, {'member_name': self.member_name, 'status': self.status}) - subject = _('The status of your application has changed.') - member_email = frappe.db.get_value("Community Member", self.member, "email") - - if self.status == 'Approved' or self.status == 'Rejected': - reviewed_by = frappe.db.get_value('Community Member', self.reviewed_by, 'email') - send_email(member_email, [get_course_author(self.course), reviewed_by], subject, message) - - elif self.status == 'Withdrawn': - send_email([member_email, get_course_author(self.course)], None, subject, message) + if self.status == "Approved": + self.create_course_mentor_mapping() + + if self.status != "Pending": + self.send_status_change_email() + + def create_course_mentor_mapping(self): + mapping = frappe.get_doc({ + "doctype": "LMS Course Mentor Mapping", + "mentor": self.member, + "course": self.course + }) + mapping.save() + + def send_creation_email(self, member): + email_template = self.get_email_template('mentor_request_creation') + if not email_template: + return + + course_details = frappe.db.get_value("LMS Course", self.course, ["owner", "slug"], as_dict=True) + message = frappe.render_template(email_template.response, + { + 'member_name': member.full_name, + 'course_url': '/courses/' + course_details.slug + }) + + email_args = { + "recipients": [frappe.session.user, course_details.owner], + "subject": email_template.subject, + "header": email_template.subject, + "message": message + } + frappe.enqueue(method=frappe.sendmail, queue="short", timeout=300, is_async=True, **email_args) + + def send_status_change_email(self): + email_template = self.get_email_template('mentor_request_status_update') + if not email_template: + return + + message = frappe.render_template(email_template.response, + { + 'member_name': self.member_name, + 'status': self.status + }) + + member_email = frappe.db.get_value("Community Member", self.member, "email") + course_details = frappe.db.get_value("LMS Course", self.course, ["owner"], as_dict=True) + + if self.status == 'Approved' or self.status == 'Rejected': + reviewed_by = frappe.db.get_value('Community Member', self.reviewed_by, 'email') + email_args = { + "recipients": member_email, + "cc": [course_details.owner, reviewed_by], + "subject": email_template.subject, + "header": email_template.subject, + "message": message + } + frappe.enqueue(method=frappe.sendmail, queue="short", timeout=300, is_async=True, **email_args) + + elif self.status == 'Withdrawn': + email_args = { + "recipients": [member_email, course_details.owner], + "subject": email_template.subject, + "header": email_template.subject, + "message": message + } + frappe.enqueue(method=frappe.sendmail, queue="short", timeout=300, is_async=True, **email_args) + + def get_email_template(self, template_name): + template = frappe.db.get_single_value('LMS Settings', template_name) + if template: + return frappe.get_doc('Email Template', template) @frappe.whitelist() def has_requested(course): - return len(frappe.get_all('LMS Mentor Request', - filters = { - 'member': get_member().name, - 'course': course, - 'status': ['in', ('Pending', 'Approved')] - } - ) + return frappe.db.count('LMS Mentor Request', + filters = { + 'member': get_member().name, + 'course': course, + 'status': ['in', ('Pending', 'Approved')] + } ) @frappe.whitelist() def create_request(course): - if not has_requested(course): - member = get_member() - frappe.get_doc({ - 'doctype': 'LMS Mentor Request', - 'member': member.name, - 'course': course, - 'status': 'Pending' - }).save(ignore_permissions=True) - send_creation_email(course, member) - return 'OK' - else: - return 'Already Applied' + if not has_requested(course): + member = get_member() + request = frappe.get_doc({ + 'doctype': 'LMS Mentor Request', + 'member': member.name, + 'course': course, + 'status': 'Pending' + }) + request.save(ignore_permissions=True) + request.send_creation_email(member) + return 'OK' + + else: + return 'Already Applied' @frappe.whitelist() def cancel_request(course): - request = frappe.get_doc('LMS Mentor Request', {'member': get_member().name, 'course': course, 'status': ['in', ('Pending', 'Approved')]}) - request.status = 'Withdrawn' - request.save(ignore_permissions=True) - return 'OK' + request = frappe.get_doc('LMS Mentor Request', {'member': get_member().name, 'course': course, 'status': ['in', ('Pending', 'Approved')]}) + request.status = 'Withdrawn' + request.save(ignore_permissions=True) + return 'OK' def get_member(): - try: - return frappe.get_doc('Community Member', {'email': frappe.session.user}) - except frappe.DoesNotExistError: - return - -def get_course_author(course): - return frappe.db.get_value('LMS Course', course, 'owner') - -def send_creation_email(course, member): - template = frappe.db.get_single_value('LMS Settings', 'mentor_request_creation') - if not template: - return - - email_template = frappe.get_doc('Email Template', template) - member_name = member.full_name - message = frappe.render_template(email_template.response, {'member_name': member_name}) - subject = _('Request for Mentorship') - send_email([frappe.session.user, get_course_author(course)], None, subject, message) - -def send_email(recipients, cc=None, subject=None, message=None, template=None, args=None): - frappe.sendmail( - recipients = recipients, - cc = cc, - sender = frappe.db.get_single_value('LMS Settings', 'email_sender'), - subject = subject, - send_priority = 0, - queue_separately = True, - message = message, - template=template, - args=args - ) \ No newline at end of file + try: + return frappe.get_doc('Community Member', {'email': frappe.session.user}) + except frappe.DoesNotExistError: + return diff --git a/community/patches.txt b/community/patches.txt index 8ec78bbd..5b1b2f97 100644 --- a/community/patches.txt +++ b/community/patches.txt @@ -1,3 +1,4 @@ community.patches.set_email_preferences community.patches.change_name_for_community_members -community.patches.save_abbr_for_community_members \ No newline at end of file +community.patches.save_abbr_for_community_members +community.patches.create_mentor_request_email_templates diff --git a/community/patches/create_mentor_request_email_templates.py b/community/patches/create_mentor_request_email_templates.py new file mode 100644 index 00000000..93c13f27 --- /dev/null +++ b/community/patches/create_mentor_request_email_templates.py @@ -0,0 +1,31 @@ +from __future__ import unicode_literals +import frappe, os +from frappe import _ + +def execute(): + frappe.reload_doc("email", "doctype", "email_template") + base_path = frappe.get_app_path("community", "templates", "emails") + + if not frappe.db.exists("Email Template", _('Mentor Request Creation Template')): + response = frappe.read_file(os.path.join(base_path, "mentor_request_creation_email.html")) + frappe.get_doc({ + 'doctype': 'Email Template', + 'name': _("Mentor Request Creation Template"), + 'response': response, + 'subject': _('Request for Mentorship'), + 'owner': frappe.session.user + }).insert(ignore_permissions=True) + + frappe.db.set_value("LMS Settings", None, "mentor_request_creation", _('Mentor Request Creation Template')) + + if not frappe.db.exists("Email Template", _('Mentor Request Status Update Template')): + response = frappe.read_file(os.path.join(base_path, "mentor_request_status_update_email.html")) + frappe.get_doc({ + 'doctype': 'Email Template', + 'name': _("Mentor Request Status Update Template"), + 'response': response, + 'subject': _('The status of your application has changed.'), + 'owner': frappe.session.user + }).insert(ignore_permissions=True) + + frappe.db.set_value("LMS Settings", None, "mentor_request_status_update", _('Mentor Request Status Update Template')) diff --git a/community/templates/emails/mentor_request_creation_email.html b/community/templates/emails/mentor_request_creation_email.html new file mode 100644 index 00000000..62e13f49 --- /dev/null +++ b/community/templates/emails/mentor_request_creation_email.html @@ -0,0 +1,9 @@ +
+

Dear {{ member_name }},

+
+

You've applied to become a mentor for this course. Your request is currently under review.

+

If you are not any more interested to mentor this course, you can cancel your application.

+
+

Thanks and Regards,

+

Team Community.

+
diff --git a/community/templates/emails/mentor_request_status_update_email.html b/community/templates/emails/mentor_request_status_update_email.html new file mode 100644 index 00000000..bf2878f0 --- /dev/null +++ b/community/templates/emails/mentor_request_status_update_email.html @@ -0,0 +1,8 @@ +
+

Dear {{ member_name }},

+
+

Your request to join us as a mentor has been {{ status }}.

+
+

Thanks and Regards,

+

Team Community.

+
diff --git a/community/www/courses/course.js b/community/www/courses/course.js index ce08b2e0..3ac859b8 100644 --- a/community/www/courses/course.js +++ b/community/www/courses/course.js @@ -6,7 +6,7 @@ frappe.ready(() => { course: decodeURIComponent($("#course-title").attr("data-course")), }, 'callback': (data) => { - if (data.message) { + if (data.message > 0) { $("#mentor-request").addClass("hide"); $("#already-applied").removeClass("hide") }