refactor: patches to fix data, profile dashboard, lms mentor mapping page fixes
This commit is contained in:
@@ -5,7 +5,6 @@
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
from frappe.model.document import Document
|
||||
from community.www.courses.utils import get_member_with_email
|
||||
from frappe import _
|
||||
from community.lms.doctype.lms_batch_membership.lms_batch_membership import create_membership
|
||||
from community.query import find, find_all
|
||||
@@ -59,30 +58,23 @@ class LMSBatch(Document):
|
||||
{"batch": self.name, "member_type": "Student"},
|
||||
["member"])
|
||||
member_names = [m['member'] for m in memberships]
|
||||
members = frappe.get_all(
|
||||
"Users",
|
||||
{"email": ["IN", member_names]},
|
||||
["email", "full_name", "username"])
|
||||
return members
|
||||
return find_all("User", name=["IN", member_names])
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_messages(batch):
|
||||
messages = frappe.get_all("LMS Message", {"batch": batch}, ["*"], order_by="creation")
|
||||
for message in messages:
|
||||
message.message = frappe.utils.md_to_html(message.message)
|
||||
member_email = frappe.db.get_value("Community Member", message.author, ["email"])
|
||||
if member_email == frappe.session.user:
|
||||
message.author_name = "You"
|
||||
message.is_author = True
|
||||
return messages
|
||||
def get_messages(self):
|
||||
messages = frappe.get_all("LMS Message", {"batch": self.name}, ["*"], order_by="creation")
|
||||
for message in messages:
|
||||
message.message = frappe.utils.md_to_html(message.message)
|
||||
if message.author == frappe.session.user:
|
||||
message.author_name = "You"
|
||||
message.is_author = True
|
||||
return messages
|
||||
|
||||
@frappe.whitelist()
|
||||
def save_message(message, batch):
|
||||
doc = frappe.get_doc({
|
||||
"doctype": "LMS Message",
|
||||
"batch": batch,
|
||||
"author": get_member_with_email(),
|
||||
"author": frappe.session.user,
|
||||
"message": message
|
||||
})
|
||||
doc.save(ignore_permissions=True)
|
||||
|
||||
@@ -14,18 +14,31 @@ class LMSBatchMembership(Document):
|
||||
self.validate_membership_in_different_batch_same_course()
|
||||
|
||||
def validate_membership_in_same_batch(self):
|
||||
previous_membership = frappe.db.get_value("LMS Batch Membership", {"member": self.member, "batch": self.batch, "name": ["!=", self.name]}, ["member_type","member"], as_dict=1)
|
||||
previous_membership = frappe.db.get_value("LMS Batch Membership",
|
||||
filters={
|
||||
"member": self.member,
|
||||
"batch": self.batch, "name": ["!=", self.name]
|
||||
},
|
||||
fieldname=["member_type","member"],
|
||||
as_dict=1)
|
||||
|
||||
if previous_membership:
|
||||
member_name = frappe.db.get_value("Community Member", self.member, "full_name")
|
||||
member_name = frappe.db.get_value("User", self.member, "full_name")
|
||||
frappe.throw(_("{0} is already a {1} of {2}").format(member_name, previous_membership.member_type, self.batch))
|
||||
|
||||
def validate_membership_in_different_batch_same_course(self):
|
||||
course = frappe.db.get_value("LMS Batch", self.batch, "course")
|
||||
previous_membership = frappe.get_all("LMS Batch Membership", {"member": self.member}, ["batch", "member_type"])
|
||||
previous_membership = frappe.get_all("LMS Batch Membership",
|
||||
filters={
|
||||
"member": self.member
|
||||
},
|
||||
fieldname=["batch", "member_type"]
|
||||
)
|
||||
|
||||
for membership in previous_membership:
|
||||
batch_course = frappe.db.get_value("LMS Batch", membership.batch, "course")
|
||||
if batch_course == course and (membership.member_type == "Student" or self.member_type == "Student"):
|
||||
member_name = frappe.db.get_value("Community Member", self.member, "full_name")
|
||||
member_name = frappe.db.get_value("User", self.member, "full_name")
|
||||
frappe.throw(_("{0} is already a {1} of {2} course through {3} batch").format(member_name, membership.member_type, course, membership.batch))
|
||||
|
||||
def create_membership(batch, member=None, member_type="Student", role="Member"):
|
||||
|
||||
@@ -41,21 +41,9 @@ class LMSCourse(Document):
|
||||
if not email or email == "Guest":
|
||||
return False
|
||||
|
||||
member = self.get_community_member(email)
|
||||
if not member:
|
||||
return False
|
||||
|
||||
mapping = frappe.get_all("LMS Course Mentor Mapping", {"course": self.name, "mentor": member})
|
||||
mapping = frappe.get_all("LMS Course Mentor Mapping", {"course": self.name, "mentor": email})
|
||||
return mapping != []
|
||||
|
||||
def get_community_member(self, email):
|
||||
"""Returns the name of Community Member document for a give user.
|
||||
"""
|
||||
try:
|
||||
return frappe.db.get_value("Community Member", {"email": email}, "name")
|
||||
except frappe.DoesNotExistError:
|
||||
return None
|
||||
|
||||
def add_mentor(self, email):
|
||||
"""Adds a new mentor to the course.
|
||||
"""
|
||||
@@ -68,14 +56,10 @@ class LMSCourse(Document):
|
||||
if self.has_mentor(email):
|
||||
return
|
||||
|
||||
member = self.get_community_member(email)
|
||||
if not member:
|
||||
return False
|
||||
|
||||
doc = frappe.get_doc({
|
||||
"doctype": "LMS Course Mentor Mapping",
|
||||
"course": self.name,
|
||||
"mentor": member
|
||||
"mentor": email
|
||||
})
|
||||
doc.insert()
|
||||
|
||||
@@ -96,11 +80,10 @@ class LMSCourse(Document):
|
||||
"""
|
||||
if not email:
|
||||
return False
|
||||
member = self.get_community_member(email)
|
||||
return frappe.db.exists({
|
||||
"doctype": "LMS Course Mentor Mapping",
|
||||
"course": self.name,
|
||||
"mentor": member
|
||||
"mentor": email
|
||||
})
|
||||
|
||||
def get_student_batch(self, email):
|
||||
@@ -110,11 +93,10 @@ class LMSCourse(Document):
|
||||
"""
|
||||
if not email:
|
||||
return False
|
||||
member = self.get_community_member(email)
|
||||
result = frappe.db.get_all(
|
||||
"LMS Batch Membership",
|
||||
filters={
|
||||
"member": member,
|
||||
"member": email,
|
||||
"member_type": "Student",
|
||||
},
|
||||
fields=['batch']
|
||||
@@ -148,10 +130,9 @@ class LMSCourse(Document):
|
||||
batches = find_all("LMS Batch", course=self.name)
|
||||
if mentor:
|
||||
# TODO: optimize this
|
||||
member = self.get_community_member(email=mentor)
|
||||
memberships = frappe.db.get_all(
|
||||
"LMS Batch Membership",
|
||||
{"member": member},
|
||||
{"member": mentor},
|
||||
["batch"])
|
||||
batch_names = {m.batch for m in memberships}
|
||||
return [b for b in batches if b.name in batch_names]
|
||||
|
||||
@@ -25,7 +25,7 @@ class LMSMentorRequest(Document):
|
||||
})
|
||||
mapping.save()
|
||||
|
||||
def send_creation_email(self, member):
|
||||
def send_creation_email(self):
|
||||
email_template = self.get_email_template('mentor_request_creation')
|
||||
if not email_template:
|
||||
return
|
||||
@@ -33,7 +33,7 @@ class LMSMentorRequest(Document):
|
||||
course_details = frappe.db.get_value("LMS Course", self.course, ["owner", "slug", "title"], as_dict=True)
|
||||
message = frappe.render_template(email_template.response,
|
||||
{
|
||||
'member_name': member.full_name,
|
||||
'member_name': frappe.db.get_value("User", frappe.session.user, "full_name"),
|
||||
'course_url': '/courses/' + course_details.slug,
|
||||
'course': course_details.title
|
||||
})
|
||||
@@ -59,12 +59,10 @@ class LMSMentorRequest(Document):
|
||||
'course': course_details.title
|
||||
})
|
||||
|
||||
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')
|
||||
email_args = {
|
||||
"recipients": member_email,
|
||||
"cc": [course_details.owner, reviewed_by],
|
||||
"recipients": self.member,
|
||||
"cc": [course_details.owner, self.reviewed_by],
|
||||
"subject": email_template.subject,
|
||||
"header": email_template.subject,
|
||||
"message": message
|
||||
@@ -73,7 +71,7 @@ class LMSMentorRequest(Document):
|
||||
|
||||
elif self.status == 'Withdrawn':
|
||||
email_args = {
|
||||
"recipients": [member_email, course_details.owner],
|
||||
"recipients": [self.member, course_details.owner],
|
||||
"subject": email_template.subject,
|
||||
"header": email_template.subject,
|
||||
"message": message
|
||||
@@ -89,7 +87,7 @@ class LMSMentorRequest(Document):
|
||||
def has_requested(course):
|
||||
return frappe.db.count('LMS Mentor Request',
|
||||
filters = {
|
||||
'member': get_member().name,
|
||||
'member': frappe.session.user,
|
||||
'course': course,
|
||||
'status': ['in', ('Pending', 'Approved')]
|
||||
}
|
||||
@@ -98,15 +96,14 @@ def has_requested(course):
|
||||
@frappe.whitelist()
|
||||
def create_request(course):
|
||||
if not has_requested(course):
|
||||
member = get_member()
|
||||
request = frappe.get_doc({
|
||||
'doctype': 'LMS Mentor Request',
|
||||
'member': member.name,
|
||||
'member': frappe.session.user,
|
||||
'course': course,
|
||||
'status': 'Pending'
|
||||
})
|
||||
request.save(ignore_permissions=True)
|
||||
request.send_creation_email(member)
|
||||
request.send_creation_email()
|
||||
return 'OK'
|
||||
|
||||
else:
|
||||
@@ -114,13 +111,13 @@ def create_request(course):
|
||||
|
||||
@frappe.whitelist()
|
||||
def cancel_request(course):
|
||||
request = frappe.get_doc('LMS Mentor Request', {'member': get_member().name, 'course': course, 'status': ['in', ('Pending', 'Approved')]})
|
||||
request = frappe.get_doc('LMS Mentor Request',
|
||||
filters={
|
||||
'member': frappe.session.user,
|
||||
'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
|
||||
|
||||
@@ -82,4 +82,4 @@
|
||||
"sort_order": "DESC",
|
||||
"title_field": "author",
|
||||
"track_changes": 1
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,98 +7,100 @@ import frappe
|
||||
from frappe.model.document import Document
|
||||
from frappe import _
|
||||
from frappe.utils import add_days, nowdate
|
||||
from community.www.courses.utils import get_batch_members
|
||||
|
||||
class LMSMessage(Document):
|
||||
""" def after_insert(self):
|
||||
self.send_email() """
|
||||
""" def after_insert(self):
|
||||
Todo: Adding email preference field for users
|
||||
self.send_email() """
|
||||
|
||||
def send_email(self):
|
||||
membership = frappe.get_all("LMS Batch Membership", {"batch": self.batch}, ["member"])
|
||||
for entry in membership:
|
||||
member = frappe.get_doc("User", entry.member)
|
||||
if member.name != self.author:
|
||||
frappe.sendmail(
|
||||
recipients = member.email,
|
||||
subject = _("New Message on ") + self.batch,
|
||||
header = _("New Message on ") + self.batch,
|
||||
template = "lms_message",
|
||||
args = {
|
||||
"author": self.author,
|
||||
"message": frappe.utils.md_to_html(self.message),
|
||||
"creation": frappe.utils.format_datetime(self.creation, "medium"),
|
||||
"course": frappe.db.get_value("LMS Batch", self.batch, ["course"])
|
||||
}
|
||||
)
|
||||
|
||||
def send_email(self):
|
||||
membership = frappe.get_all("LMS Batch Membership", {"batch": self.batch}, ["member"])
|
||||
for entry in membership:
|
||||
member = frappe.get_doc("Community Member", entry.member)
|
||||
if member.name != self.author and member.email_preference == "Email on every Message":
|
||||
frappe.sendmail(
|
||||
recipients = member.email,
|
||||
subject = _("New Message on ") + self.batch,
|
||||
header = _("New Message on ") + self.batch,
|
||||
template = "lms_message",
|
||||
args = {
|
||||
"author": self.author,
|
||||
"message": frappe.utils.md_to_html(self.message),
|
||||
"creation": frappe.utils.format_datetime(self.creation, "medium"),
|
||||
"course": frappe.db.get_value("LMS Batch", self.batch, ["course"])
|
||||
}
|
||||
)
|
||||
def send_daily_digest():
|
||||
emails = frappe._dict()
|
||||
messages = frappe.get_all("LMS Message", {"creation": [">=", add_days(nowdate(), -1)]}, ["message", "batch", "author", "creation"])
|
||||
for message in messages:
|
||||
membership = frappe.get_all("LMS Batch Membership", {"batch": message.batch}, ["member"])
|
||||
for entry in membership:
|
||||
member = frappe.db.get_value("Community Member", entry.member, ["name", "email_preference", "email"], as_dict=1)
|
||||
if member.name != message.author and member.email_preference == "One Digest Mail per day":
|
||||
if member.name in emails.keys():
|
||||
emails[member.name]["messages"].append(message)
|
||||
else:
|
||||
emails[member.name] = frappe._dict({
|
||||
"email": member.email,
|
||||
"messages": [message]
|
||||
})
|
||||
for email in emails:
|
||||
group_by_batch = frappe._dict()
|
||||
for message in emails[email]["messages"]:
|
||||
if message.batch in group_by_batch.keys():
|
||||
group_by_batch[message.batch].append(message)
|
||||
else:
|
||||
group_by_batch[message.batch] = [message]
|
||||
frappe.sendmail(
|
||||
recipients = frappe.db.get_value("Community Member", email, "email"),
|
||||
subject = _("Message Digest"),
|
||||
header = _("Message Digest"),
|
||||
template = "lms_daily_digest",
|
||||
args = {
|
||||
"batches": group_by_batch
|
||||
},
|
||||
delayed = False
|
||||
)
|
||||
#Todo: Optimize this
|
||||
emails = frappe._dict()
|
||||
messages = frappe.get_all("LMS Message", {"creation": [">=", add_days(nowdate(), -1)]}, ["message", "batch", "author", "creation"])
|
||||
for message in messages:
|
||||
membership = frappe.get_all("LMS Batch Membership", {"batch": message.batch}, ["member"])
|
||||
for entry in membership:
|
||||
member = frappe.db.get_value("User", entry.member, ["name", "email"], as_dict=1)
|
||||
if member.name != message.author:
|
||||
if member.name in emails.keys():
|
||||
emails[member.name]["messages"].append(message)
|
||||
else:
|
||||
emails[member.name] = frappe._dict({
|
||||
"email": member.email,
|
||||
"messages": [message]
|
||||
})
|
||||
for email in emails:
|
||||
group_by_batch = frappe._dict()
|
||||
for message in emails[email]["messages"]:
|
||||
if message.batch in group_by_batch.keys():
|
||||
group_by_batch[message.batch].append(message)
|
||||
else:
|
||||
group_by_batch[message.batch] = [message]
|
||||
frappe.sendmail(
|
||||
recipients = frappe.db.get_value("User", email, "email"),
|
||||
subject = _("Message Digest"),
|
||||
header = _("Message Digest"),
|
||||
template = "lms_daily_digest",
|
||||
args = {
|
||||
"batches": group_by_batch
|
||||
},
|
||||
delayed = False
|
||||
)
|
||||
|
||||
def publish_message(doc, method):
|
||||
email = frappe.db.get_value("Community Member", doc.author, "email")
|
||||
template = get_message_template()
|
||||
message = frappe._dict()
|
||||
message.author_name = doc.author_name
|
||||
message.message_time = frappe.utils.pretty_date(doc.creation)
|
||||
message.message = frappe.utils.md_to_html(doc.message)
|
||||
template = get_message_template()
|
||||
message = frappe._dict({
|
||||
"author_name": doc.author_name,
|
||||
"message_time": frappe.utils.pretty_date(doc.creation),
|
||||
"message": frappe.utils.md_to_html(doc.message)
|
||||
})
|
||||
|
||||
js = """
|
||||
$(".msger-input").val("");
|
||||
var template = `{0}`;
|
||||
var message = {1};
|
||||
var session_user = ("{2}" == frappe.session.user) ? true : false;
|
||||
message.author_name = session_user ? "You" : message.author_name
|
||||
message.is_author = session_user;
|
||||
template = frappe.render_template(template, {{
|
||||
"message": message
|
||||
}})
|
||||
$(".message-section").append(template);
|
||||
""".format(template, message, email)
|
||||
js = """
|
||||
$(".msger-input").val("");
|
||||
var template = `{0}`;
|
||||
var message = {1};
|
||||
var session_user = ("{2}" == frappe.session.user) ? true : false;
|
||||
message.author_name = session_user ? "You" : message.author_name
|
||||
message.is_author = session_user;
|
||||
template = frappe.render_template(template, {{
|
||||
"message": message
|
||||
}})
|
||||
$(".message-section").append(template);
|
||||
""".format(template, message, doc.owner)
|
||||
|
||||
frappe.publish_realtime(event="eval_js", message=js, after_commit=True)
|
||||
frappe.publish_realtime(event="eval_js", message=js, after_commit=True)
|
||||
|
||||
def get_message_template():
|
||||
return """
|
||||
<div class="discussion {% if message.is_author %} is-author {% endif %}">
|
||||
<div class="d-flex justify-content-between">
|
||||
<div class="font-weight-bold">
|
||||
{{ message.author_name }}
|
||||
</div>
|
||||
<div class="text-muted">
|
||||
{{ message.message_time }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-5">
|
||||
{{ message.message }}
|
||||
</div>
|
||||
</div>
|
||||
"""
|
||||
return """
|
||||
<div class="discussion {% if message.is_author %} is-author {% endif %}">
|
||||
<div class="d-flex justify-content-between">
|
||||
<div class="font-weight-bold">
|
||||
{{ message.author_name }}
|
||||
</div>
|
||||
<div class="text-muted">
|
||||
{{ message.message_time }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-5">
|
||||
{{ message.message }}
|
||||
</div>
|
||||
</div>
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user