fix: mentor request flow and emails #30, #69, #70

This commit is contained in:
pateljannat
2021-05-05 15:45:20 +05:30
parent 370d3a321b
commit 8a242a69fb
7 changed files with 159 additions and 73 deletions

View File

@@ -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",

View File

@@ -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
)
try:
return frappe.get_doc('Community Member', {'email': frappe.session.user})
except frappe.DoesNotExistError:
return

View File

@@ -1,3 +1,4 @@
community.patches.set_email_preferences
community.patches.change_name_for_community_members
community.patches.save_abbr_for_community_members
community.patches.save_abbr_for_community_members
community.patches.create_mentor_request_email_templates

View File

@@ -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'))

View File

@@ -0,0 +1,9 @@
<div>
<p>Dear {{ member_name }},</p>
<br>
<p>You've applied to become a mentor for this course. Your request is currently under review.</p>
<p>If you are not any more interested to mentor this course, you can <a href="{{ course_url }}">cancel your application</a>.</p>
<br>
<p>Thanks and Regards,</p>
<p>Team Community.</p>
</div>

View File

@@ -0,0 +1,8 @@
<div>
<p>Dear {{ member_name }},</p>
<br>
<p>Your request to join us as a mentor has been {{ status }}.</p>
<br>
<p>Thanks and Regards,</p>
<p>Team Community.</p>
</div>

View File

@@ -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")
}