@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
31
community/patches/create_mentor_request_email_templates.py
Normal file
31
community/patches/create_mentor_request_email_templates.py
Normal 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'))
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user