refactor: patches to fix data, profile dashboard, lms mentor mapping page fixes
This commit is contained in:
@@ -1,8 +1,8 @@
|
|||||||
{% set color = member.get_palette() %}
|
{% set color = member.get_palette() %}
|
||||||
<a href="/{{member.username}}">
|
<a href="/{{member.username}}">
|
||||||
<span class="avatar {{ avatar_class }}" title="{{ member.full_name }}">
|
<span class="avatar {{ avatar_class }}" title="{{ member.full_name }}">
|
||||||
{% if member.user_image %}
|
{% if member.user_image %}
|
||||||
<img class="avatar-frame standard-image" src="{{ member.user_image }}" title="{{ member.full_name }}">
|
<img class="avatar-frame standard-image" style="object-fit: cover;" src="{{ member.user_image }}" title="{{ member.full_name }}">
|
||||||
</img>
|
</img>
|
||||||
{% else %}
|
{% else %}
|
||||||
<span class="avatar-frame standard-image" title="{{ member.full_name }}"
|
<span class="avatar-frame standard-image" title="{{ member.full_name }}"
|
||||||
@@ -10,5 +10,5 @@
|
|||||||
{{ frappe.utils.get_abbr(member.full_name) }}
|
{{ frappe.utils.get_abbr(member.full_name) }}
|
||||||
</span>
|
</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</a>
|
</span>
|
||||||
</span>
|
</a>
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
import frappe
|
import frappe
|
||||||
from frappe.model.document import Document
|
from frappe.model.document import Document
|
||||||
from community.www.courses.utils import get_member_with_email
|
|
||||||
from frappe import _
|
from frappe import _
|
||||||
from community.lms.doctype.lms_batch_membership.lms_batch_membership import create_membership
|
from community.lms.doctype.lms_batch_membership.lms_batch_membership import create_membership
|
||||||
from community.query import find, find_all
|
from community.query import find, find_all
|
||||||
@@ -59,20 +58,13 @@ class LMSBatch(Document):
|
|||||||
{"batch": self.name, "member_type": "Student"},
|
{"batch": self.name, "member_type": "Student"},
|
||||||
["member"])
|
["member"])
|
||||||
member_names = [m['member'] for m in memberships]
|
member_names = [m['member'] for m in memberships]
|
||||||
members = frappe.get_all(
|
return find_all("User", name=["IN", member_names])
|
||||||
"Users",
|
|
||||||
{"email": ["IN", member_names]},
|
|
||||||
["email", "full_name", "username"])
|
|
||||||
return members
|
|
||||||
|
|
||||||
|
def get_messages(self):
|
||||||
@frappe.whitelist()
|
messages = frappe.get_all("LMS Message", {"batch": self.name}, ["*"], order_by="creation")
|
||||||
def get_messages(batch):
|
|
||||||
messages = frappe.get_all("LMS Message", {"batch": batch}, ["*"], order_by="creation")
|
|
||||||
for message in messages:
|
for message in messages:
|
||||||
message.message = frappe.utils.md_to_html(message.message)
|
message.message = frappe.utils.md_to_html(message.message)
|
||||||
member_email = frappe.db.get_value("Community Member", message.author, ["email"])
|
if message.author == frappe.session.user:
|
||||||
if member_email == frappe.session.user:
|
|
||||||
message.author_name = "You"
|
message.author_name = "You"
|
||||||
message.is_author = True
|
message.is_author = True
|
||||||
return messages
|
return messages
|
||||||
@@ -82,7 +74,7 @@ def save_message(message, batch):
|
|||||||
doc = frappe.get_doc({
|
doc = frappe.get_doc({
|
||||||
"doctype": "LMS Message",
|
"doctype": "LMS Message",
|
||||||
"batch": batch,
|
"batch": batch,
|
||||||
"author": get_member_with_email(),
|
"author": frappe.session.user,
|
||||||
"message": message
|
"message": message
|
||||||
})
|
})
|
||||||
doc.save(ignore_permissions=True)
|
doc.save(ignore_permissions=True)
|
||||||
|
|||||||
@@ -14,18 +14,31 @@ class LMSBatchMembership(Document):
|
|||||||
self.validate_membership_in_different_batch_same_course()
|
self.validate_membership_in_different_batch_same_course()
|
||||||
|
|
||||||
def validate_membership_in_same_batch(self):
|
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:
|
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))
|
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):
|
def validate_membership_in_different_batch_same_course(self):
|
||||||
course = frappe.db.get_value("LMS Batch", self.batch, "course")
|
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:
|
for membership in previous_membership:
|
||||||
batch_course = frappe.db.get_value("LMS Batch", membership.batch, "course")
|
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"):
|
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))
|
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"):
|
def create_membership(batch, member=None, member_type="Student", role="Member"):
|
||||||
|
|||||||
@@ -41,21 +41,9 @@ class LMSCourse(Document):
|
|||||||
if not email or email == "Guest":
|
if not email or email == "Guest":
|
||||||
return False
|
return False
|
||||||
|
|
||||||
member = self.get_community_member(email)
|
mapping = frappe.get_all("LMS Course Mentor Mapping", {"course": self.name, "mentor": email})
|
||||||
if not member:
|
|
||||||
return False
|
|
||||||
|
|
||||||
mapping = frappe.get_all("LMS Course Mentor Mapping", {"course": self.name, "mentor": member})
|
|
||||||
return mapping != []
|
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):
|
def add_mentor(self, email):
|
||||||
"""Adds a new mentor to the course.
|
"""Adds a new mentor to the course.
|
||||||
"""
|
"""
|
||||||
@@ -68,14 +56,10 @@ class LMSCourse(Document):
|
|||||||
if self.has_mentor(email):
|
if self.has_mentor(email):
|
||||||
return
|
return
|
||||||
|
|
||||||
member = self.get_community_member(email)
|
|
||||||
if not member:
|
|
||||||
return False
|
|
||||||
|
|
||||||
doc = frappe.get_doc({
|
doc = frappe.get_doc({
|
||||||
"doctype": "LMS Course Mentor Mapping",
|
"doctype": "LMS Course Mentor Mapping",
|
||||||
"course": self.name,
|
"course": self.name,
|
||||||
"mentor": member
|
"mentor": email
|
||||||
})
|
})
|
||||||
doc.insert()
|
doc.insert()
|
||||||
|
|
||||||
@@ -96,11 +80,10 @@ class LMSCourse(Document):
|
|||||||
"""
|
"""
|
||||||
if not email:
|
if not email:
|
||||||
return False
|
return False
|
||||||
member = self.get_community_member(email)
|
|
||||||
return frappe.db.exists({
|
return frappe.db.exists({
|
||||||
"doctype": "LMS Course Mentor Mapping",
|
"doctype": "LMS Course Mentor Mapping",
|
||||||
"course": self.name,
|
"course": self.name,
|
||||||
"mentor": member
|
"mentor": email
|
||||||
})
|
})
|
||||||
|
|
||||||
def get_student_batch(self, email):
|
def get_student_batch(self, email):
|
||||||
@@ -110,11 +93,10 @@ class LMSCourse(Document):
|
|||||||
"""
|
"""
|
||||||
if not email:
|
if not email:
|
||||||
return False
|
return False
|
||||||
member = self.get_community_member(email)
|
|
||||||
result = frappe.db.get_all(
|
result = frappe.db.get_all(
|
||||||
"LMS Batch Membership",
|
"LMS Batch Membership",
|
||||||
filters={
|
filters={
|
||||||
"member": member,
|
"member": email,
|
||||||
"member_type": "Student",
|
"member_type": "Student",
|
||||||
},
|
},
|
||||||
fields=['batch']
|
fields=['batch']
|
||||||
@@ -148,10 +130,9 @@ class LMSCourse(Document):
|
|||||||
batches = find_all("LMS Batch", course=self.name)
|
batches = find_all("LMS Batch", course=self.name)
|
||||||
if mentor:
|
if mentor:
|
||||||
# TODO: optimize this
|
# TODO: optimize this
|
||||||
member = self.get_community_member(email=mentor)
|
|
||||||
memberships = frappe.db.get_all(
|
memberships = frappe.db.get_all(
|
||||||
"LMS Batch Membership",
|
"LMS Batch Membership",
|
||||||
{"member": member},
|
{"member": mentor},
|
||||||
["batch"])
|
["batch"])
|
||||||
batch_names = {m.batch for m in memberships}
|
batch_names = {m.batch for m in memberships}
|
||||||
return [b for b in batches if b.name in batch_names]
|
return [b for b in batches if b.name in batch_names]
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ class LMSMentorRequest(Document):
|
|||||||
})
|
})
|
||||||
mapping.save()
|
mapping.save()
|
||||||
|
|
||||||
def send_creation_email(self, member):
|
def send_creation_email(self):
|
||||||
email_template = self.get_email_template('mentor_request_creation')
|
email_template = self.get_email_template('mentor_request_creation')
|
||||||
if not email_template:
|
if not email_template:
|
||||||
return
|
return
|
||||||
@@ -33,7 +33,7 @@ class LMSMentorRequest(Document):
|
|||||||
course_details = frappe.db.get_value("LMS Course", self.course, ["owner", "slug", "title"], as_dict=True)
|
course_details = frappe.db.get_value("LMS Course", self.course, ["owner", "slug", "title"], as_dict=True)
|
||||||
message = frappe.render_template(email_template.response,
|
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_url': '/courses/' + course_details.slug,
|
||||||
'course': course_details.title
|
'course': course_details.title
|
||||||
})
|
})
|
||||||
@@ -59,12 +59,10 @@ class LMSMentorRequest(Document):
|
|||||||
'course': course_details.title
|
'course': course_details.title
|
||||||
})
|
})
|
||||||
|
|
||||||
member_email = frappe.db.get_value("Community Member", self.member, "email")
|
|
||||||
if self.status == 'Approved' or self.status == 'Rejected':
|
if self.status == 'Approved' or self.status == 'Rejected':
|
||||||
reviewed_by = frappe.db.get_value('Community Member', self.reviewed_by, 'email')
|
|
||||||
email_args = {
|
email_args = {
|
||||||
"recipients": member_email,
|
"recipients": self.member,
|
||||||
"cc": [course_details.owner, reviewed_by],
|
"cc": [course_details.owner, self.reviewed_by],
|
||||||
"subject": email_template.subject,
|
"subject": email_template.subject,
|
||||||
"header": email_template.subject,
|
"header": email_template.subject,
|
||||||
"message": message
|
"message": message
|
||||||
@@ -73,7 +71,7 @@ class LMSMentorRequest(Document):
|
|||||||
|
|
||||||
elif self.status == 'Withdrawn':
|
elif self.status == 'Withdrawn':
|
||||||
email_args = {
|
email_args = {
|
||||||
"recipients": [member_email, course_details.owner],
|
"recipients": [self.member, course_details.owner],
|
||||||
"subject": email_template.subject,
|
"subject": email_template.subject,
|
||||||
"header": email_template.subject,
|
"header": email_template.subject,
|
||||||
"message": message
|
"message": message
|
||||||
@@ -89,7 +87,7 @@ class LMSMentorRequest(Document):
|
|||||||
def has_requested(course):
|
def has_requested(course):
|
||||||
return frappe.db.count('LMS Mentor Request',
|
return frappe.db.count('LMS Mentor Request',
|
||||||
filters = {
|
filters = {
|
||||||
'member': get_member().name,
|
'member': frappe.session.user,
|
||||||
'course': course,
|
'course': course,
|
||||||
'status': ['in', ('Pending', 'Approved')]
|
'status': ['in', ('Pending', 'Approved')]
|
||||||
}
|
}
|
||||||
@@ -98,15 +96,14 @@ def has_requested(course):
|
|||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def create_request(course):
|
def create_request(course):
|
||||||
if not has_requested(course):
|
if not has_requested(course):
|
||||||
member = get_member()
|
|
||||||
request = frappe.get_doc({
|
request = frappe.get_doc({
|
||||||
'doctype': 'LMS Mentor Request',
|
'doctype': 'LMS Mentor Request',
|
||||||
'member': member.name,
|
'member': frappe.session.user,
|
||||||
'course': course,
|
'course': course,
|
||||||
'status': 'Pending'
|
'status': 'Pending'
|
||||||
})
|
})
|
||||||
request.save(ignore_permissions=True)
|
request.save(ignore_permissions=True)
|
||||||
request.send_creation_email(member)
|
request.send_creation_email()
|
||||||
return 'OK'
|
return 'OK'
|
||||||
|
|
||||||
else:
|
else:
|
||||||
@@ -114,13 +111,13 @@ def create_request(course):
|
|||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def cancel_request(course):
|
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.status = 'Withdrawn'
|
||||||
request.save(ignore_permissions=True)
|
request.save(ignore_permissions=True)
|
||||||
return 'OK'
|
return 'OK'
|
||||||
|
|
||||||
def get_member():
|
|
||||||
try:
|
|
||||||
return frappe.get_doc('Community Member', {'email': frappe.session.user})
|
|
||||||
except frappe.DoesNotExistError:
|
|
||||||
return
|
|
||||||
|
|||||||
@@ -7,17 +7,17 @@ import frappe
|
|||||||
from frappe.model.document import Document
|
from frappe.model.document import Document
|
||||||
from frappe import _
|
from frappe import _
|
||||||
from frappe.utils import add_days, nowdate
|
from frappe.utils import add_days, nowdate
|
||||||
from community.www.courses.utils import get_batch_members
|
|
||||||
|
|
||||||
class LMSMessage(Document):
|
class LMSMessage(Document):
|
||||||
""" def after_insert(self):
|
""" def after_insert(self):
|
||||||
|
Todo: Adding email preference field for users
|
||||||
self.send_email() """
|
self.send_email() """
|
||||||
|
|
||||||
def send_email(self):
|
def send_email(self):
|
||||||
membership = frappe.get_all("LMS Batch Membership", {"batch": self.batch}, ["member"])
|
membership = frappe.get_all("LMS Batch Membership", {"batch": self.batch}, ["member"])
|
||||||
for entry in membership:
|
for entry in membership:
|
||||||
member = frappe.get_doc("Community Member", entry.member)
|
member = frappe.get_doc("User", entry.member)
|
||||||
if member.name != self.author and member.email_preference == "Email on every Message":
|
if member.name != self.author:
|
||||||
frappe.sendmail(
|
frappe.sendmail(
|
||||||
recipients = member.email,
|
recipients = member.email,
|
||||||
subject = _("New Message on ") + self.batch,
|
subject = _("New Message on ") + self.batch,
|
||||||
@@ -30,14 +30,16 @@ class LMSMessage(Document):
|
|||||||
"course": frappe.db.get_value("LMS Batch", self.batch, ["course"])
|
"course": frappe.db.get_value("LMS Batch", self.batch, ["course"])
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
def send_daily_digest():
|
def send_daily_digest():
|
||||||
|
#Todo: Optimize this
|
||||||
emails = frappe._dict()
|
emails = frappe._dict()
|
||||||
messages = frappe.get_all("LMS Message", {"creation": [">=", add_days(nowdate(), -1)]}, ["message", "batch", "author", "creation"])
|
messages = frappe.get_all("LMS Message", {"creation": [">=", add_days(nowdate(), -1)]}, ["message", "batch", "author", "creation"])
|
||||||
for message in messages:
|
for message in messages:
|
||||||
membership = frappe.get_all("LMS Batch Membership", {"batch": message.batch}, ["member"])
|
membership = frappe.get_all("LMS Batch Membership", {"batch": message.batch}, ["member"])
|
||||||
for entry in membership:
|
for entry in membership:
|
||||||
member = frappe.db.get_value("Community Member", entry.member, ["name", "email_preference", "email"], as_dict=1)
|
member = frappe.db.get_value("User", entry.member, ["name", "email"], as_dict=1)
|
||||||
if member.name != message.author and member.email_preference == "One Digest Mail per day":
|
if member.name != message.author:
|
||||||
if member.name in emails.keys():
|
if member.name in emails.keys():
|
||||||
emails[member.name]["messages"].append(message)
|
emails[member.name]["messages"].append(message)
|
||||||
else:
|
else:
|
||||||
@@ -53,7 +55,7 @@ def send_daily_digest():
|
|||||||
else:
|
else:
|
||||||
group_by_batch[message.batch] = [message]
|
group_by_batch[message.batch] = [message]
|
||||||
frappe.sendmail(
|
frappe.sendmail(
|
||||||
recipients = frappe.db.get_value("Community Member", email, "email"),
|
recipients = frappe.db.get_value("User", email, "email"),
|
||||||
subject = _("Message Digest"),
|
subject = _("Message Digest"),
|
||||||
header = _("Message Digest"),
|
header = _("Message Digest"),
|
||||||
template = "lms_daily_digest",
|
template = "lms_daily_digest",
|
||||||
@@ -64,12 +66,12 @@ def send_daily_digest():
|
|||||||
)
|
)
|
||||||
|
|
||||||
def publish_message(doc, method):
|
def publish_message(doc, method):
|
||||||
email = frappe.db.get_value("Community Member", doc.author, "email")
|
|
||||||
template = get_message_template()
|
template = get_message_template()
|
||||||
message = frappe._dict()
|
message = frappe._dict({
|
||||||
message.author_name = doc.author_name
|
"author_name": doc.author_name,
|
||||||
message.message_time = frappe.utils.pretty_date(doc.creation)
|
"message_time": frappe.utils.pretty_date(doc.creation),
|
||||||
message.message = frappe.utils.md_to_html(doc.message)
|
"message": frappe.utils.md_to_html(doc.message)
|
||||||
|
})
|
||||||
|
|
||||||
js = """
|
js = """
|
||||||
$(".msger-input").val("");
|
$(".msger-input").val("");
|
||||||
@@ -82,7 +84,7 @@ def publish_message(doc, method):
|
|||||||
"message": message
|
"message": message
|
||||||
}})
|
}})
|
||||||
$(".message-section").append(template);
|
$(".message-section").append(template);
|
||||||
""".format(template, message, email)
|
""".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)
|
||||||
|
|
||||||
|
|||||||
@@ -4,3 +4,5 @@ community.patches.save_abbr_for_community_members
|
|||||||
community.patches.create_mentor_request_email_templates
|
community.patches.create_mentor_request_email_templates
|
||||||
community.patches.replace_member_with_user_in_batch_membership
|
community.patches.replace_member_with_user_in_batch_membership
|
||||||
community.patches.replace_member_with_user_in_course_mentor_mapping
|
community.patches.replace_member_with_user_in_course_mentor_mapping
|
||||||
|
community.patches.replace_member_with_user_in_lms_message
|
||||||
|
community.patches.replace_member_with_user_in_mentor_request
|
||||||
|
|||||||
10
community/patches/replace_member_with_user_in_lms_message.py
Normal file
10
community/patches/replace_member_with_user_in_lms_message.py
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
from __future__ import unicode_literals
|
||||||
|
import frappe
|
||||||
|
|
||||||
|
def execute():
|
||||||
|
frappe.reload_doc("lms", "doctype", "lms_message")
|
||||||
|
messages = frappe.get_all("LMS Message", ["author", "name"])
|
||||||
|
for message in messages:
|
||||||
|
user = frappe.db.get_value("Community Member", message.author, ["email", "full_name"], as_dict=True)
|
||||||
|
frappe.db.set_value("LMS Message", message.name, "author", user.email)
|
||||||
|
frappe.db.set_value("LMS Message", message.name, "author_name", user.full_name)
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
from __future__ import unicode_literals
|
||||||
|
import frappe
|
||||||
|
|
||||||
|
def execute():
|
||||||
|
frappe.reload_doc("lms", "doctype", "lms_mentor_request")
|
||||||
|
requests = frappe.get_all("LMS Mentor Request", ["member", "name"])
|
||||||
|
for request in requests:
|
||||||
|
user = frappe.db.get_value("Community Member", request.member, ["email", "full_name"], as_dict=True)
|
||||||
|
frappe.db.set_value("LMS Mentor Request", request.name, "member", user.email)
|
||||||
|
frappe.db.set_value("LMS Mentor Request", request.name, "member_name", user.full_name)
|
||||||
@@ -163,7 +163,7 @@ img.profile-photo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.msger-inputarea {
|
.msger-inputarea {
|
||||||
position: absolute;
|
position: fixed;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -225,3 +225,8 @@ img.profile-photo {
|
|||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
line-height: 51px;
|
line-height: 51px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.anchor_style {
|
||||||
|
text-decoration: none;
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
|||||||
13
community/templates/message.html
Normal file
13
community/templates/message.html
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<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>
|
||||||
@@ -1,9 +1,6 @@
|
|||||||
import frappe
|
import frappe
|
||||||
from . import utils
|
from . import utils
|
||||||
from community.lms.doctype.lms_batch.lms_batch import get_messages
|
|
||||||
|
|
||||||
def get_context(context):
|
def get_context(context):
|
||||||
utils.get_common_context(context)
|
utils.get_common_context(context)
|
||||||
|
context.messages = context.batch.get_messages()
|
||||||
context.members = utils.get_batch_members(context.batch.name)
|
|
||||||
context.member_count = len(context.members)
|
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
{% extends "templates/base.html" %}
|
{% extends "templates/base.html" %}
|
||||||
{% from "www/macros/sidebar.html" import Sidebar %}
|
{% from "www/macros/sidebar.html" import Sidebar %}
|
||||||
{% from "www/macros/profile.html" import Profile %}
|
|
||||||
{% from "www/macros/common_macro.html" import BatchHearder %}
|
{% from "www/macros/common_macro.html" import BatchHearder %}
|
||||||
|
|
||||||
{% block title %}Members{% endblock %}
|
{% block title %}Members{% endblock %}
|
||||||
@@ -25,12 +24,12 @@
|
|||||||
{% for member in members %}
|
{% for member in members %}
|
||||||
<div class="d-flex align-items-center">
|
<div class="d-flex align-items-center">
|
||||||
<div>
|
<div>
|
||||||
{{ widgets.Avatar(member=member, avatar_class="avatar-medium") }} <a href="/{{member.username}}">{{ member.full_name }}</a>
|
{{ widgets.Avatar(member=member, avatar_class="avatar-medium") }}
|
||||||
</div>
|
</div>
|
||||||
<div class="mr-5">
|
<div class="ml-5 mr-5">
|
||||||
{{member.full_name}}
|
<a href="/{{member.username}}">{{ member.full_name }}</a>
|
||||||
</div>
|
</div>
|
||||||
{% if member.is_mentor %}
|
{% if course.is_mentor(member.name) %}
|
||||||
<div class="badge badge-success">Mentor</div>
|
<div class="badge badge-success">Mentor</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -3,6 +3,3 @@ from . import utils
|
|||||||
|
|
||||||
def get_context(context):
|
def get_context(context):
|
||||||
utils.get_common_context(context)
|
utils.get_common_context(context)
|
||||||
|
|
||||||
context.members = utils.get_batch_members(context.batch.name)
|
|
||||||
context.member_count = len(context.members)
|
|
||||||
|
|||||||
@@ -19,25 +19,10 @@ def get_common_context(context):
|
|||||||
|
|
||||||
context.course = course
|
context.course = course
|
||||||
context.batch = batch
|
context.batch = batch
|
||||||
|
context.members = batch.get_mentors() + batch.get_students()
|
||||||
|
context.member_count = len(context.members)
|
||||||
context.livecode_url = get_livecode_url()
|
context.livecode_url = get_livecode_url()
|
||||||
|
|
||||||
def get_livecode_url():
|
def get_livecode_url():
|
||||||
return frappe.db.get_single_value("LMS Settings", "livecode_url")
|
return frappe.db.get_single_value("LMS Settings", "livecode_url")
|
||||||
|
|
||||||
def get_batch_members(batch_name):
|
|
||||||
members = []
|
|
||||||
memberships = frappe.get_all("LMS Batch Membership", {"batch": batch_name}, ["member", "member_type"])
|
|
||||||
|
|
||||||
for membership in memberships:
|
|
||||||
member = get_member_with_name(membership.member)
|
|
||||||
if membership.member_type == "Mentor":
|
|
||||||
member.is_mentor = True
|
|
||||||
members.append(member)
|
|
||||||
return members
|
|
||||||
|
|
||||||
def get_member_with_name(name):
|
|
||||||
try:
|
|
||||||
return frappe.get_doc("Community Member", name)
|
|
||||||
except frappe.DoesNotExistError:
|
|
||||||
return
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,49 +0,0 @@
|
|||||||
import frappe
|
|
||||||
|
|
||||||
def get_member_with_email():
|
|
||||||
try:
|
|
||||||
return frappe.db.get_value("Community Member", {"email": frappe.session.user}, "name")
|
|
||||||
except frappe.DoesNotExistError:
|
|
||||||
return
|
|
||||||
|
|
||||||
def get_member_with_name(name):
|
|
||||||
try:
|
|
||||||
return frappe.get_doc("Community Member", name)
|
|
||||||
except frappe.DoesNotExistError:
|
|
||||||
return
|
|
||||||
|
|
||||||
def get_batch(code):
|
|
||||||
try:
|
|
||||||
print("get_batch", code)
|
|
||||||
return frappe.db.get_value("LMS Batch", {"name": code}, ["name", "description"], as_dict=True)
|
|
||||||
except frappe.DoesNotExistError:
|
|
||||||
print("Error: notfound")
|
|
||||||
return
|
|
||||||
|
|
||||||
def is_member_of_batch(batch_code):
|
|
||||||
membership = frappe.get_all("LMS Batch Membership", {"batch": batch_code, "member": get_member_with_email()})
|
|
||||||
if len(membership):
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
def redirect_if_not_a_member(course,batch_code):
|
|
||||||
if not is_member_of_batch(batch_code):
|
|
||||||
frappe.local.flags.redirect_location = "/courses/" + course
|
|
||||||
raise frappe.Redirect
|
|
||||||
|
|
||||||
def get_course(name):
|
|
||||||
try:
|
|
||||||
return frappe.get_doc("LMS Course", {"name": name})
|
|
||||||
except frappe.DoesNotExistError:
|
|
||||||
return
|
|
||||||
|
|
||||||
def get_batch_members(batch):
|
|
||||||
members = []
|
|
||||||
memberships = frappe.get_all("LMS Batch Membership", {"batch": batch}, ["member", "member_type"])
|
|
||||||
|
|
||||||
for membership in memberships:
|
|
||||||
member = get_member_with_name(membership.member)
|
|
||||||
if membership.member_type == "Mentor":
|
|
||||||
member.is_mentor = True
|
|
||||||
members.append(member)
|
|
||||||
return members
|
|
||||||
|
|||||||
@@ -90,12 +90,12 @@
|
|||||||
{% block content %}
|
{% block content %}
|
||||||
<section>
|
<section>
|
||||||
<div class="dashboard__parent">
|
<div class="dashboard__parent">
|
||||||
<div>
|
<div class="mr-5">
|
||||||
{{ widgets.Avatar(member=member, avatar_class="avatar-medium") }} <a href="/{{member.username}}">{{ member.full_name }}</a>
|
{{ widgets.Avatar(member=member, avatar_class="avatar-xl") }}
|
||||||
</div>
|
</div>
|
||||||
<div class="dashboard__details">
|
<div class="dashboard__details">
|
||||||
<div class="dashboard__name">
|
<div class="dashboard__name">
|
||||||
{{member.full_name}}
|
<a class="anchor_style" href="/{{member.username}}">{{ member.full_name }}</a>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<ul class="nav nav-tabs mt-4" id="myTab" role="tablist">
|
<ul class="nav nav-tabs mt-4" id="myTab" role="tablist">
|
||||||
@@ -120,20 +120,18 @@
|
|||||||
{% if activity %}
|
{% if activity %}
|
||||||
{% for message in activity %}
|
{% for message in activity %}
|
||||||
<div class="dashboard__message border m-5 p-3">
|
<div class="dashboard__message border m-5 p-3">
|
||||||
|
<a class="anchor_style bold" href="/{{message.member.username}}">{{ message.member.full_name }}</a>
|
||||||
<div class="text-muted float-right">
|
<div class="text-muted float-right">
|
||||||
{{ message.course }} ({{message.batch}})
|
{{ message.course }} ({{message.batch}})
|
||||||
</div>
|
</div>
|
||||||
<div class="d-flex align-items-center w-100">
|
<div class="d-flex align-items-center w-100">
|
||||||
<div>
|
<div>
|
||||||
{{ widgets.Avatar(member=member, avatar_class="avatar-medium") }} <a href="/{{member.username}}">{{ member.full_name }}</a>
|
{{ widgets.Avatar(member=message.member, avatar_class="avatar-medium") }}
|
||||||
</div>
|
</div>
|
||||||
<div class="ml-5 mt-5">{{ frappe.utils.md_to_html(message.message) }}</div>
|
<div class="ml-5 mt-5">{{ frappe.utils.md_to_html(message.message) }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="d-flex justify-content-between">
|
<div class="d-flex">
|
||||||
<div class="">
|
<div class="text-muted float-right">
|
||||||
{{message.full_name}}
|
|
||||||
</div>
|
|
||||||
<div class="text-muted">
|
|
||||||
{{ frappe.utils.pretty_date(message.creation) }}
|
{{ frappe.utils.pretty_date(message.creation) }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -8,13 +8,13 @@ def get_context(context):
|
|||||||
frappe.local.flags.redirect_location = "/login"
|
frappe.local.flags.redirect_location = "/login"
|
||||||
raise frappe.Redirect
|
raise frappe.Redirect
|
||||||
context.member = frappe.get_doc("User", frappe.session.user)
|
context.member = frappe.get_doc("User", frappe.session.user)
|
||||||
context.memberships = get_memberships(context.member.name)
|
context.memberships = get_memberships()
|
||||||
context.courses = get_courses(context.memberships)
|
context.courses = get_courses(context.memberships)
|
||||||
context.activity = get_activity(context.memberships)
|
context.activity = get_activity(context.memberships)
|
||||||
context.sketches = list(filter(lambda x: x.owner == frappe.session.user, Sketch.get_recent_sketches(owner=context.member.email)))
|
context.sketches = list(filter(lambda x: x.owner == frappe.session.user, Sketch.get_recent_sketches(owner=context.member.email)))
|
||||||
|
|
||||||
def get_memberships(member):
|
def get_memberships():
|
||||||
return frappe.get_all("LMS Batch Membership", {"member": member}, ["batch", "member_type", "creation"])
|
return frappe.get_all("LMS Batch Membership", {"member": frappe.session.user}, ["batch", "member_type", "creation"])
|
||||||
|
|
||||||
def get_courses(memberships):
|
def get_courses(memberships):
|
||||||
courses = []
|
courses = []
|
||||||
@@ -38,4 +38,5 @@ def get_activity(memberships):
|
|||||||
messages = frappe.get_all("LMS Message", {"batch": ["in", ",".join(batches)]}, ["message", "author", "creation", "batch"], order_by='creation desc')
|
messages = frappe.get_all("LMS Message", {"batch": ["in", ",".join(batches)]}, ["message", "author", "creation", "batch"], order_by='creation desc')
|
||||||
for message in messages:
|
for message in messages:
|
||||||
message.course = courses[message.batch]
|
message.course = courses[message.batch]
|
||||||
|
message.member = frappe.get_doc("User", message.author)
|
||||||
return messages
|
return messages
|
||||||
|
|||||||
10
community/www/macros/profile.html
Normal file
10
community/www/macros/profile.html
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{% macro Profile(photo, full_name, abbr, icon) %}
|
||||||
|
{% if photo %}
|
||||||
|
<img class="avatar rounded-circle img-fluid mr-5{% if icon == 'large' %} dashboard__profile {% else %} dashboard__profileSmall {% endif %}"
|
||||||
|
src="{{ photo }}" alt="{{ full_name }}">
|
||||||
|
{% else %}
|
||||||
|
<div class="standard-image mr-5 {% if icon == 'large' %} dashboard__abbr {% else %} dashboard__abbrSmall {% endif %}">
|
||||||
|
{{ abbr }}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% endmacro %}
|
||||||
@@ -14,34 +14,6 @@
|
|||||||
height: 200px;
|
height: 200px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dashboard__profile {
|
|
||||||
width: 150px;
|
|
||||||
height: 155px;
|
|
||||||
border-radius: 50%;
|
|
||||||
object-fit: contain;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dashboard__profileSmall {
|
|
||||||
width: 59px;
|
|
||||||
height: 57px;
|
|
||||||
border-radius: 50%;
|
|
||||||
object-fit: contain;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dashboard__abbr {
|
|
||||||
font-size: 50px;
|
|
||||||
width: 155px;
|
|
||||||
height: 155px;
|
|
||||||
border-radius: 50%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dashboard__abbrSmall {
|
|
||||||
font-size: 20px;
|
|
||||||
width: 59px;
|
|
||||||
height: 57px;
|
|
||||||
border-radius: 50%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dashboard__parent {
|
.dashboard__parent {
|
||||||
display: flex;
|
display: flex;
|
||||||
}
|
}
|
||||||
@@ -88,23 +60,22 @@
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
{% block page_content %}
|
{% block page_content %}
|
||||||
<div class="dashboard__parent">
|
<div class="dashboard__parent">
|
||||||
<div class="dashboard__photo">
|
<div class="dashboard__photo mr-5">
|
||||||
{{ widgets.Avatar(member=member, avatar_class="avatar-medium") }} <a href="/{{member.username}}">{{ member.full_name }}</a>
|
{{ widgets.Avatar(member=member, avatar_class="avatar-xl") }}
|
||||||
</div>
|
</div>
|
||||||
<div class="dashboard__details">
|
<div class="dashboard__details">
|
||||||
<div class="dashboard__name">
|
<div class="dashboard__name">
|
||||||
{{member.full_name}}
|
<a class="anchor_style" href="/{{member.username}}">{{ member.full_name }}</a>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<ul class="nav nav-tabs mt-4" id="myTab" role="tablist">
|
<ul class="nav nav-tabs mt-4" id="myTab" role="tablist">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link active" id="home-tab" data-toggle="tab" href="#home" role="tab"
|
<a class="nav-link active" id="home-tab" data-toggle="tab" href="#home" role="tab" aria-controls="home"
|
||||||
aria-controls="home" aria-selected="true">Sketches</a>
|
aria-selected="true">Sketches</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
@@ -127,7 +98,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
<!-- this is a sample default web page template -->
|
<!-- this is a sample default web page template -->
|
||||||
|
|||||||
@@ -3,15 +3,9 @@ from community.lms.models import Sketch
|
|||||||
|
|
||||||
def get_context(context):
|
def get_context(context):
|
||||||
context.no_cache = 1
|
context.no_cache = 1
|
||||||
context.username = frappe.form_dict["username"]
|
try:
|
||||||
context.member = get_member(context.username)
|
context.member = frappe.get_doc("User", {"username": frappe.form_dict["username"]})
|
||||||
if not context.member:
|
except:
|
||||||
context.template = "www/404.html"
|
context.template = "www/404.html"
|
||||||
else:
|
else:
|
||||||
context.sketches = Sketch.get_recent_sketches(owner=context.member.email)
|
context.sketches = Sketch.get_recent_sketches(owner=context.member.email)
|
||||||
|
|
||||||
def get_member(username):
|
|
||||||
try:
|
|
||||||
return frappe.get_doc("Community Member", {"username":username})
|
|
||||||
except frappe.DoesNotExistError:
|
|
||||||
return
|
|
||||||
|
|||||||
Reference in New Issue
Block a user