From e991dc5c730e4a215a9aa915f66ff53bb2072fa7 Mon Sep 17 00:00:00 2001 From: pateljannat Date: Fri, 21 May 2021 13:27:15 +0530 Subject: [PATCH 1/5] refactor: removed community member doctype --- .../community_event_volunteer.json | 4 +- .../doctype/community_member/__init__.py | 0 .../community_member/community_member.js | 8 - .../community_member/community_member.json | 155 ------------------ .../community_member/community_member.py | 104 ------------ .../templates/community_member.html | 25 --- .../templates/community_member_row.html | 4 - .../community_member/test_community_member.py | 92 ----------- community/community/utils.py | 15 -- .../web_form/update_profile/__init__.py | 0 .../web_form/update_profile/update_profile.js | 5 - .../update_profile/update_profile.json | 100 ----------- .../web_form/update_profile/update_profile.py | 7 - community/community/widgets/Avatar.html | 4 +- .../community_hackathon.json | 4 +- community/hooks.py | 6 +- community/lms/doctype/lms_batch/lms_batch.py | 2 +- .../lms_batch_membership.json | 4 +- .../lms/doctype/lms_course/lms_course.py | 5 +- .../lms_course_mentor_mapping.json | 4 +- .../lms_mentor_request.json | 6 +- .../lms/doctype/lms_message/lms_message.json | 4 +- community/overrides/user.py | 33 ++++ community/patches.txt | 1 + ...ce_member_with_user_in_batch_membership.py | 10 ++ community/www/courses/course.py | 2 - community/www/courses/utils.py | 10 -- 27 files changed, 65 insertions(+), 549 deletions(-) delete mode 100644 community/community/doctype/community_member/__init__.py delete mode 100644 community/community/doctype/community_member/community_member.js delete mode 100644 community/community/doctype/community_member/community_member.json delete mode 100644 community/community/doctype/community_member/community_member.py delete mode 100644 community/community/doctype/community_member/templates/community_member.html delete mode 100644 community/community/doctype/community_member/templates/community_member_row.html delete mode 100644 community/community/doctype/community_member/test_community_member.py delete mode 100644 community/community/web_form/update_profile/__init__.py delete mode 100644 community/community/web_form/update_profile/update_profile.js delete mode 100644 community/community/web_form/update_profile/update_profile.json delete mode 100644 community/community/web_form/update_profile/update_profile.py create mode 100644 community/overrides/user.py create mode 100644 community/patches/replace_member_with_user_in_batch_membership.py diff --git a/community/community/doctype/community_event_volunteer/community_event_volunteer.json b/community/community/doctype/community_event_volunteer/community_event_volunteer.json index ff60d161..8c6f2d3d 100644 --- a/community/community/doctype/community_event_volunteer/community_event_volunteer.json +++ b/community/community/doctype/community_event_volunteer/community_event_volunteer.json @@ -13,13 +13,13 @@ "fieldtype": "Link", "in_list_view": 1, "label": "Member", - "options": "Community Member" + "options": "User" } ], "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2021-02-15 12:03:31.153575", + "modified": "2021-05-21 12:15:51.286478", "modified_by": "Administrator", "module": "Community", "name": "Community Event Volunteer", diff --git a/community/community/doctype/community_member/__init__.py b/community/community/doctype/community_member/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/community/community/doctype/community_member/community_member.js b/community/community/doctype/community_member/community_member.js deleted file mode 100644 index e22285e5..00000000 --- a/community/community/doctype/community_member/community_member.js +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) 2021, Frappe and contributors -// For license information, please see license.txt - -frappe.ui.form.on('Community Member', { - // refresh: function(frm) { - - // } -}); diff --git a/community/community/doctype/community_member/community_member.json b/community/community/doctype/community_member/community_member.json deleted file mode 100644 index 5047e257..00000000 --- a/community/community/doctype/community_member/community_member.json +++ /dev/null @@ -1,155 +0,0 @@ -{ - "actions": [], - "allow_guest_to_view": 1, - "allow_rename": 1, - "creation": "2021-02-12 15:47:23.591567", - "doctype": "DocType", - "editable_grid": 1, - "engine": "InnoDB", - "field_order": [ - "full_name", - "email", - "enabled", - "column_break_4", - "username", - "email_preference", - "section_break_7", - "bio", - "section_break_9", - "role", - "photo", - "column_break_12", - "short_intro", - "route", - "abbr" - ], - "fields": [ - { - "default": "1", - "fieldname": "enabled", - "fieldtype": "Check", - "label": "Enabled" - }, - { - "fieldname": "full_name", - "fieldtype": "Data", - "in_list_view": 1, - "in_standard_filter": 1, - "label": "Full Name", - "reqd": 1 - }, - { - "allow_in_quick_entry": 1, - "fieldname": "role", - "fieldtype": "Select", - "label": "Role", - "options": "\nBoard\nDirector\nVolunteer\nSpeaker" - }, - { - "allow_in_quick_entry": 1, - "fieldname": "photo", - "fieldtype": "Attach Image", - "label": "Photo" - }, - { - "fieldname": "short_intro", - "fieldtype": "Data", - "label": "Short Intro" - }, - { - "allow_in_quick_entry": 1, - "fieldname": "bio", - "fieldtype": "Markdown Editor", - "label": "Bio" - }, - { - "fieldname": "route", - "fieldtype": "Data", - "label": "Route" - }, - { - "fieldname": "email", - "fieldtype": "Data", - "in_standard_filter": 1, - "label": "Email", - "options": "Email", - "reqd": 1, - "unique": 1 - }, - { - "allow_in_quick_entry": 1, - "fieldname": "username", - "fieldtype": "Data", - "in_list_view": 1, - "label": "User Name", - "unique": 1 - }, - { - "fieldname": "email_preference", - "fieldtype": "Select", - "label": "Email preference", - "options": "Email on every Message\nOne Digest Mail per day\nNever" - }, - { - "fieldname": "column_break_4", - "fieldtype": "Column Break" - }, - { - "fieldname": "section_break_7", - "fieldtype": "Section Break" - }, - { - "fieldname": "section_break_9", - "fieldtype": "Section Break" - }, - { - "fieldname": "column_break_12", - "fieldtype": "Column Break" - }, - { - "fieldname": "abbr", - "fieldtype": "Data", - "label": "Abbr", - "read_only": 1 - } - ], - "index_web_pages_for_search": 1, - "links": [], - "modified": "2021-04-28 11:22:35.402217", - "modified_by": "Administrator", - "module": "Community", - "name": "Community Member", - "owner": "Administrator", - "permissions": [ - { - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "print": 1, - "read": 1, - "report": 1, - "role": "System Manager", - "share": 1, - "write": 1 - }, - { - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "print": 1, - "read": 1, - "report": 1, - "role": "Website Manager", - "share": 1, - "write": 1 - } - ], - "quick_entry": 1, - "search_fields": "full_name", - "sort_field": "modified", - "sort_order": "DESC", - "title_field": "full_name", - "track_changes": 1 -} \ No newline at end of file diff --git a/community/community/doctype/community_member/community_member.py b/community/community/doctype/community_member/community_member.py deleted file mode 100644 index 0c1ecdb3..00000000 --- a/community/community/doctype/community_member/community_member.py +++ /dev/null @@ -1,104 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2021, Frappe and contributors -# For license information, please see license.txt - -from __future__ import unicode_literals -import frappe -import re -from frappe import _ -from frappe.model.document import Document -import random -from frappe.utils import cint -import hashlib - -class CommunityMember(Document): - - def validate(self): - self.validate_username() - self.abbr = ("").join([ s[0] for s in self.full_name.split() ]) - if self.route != self.username: - self.route = self.username - - def validate_username(self): - if not self.username: - self.username = create_username_from_email(self.email) - - if self.username: - if len(self.username) < 4: - frappe.throw(_("Username must be atleast 4 characters long.")) - if not re.match("^[A-Za-z0-9_]*$", self.username): - frappe.throw(_("Username can only contain alphabets, numbers and underscore.")) - self.username = self.username.lower() - - def get_course_count(self) -> int: - """Returns the number of courses authored by this user. - """ - return frappe.db.count( - 'LMS Course', { - 'owner': self.email - }) - - def get_batch_count(self) -> int: - """Returns the number of batches authored by this user. - """ - return frappe.db.count( - 'LMS Batch Membership', { - 'member': self.name, - 'member_type': 'Mentor' - }) - - def get_photo_url(self): - return frappe.db.get_value("User", self.email, ["user_image"]) - - def get_palette(self): - palette = [ - ['--orange-avatar-bg', '--orange-avatar-color'], - ['--pink-avatar-bg', '--pink-avatar-color'], - ['--blue-avatar-bg', '--blue-avatar-color'], - ['--green-avatar-bg', '--green-avatar-color'], - ['--dark-green-avatar-bg', '--dark-green-avatar-color'], - ['--red-avatar-bg', '--red-avatar-color'], - ['--yellow-avatar-bg', '--yellow-avatar-color'], - ['--purple-avatar-bg', '--purple-avatar-color'], - ['--gray-avatar-bg', '--gray-avatar-color0'] - ] - - encoded_name = str(self.full_name).encode("utf-8") - hash_name = hashlib.md5(encoded_name).hexdigest() - idx = cint((int(hash_name[4:6], 16) + 1) / 5.33) - return palette[idx % 8] - - def __repr__(self): - return f"" - -def create_member_from_user(doc, method): - username = doc.username - - if ( doc.username and username_exists(doc.username)) or not doc.username: - username = create_username_from_email(doc.email) - - elif len(doc.username) < 4 and doc.send_welcome_email == 1: - username = adjust_username(doc.username) - - if username_exists(username): - username = username + str(random.randint(0,9)) - - member = frappe.get_doc({ - "doctype": "Community Member", - "full_name": doc.full_name, - "username": username, - "email": doc.email, - "route": doc.username, - "owner": doc.email - }) - member.save(ignore_permissions=True) - -def username_exists(username): - return frappe.db.exists("Community Member", dict(username=username)) - -def create_username_from_email(email): - string = email.split("@")[0] - return ''.join(e for e in string if e.isalnum()) - -def adjust_username(username): - return username.ljust(4, str(random.randint(0,9))) diff --git a/community/community/doctype/community_member/templates/community_member.html b/community/community/doctype/community_member/templates/community_member.html deleted file mode 100644 index fabec4d2..00000000 --- a/community/community/doctype/community_member/templates/community_member.html +++ /dev/null @@ -1,25 +0,0 @@ -{% extends "templates/web.html" %} -{% block page_content %} -
- {% if photo %} -
- {{ full_name }} -
- {% else %} -
-
{{ abbr }}
-
- {% endif %} -
-

{{ full_name }}

- {% if short_intro %} -

{{ short_intro }}

- {% endif %} - {% if bio %} -

{{ frappe.utils.md_to_html(bio) }}

- {% endif %} -
-
-{% endblock %} - - \ No newline at end of file diff --git a/community/community/doctype/community_member/templates/community_member_row.html b/community/community/doctype/community_member/templates/community_member_row.html deleted file mode 100644 index d7014b45..00000000 --- a/community/community/doctype/community_member/templates/community_member_row.html +++ /dev/null @@ -1,4 +0,0 @@ -
- {{ doc.title or doc.name }} -
- diff --git a/community/community/doctype/community_member/test_community_member.py b/community/community/doctype/community_member/test_community_member.py deleted file mode 100644 index 4cde095c..00000000 --- a/community/community/doctype/community_member/test_community_member.py +++ /dev/null @@ -1,92 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2021, Frappe and Contributors -# See license.txt -from __future__ import unicode_literals -from community.lms.doctype.lms_course.test_lms_course import new_user -import frappe -import unittest - -class TestCommunityMember(unittest.TestCase): - - @classmethod - def setUpClass(self): - users = ["test_user@example.com","test_user1@example.com"] - - for user in users: - if not frappe.db.exists("User", user): - new_user("Test User", user) - - def test_member_created_from_user(self): - user = frappe.db.get_value("User","test_user@example.com", ["full_name", "email", "username"], as_dict=True) - self.assertTrue(frappe.db.exists("Community Member", {"username":user.username})) - - member = frappe.db.get_value("Community Member", - filters={"email": user.email}, - fieldname=["full_name", "email", "owner", "username", "route"], - as_dict=True - ) - - self.assertEqual(user.full_name, member.full_name) - self.assertEqual(member.owner, user.email) - self.assertEqual(user.username, member.username) - self.assertEqual(member.username, member.route) - - def test_members_with_same_name(self): - user1 = frappe.db.get_value("User","test_user@example.com", ["email"], as_dict=True) - user2 = frappe.get_doc("User","test_user1@example.com", ["email"], as_dict=True) - - self.assertTrue(frappe.db.exists("Community Member", {"email": user1.email} )) - self.assertTrue(frappe.db.exists("Community Member", {"email": user2.email })) - - member1 = frappe.db.get_value("Community Member", - filters={"email": user1.email}, - fieldname=["full_name", "email", "owner", "username", "route"], - as_dict=True - ) - member2 = frappe.db.get_value("Community Member", - filters={"email": user2.email}, - fieldname=["full_name", "email", "owner", "username", "route"], - as_dict=True - ) - - self.assertEqual(member1.full_name, member2.full_name) - self.assertEqual(member1.email, user1.email) - self.assertEqual(member2.email, user2.email) - self.assertNotEqual(member1.username, member2.username) - - def test_username_validations(self): - user = new_user("Tst", "tst@example.com") - self.assertTrue(frappe.db.exists("Community Member", {"email":user.email} )) - - member = frappe.db.get_value("Community Member", - filters={"email": user.email}, - fieldname=["username"], - as_dict=True - ) - - self.assertEqual(len(member.username), 4) - frappe.delete_doc("User", user.email) - - def test_user_without_username(self): - user = new_user("Test User", "test_user2@example.com") - self.assertTrue(frappe.db.exists("Community Member", {"email":user.email} )) - - member = frappe.db.get_value("Community Member", - filters={"email": user.email}, - fieldname=["username"], - as_dict=True - ) - - self.assertTrue(member.username) - frappe.delete_doc("User", user.email) - - @classmethod - def tearDownClass(self): - users = ["test_user@example.com","test_user1@example.com"] - - for user in users: - if frappe.db.exists("User", user): - frappe.delete_doc("User", user) - - if frappe.db.exists("Community Member", {"email": user}): - frappe.delete_doc("Community Member", {"email": user}) \ No newline at end of file diff --git a/community/community/utils.py b/community/community/utils.py index ccc3ad48..cf189e48 100644 --- a/community/community/utils.py +++ b/community/community/utils.py @@ -1,16 +1 @@ import frappe - -def create_members_from_users(): - users = frappe.get_all("User", {"enabled": 1}, ["email"]) - for user in users: - if not frappe.db.get_value("Community Member", {"email": user.email}, "name"): - doc = frappe.get_doc("User", {"email": user.email}) - username = doc.username if doc.username and len(doc.username) > 3 else ("").join([ s for s in doc.full_name.split() ]) - if not frappe.db.exists("Community Member", username): - member = frappe.new_doc("Community Member") - member.full_name = doc.full_name - member.username = username - member.email = doc.email - member.route = username - member.owner = doc.email - member.insert(ignore_permissions=True) \ No newline at end of file diff --git a/community/community/web_form/update_profile/__init__.py b/community/community/web_form/update_profile/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/community/community/web_form/update_profile/update_profile.js b/community/community/web_form/update_profile/update_profile.js deleted file mode 100644 index b62f9465..00000000 --- a/community/community/web_form/update_profile/update_profile.js +++ /dev/null @@ -1,5 +0,0 @@ -frappe.ready(function() { - frappe.web_form.after_save = () => { - window.location.href = frappe.web_form.get_value("username") - } -}) \ No newline at end of file diff --git a/community/community/web_form/update_profile/update_profile.json b/community/community/web_form/update_profile/update_profile.json deleted file mode 100644 index 6b693e6b..00000000 --- a/community/community/web_form/update_profile/update_profile.json +++ /dev/null @@ -1,100 +0,0 @@ -{ - "accept_payment": 0, - "allow_comments": 0, - "allow_delete": 0, - "allow_edit": 1, - "allow_incomplete": 0, - "allow_multiple": 0, - "allow_print": 0, - "amount": 0.0, - "amount_based_on_field": 0, - "apply_document_permissions": 0, - "breadcrumbs": "", - "button_label": "Save", - "creation": "2021-03-09 17:34:03.394301", - "doc_type": "Community Member", - "docstatus": 0, - "doctype": "Web Form", - "idx": 0, - "is_standard": 1, - "login_required": 1, - "max_attachment_size": 0, - "modified": "2021-03-22 12:04:22.571655", - "modified_by": "Administrator", - "module": "Community", - "name": "update-profile", - "owner": "Administrator", - "payment_button_label": "Buy Now", - "published": 1, - "route": "edit-profile", - "route_to_success_link": 0, - "show_attachments": 0, - "show_in_grid": 0, - "show_sidebar": 0, - "sidebar_items": [], - "success_message": "Profile updated successfully.", - "success_url": "/", - "title": "Update Profile", - "web_form_fields": [ - { - "allow_read_on_all_link_options": 0, - "fieldname": "full_name", - "fieldtype": "Data", - "hidden": 0, - "label": "Full Name", - "max_length": 0, - "max_value": 0, - "read_only": 0, - "reqd": 1, - "show_in_filter": 0 - }, - { - "allow_read_on_all_link_options": 0, - "fieldname": "username", - "fieldtype": "Data", - "hidden": 0, - "label": "User Name", - "max_length": 0, - "max_value": 0, - "read_only": 0, - "reqd": 1, - "show_in_filter": 0 - }, - { - "allow_read_on_all_link_options": 0, - "fieldname": "short_intro", - "fieldtype": "Data", - "hidden": 0, - "label": "Short Intro", - "max_length": 0, - "max_value": 0, - "read_only": 0, - "reqd": 0, - "show_in_filter": 0 - }, - { - "allow_read_on_all_link_options": 0, - "fieldname": "bio", - "fieldtype": "Data", - "hidden": 0, - "label": "Bio", - "max_length": 0, - "max_value": 0, - "read_only": 0, - "reqd": 0, - "show_in_filter": 0 - }, - { - "allow_read_on_all_link_options": 0, - "fieldname": "photo", - "fieldtype": "Attach Image", - "hidden": 0, - "label": "Photo", - "max_length": 0, - "max_value": 0, - "read_only": 0, - "reqd": 0, - "show_in_filter": 0 - } - ] -} \ No newline at end of file diff --git a/community/community/web_form/update_profile/update_profile.py b/community/community/web_form/update_profile/update_profile.py deleted file mode 100644 index 2334f8b2..00000000 --- a/community/community/web_form/update_profile/update_profile.py +++ /dev/null @@ -1,7 +0,0 @@ -from __future__ import unicode_literals - -import frappe - -def get_context(context): - # do your magic here - pass diff --git a/community/community/widgets/Avatar.html b/community/community/widgets/Avatar.html index fac236df..4cb65da6 100644 --- a/community/community/widgets/Avatar.html +++ b/community/community/widgets/Avatar.html @@ -1,8 +1,8 @@ {% set color = member.get_palette() %} - {% if member.get_photo_url() %} - + {% if member.user_image %} + {% else %} int: + """Returns the number of courses authored by this user. + """ + return frappe.db.count( + 'LMS Course', { + 'owner': self.email + }) + + def get_palette(self): + palette = [ + ['--orange-avatar-bg', '--orange-avatar-color'], + ['--pink-avatar-bg', '--pink-avatar-color'], + ['--blue-avatar-bg', '--blue-avatar-color'], + ['--green-avatar-bg', '--green-avatar-color'], + ['--dark-green-avatar-bg', '--dark-green-avatar-color'], + ['--red-avatar-bg', '--red-avatar-color'], + ['--yellow-avatar-bg', '--yellow-avatar-color'], + ['--purple-avatar-bg', '--purple-avatar-color'], + ['--gray-avatar-bg', '--gray-avatar-color0'] + ] + + encoded_name = str(self.full_name).encode("utf-8") + hash_name = hashlib.md5(encoded_name).hexdigest() + idx = cint((int(hash_name[4:6], 16) + 1) / 5.33) + return palette[idx % 8] + diff --git a/community/patches.txt b/community/patches.txt index 5b1b2f97..e18c7fd7 100644 --- a/community/patches.txt +++ b/community/patches.txt @@ -2,3 +2,4 @@ community.patches.set_email_preferences community.patches.change_name_for_community_members community.patches.save_abbr_for_community_members community.patches.create_mentor_request_email_templates +community.patches.replace_member_with_user_in_batch_membership diff --git a/community/patches/replace_member_with_user_in_batch_membership.py b/community/patches/replace_member_with_user_in_batch_membership.py new file mode 100644 index 00000000..e8e04748 --- /dev/null +++ b/community/patches/replace_member_with_user_in_batch_membership.py @@ -0,0 +1,10 @@ +from __future__ import unicode_literals +import frappe +from frappe import _ + +def execute(): + frappe.reload_doc("lms", "doctype", "lms_batch_membership") + memberships = frappe.get_all("LMS Batch Membership", ["member", "name"]) + for membership in memberships: + email = frappe.db.get_value("Community Member", membership.member, "email") + frappe.db.set_value("LMS Batch Membership", membership.name, "member", email) diff --git a/community/www/courses/course.py b/community/www/courses/course.py index a397ab26..69957fb3 100644 --- a/community/www/courses/course.py +++ b/community/www/courses/course.py @@ -1,6 +1,4 @@ import frappe -from community.www.courses.utils import get_instructor -from frappe.utils import nowdate, getdate from community.lms.models import Course def get_context(context): diff --git a/community/www/courses/utils.py b/community/www/courses/utils.py index 63dfdb6e..189a0f46 100644 --- a/community/www/courses/utils.py +++ b/community/www/courses/utils.py @@ -37,16 +37,6 @@ def get_course(name): except frappe.DoesNotExistError: return -def get_instructor(owner): - instructor = frappe._dict() - try: - instructor = frappe.get_doc("Community Member", {"email": owner}) - except frappe.DoesNotExistError: - instructor.full_name = owner - instructor.abbr = ("").join([ s[0] for s in owner.split() ]) - instructor.course_count = len(frappe.get_all("LMS Course", {"owner": owner})) - return instructor - def get_batch_members(batch): members = [] memberships = frappe.get_all("LMS Batch Membership", {"batch": batch}, ["member", "member_type"]) From 637c7953213a6fa5c83c0718d062a200a22d28ea Mon Sep 17 00:00:00 2001 From: pateljannat Date: Fri, 21 May 2021 16:22:59 +0530 Subject: [PATCH 2/5] refactor: moved community member class functions to user override --- community/community/widgets/Avatar.html | 2 +- community/lms/doctype/lms_batch/lms_batch.py | 9 +++------ .../lms_batch_membership/lms_batch_membership.py | 4 +--- community/overrides/user.py | 9 +++++++++ community/patches.txt | 1 + .../replace_member_with_user_in_batch_membership.py | 1 - ...eplace_member_with_user_in_course_mentor_mapping.py | 9 +++++++++ community/www/batch/learn.py | 2 +- community/www/batch/members.html | 2 +- community/www/dashboard/index.html | 6 +++--- community/www/dashboard/index.py | 3 +-- community/www/macros/profile.html | 10 ---------- community/www/profiles/profile.html | 2 +- 13 files changed, 31 insertions(+), 29 deletions(-) create mode 100644 community/patches/replace_member_with_user_in_course_mentor_mapping.py delete mode 100644 community/www/macros/profile.html diff --git a/community/community/widgets/Avatar.html b/community/community/widgets/Avatar.html index 4cb65da6..6ef6ed6d 100644 --- a/community/community/widgets/Avatar.html +++ b/community/community/widgets/Avatar.html @@ -7,7 +7,7 @@ {% else %} - {{ member.abbr }} + {{ frappe.utils.get_abbr(member.full_name) }} {% endif %} diff --git a/community/lms/doctype/lms_batch/lms_batch.py b/community/lms/doctype/lms_batch/lms_batch.py index ce23f782..192df15f 100644 --- a/community/lms/doctype/lms_batch/lms_batch.py +++ b/community/lms/doctype/lms_batch/lms_batch.py @@ -42,13 +42,10 @@ class LMSBatch(Document): If member_type is specified, checks if the person is a Student/Mentor. """ - member = find("Community Member", email=email) - if not member: - return filters = { "batch": self.name, - "member": member.name + "member": email } if member_type: filters['member_type'] = member_type @@ -63,8 +60,8 @@ class LMSBatch(Document): ["member"]) member_names = [m['member'] for m in memberships] members = frappe.get_all( - "Community Member", - {"name": ["IN", member_names]}, + "Users", + {"email": ["IN", member_names]}, ["email", "full_name", "username"]) return members diff --git a/community/lms/doctype/lms_batch_membership/lms_batch_membership.py b/community/lms/doctype/lms_batch_membership/lms_batch_membership.py index 0d6db70d..1e0976c6 100644 --- a/community/lms/doctype/lms_batch_membership/lms_batch_membership.py +++ b/community/lms/doctype/lms_batch_membership/lms_batch_membership.py @@ -29,13 +29,11 @@ class LMSBatchMembership(Document): 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"): - if not member: - member = frappe.db.get_value("Community Member", {"email": frappe.session.user}, "name") frappe.get_doc({ "doctype": "LMS Batch Membership", "batch": batch, "role": role, "member_type": member_type, - "member": member + "member": member or frappe.session.user }).save(ignore_permissions=True) return "OK" diff --git a/community/overrides/user.py b/community/overrides/user.py index 5eb1b0d6..500a9285 100644 --- a/community/overrides/user.py +++ b/community/overrides/user.py @@ -31,3 +31,12 @@ class CustomUser(User): idx = cint((int(hash_name[4:6], 16) + 1) / 5.33) return palette[idx % 8] + def get_batch_count(self) -> int: + """Returns the number of batches authored by this user. + """ + return frappe.db.count( + 'LMS Batch Membership', { + 'member': self.name, + 'member_type': 'Mentor' + }) + diff --git a/community/patches.txt b/community/patches.txt index e18c7fd7..5c9f065e 100644 --- a/community/patches.txt +++ b/community/patches.txt @@ -3,3 +3,4 @@ community.patches.change_name_for_community_members community.patches.save_abbr_for_community_members community.patches.create_mentor_request_email_templates community.patches.replace_member_with_user_in_batch_membership +community.patches.replace_member_with_user_in_course_mentor_mapping diff --git a/community/patches/replace_member_with_user_in_batch_membership.py b/community/patches/replace_member_with_user_in_batch_membership.py index e8e04748..4c2ae2cc 100644 --- a/community/patches/replace_member_with_user_in_batch_membership.py +++ b/community/patches/replace_member_with_user_in_batch_membership.py @@ -1,6 +1,5 @@ from __future__ import unicode_literals import frappe -from frappe import _ def execute(): frappe.reload_doc("lms", "doctype", "lms_batch_membership") diff --git a/community/patches/replace_member_with_user_in_course_mentor_mapping.py b/community/patches/replace_member_with_user_in_course_mentor_mapping.py new file mode 100644 index 00000000..1e868666 --- /dev/null +++ b/community/patches/replace_member_with_user_in_course_mentor_mapping.py @@ -0,0 +1,9 @@ +from __future__ import unicode_literals +import frappe + +def execute(): + frappe.reload_doc("lms", "doctype", "lms_course_mentor_mapping") + mappings = frappe.get_all("LMS Course Mentor Mapping", ["mentor", "name"]) + for mapping in mappings: + email = frappe.db.get_value("Community Member", mapping.mentor, "email") + frappe.db.set_value("LMS Course Mentor Mapping", mapping.name, "mentor", email) diff --git a/community/www/batch/learn.py b/community/www/batch/learn.py index 983ea8be..538fa26c 100644 --- a/community/www/batch/learn.py +++ b/community/www/batch/learn.py @@ -18,7 +18,7 @@ def get_context(context): context.lesson = context.course.get_lesson(chapter_index, lesson_index) context.lesson_index = lesson_index context.chapter_index = chapter_index - + print(context.lesson) outline = context.course.get_outline() next_ = outline.get_next(lesson_number) prev_ = outline.get_prev(lesson_number) diff --git a/community/www/batch/members.html b/community/www/batch/members.html index ac092403..1fdff505 100644 --- a/community/www/batch/members.html +++ b/community/www/batch/members.html @@ -25,7 +25,7 @@ {% for member in members %}
- {{ Profile(member.photo, member.full_name, member.abbr, "small") }} + {{ widgets.Avatar(member=member, avatar_class="avatar-medium") }} {{ member.full_name }}
{{member.full_name}} diff --git a/community/www/dashboard/index.html b/community/www/dashboard/index.html index f87a06df..bfbcf195 100644 --- a/community/www/dashboard/index.html +++ b/community/www/dashboard/index.html @@ -91,7 +91,7 @@
- {{ Profile(member.photo, member.full_name, member.abbr, "large")}} + {{ widgets.Avatar(member=member, avatar_class="avatar-medium") }} {{ member.full_name }}
@@ -125,7 +125,7 @@
- {{ Profile(message.profile, message.full_name, message.abbr, "small")}} + {{ widgets.Avatar(member=member, avatar_class="avatar-medium") }} {{ member.full_name }}
{{ frappe.utils.md_to_html(message.message) }}
@@ -209,4 +209,4 @@
-{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/community/www/dashboard/index.py b/community/www/dashboard/index.py index 1172b77a..d0cf43bc 100644 --- a/community/www/dashboard/index.py +++ b/community/www/dashboard/index.py @@ -7,7 +7,7 @@ def get_context(context): if frappe.session.user == "Guest": frappe.local.flags.redirect_location = "/login" raise frappe.Redirect - context.member = frappe.get_all("Community Member", {"email": frappe.session.user}, ["name", "email", "photo", "full_name", "abbr"])[0] + context.member = frappe.get_doc("User", frappe.session.user) context.memberships = get_memberships(context.member.name) context.courses = get_courses(context.memberships) context.activity = get_activity(context.memberships) @@ -38,5 +38,4 @@ def get_activity(memberships): messages = frappe.get_all("LMS Message", {"batch": ["in", ",".join(batches)]}, ["message", "author", "creation", "batch"], order_by='creation desc') for message in messages: message.course = courses[message.batch] - message.profile, message.full_name, message.abbr = frappe.db.get_value("Community Member", message.author, ["photo", "full_name", "abbr"]) return messages diff --git a/community/www/macros/profile.html b/community/www/macros/profile.html deleted file mode 100644 index c608b59f..00000000 --- a/community/www/macros/profile.html +++ /dev/null @@ -1,10 +0,0 @@ -{% macro Profile(photo, full_name, abbr, icon) %} -{% if photo %} -{{ full_name }} -{% else %} -
- {{ abbr }} -
-{% endif %} -{% endmacro %} \ No newline at end of file diff --git a/community/www/profiles/profile.html b/community/www/profiles/profile.html index 30df9c43..6e64fda3 100644 --- a/community/www/profiles/profile.html +++ b/community/www/profiles/profile.html @@ -94,7 +94,7 @@ {% block page_content %}
- {{ Profile(member.photo, member.full_name, member.abbr, "large")}} + {{ widgets.Avatar(member=member, avatar_class="avatar-medium") }} {{ member.full_name }}
From 713dcf178a40113fba8b4c2b8251dfa45bb26c21 Mon Sep 17 00:00:00 2001 From: pateljannat Date: Fri, 21 May 2021 21:40:31 +0530 Subject: [PATCH 3/5] refactor: patches to fix data, profile dashboard, lms mentor mapping page fixes --- community/community/widgets/Avatar.html | 22 +- community/lms/doctype/lms_batch/lms_batch.py | 28 +-- .../lms_batch_membership.py | 21 +- .../lms/doctype/lms_course/lms_course.py | 29 +-- .../lms_mentor_request/lms_mentor_request.py | 33 ++- .../lms/doctype/lms_message/lms_message.json | 2 +- .../lms/doctype/lms_message/lms_message.py | 172 +++++++-------- community/patches.txt | 2 + ...replace_member_with_user_in_lms_message.py | 10 + ...lace_member_with_user_in_mentor_request.py | 10 + community/public/css/style.css | 7 +- community/templates/message.html | 13 ++ community/www/batch/discuss.js | 2 +- community/www/batch/discuss.py | 5 +- community/www/batch/members.html | 33 ++- community/www/batch/members.py | 3 - community/www/batch/utils.py | 19 +- community/www/courses/utils.py | 49 ----- community/www/dashboard/index.html | 16 +- community/www/dashboard/index.py | 7 +- community/www/macros/profile.html | 10 + community/www/profiles/profile.html | 195 ++++++++---------- community/www/profiles/profile.py | 12 +- 23 files changed, 314 insertions(+), 386 deletions(-) create mode 100644 community/patches/replace_member_with_user_in_lms_message.py create mode 100644 community/patches/replace_member_with_user_in_mentor_request.py create mode 100644 community/templates/message.html create mode 100644 community/www/macros/profile.html diff --git a/community/community/widgets/Avatar.html b/community/community/widgets/Avatar.html index 6ef6ed6d..cd4148c9 100644 --- a/community/community/widgets/Avatar.html +++ b/community/community/widgets/Avatar.html @@ -1,14 +1,14 @@ {% set color = member.get_palette() %} - - {% if member.user_image %} - - - {% else %} - - {{ frappe.utils.get_abbr(member.full_name) }} + + {% if member.user_image %} + + + {% else %} + + {{ frappe.utils.get_abbr(member.full_name) }} + + {% endif %} - {% endif %} - - + diff --git a/community/lms/doctype/lms_batch/lms_batch.py b/community/lms/doctype/lms_batch/lms_batch.py index 192df15f..5deb770f 100644 --- a/community/lms/doctype/lms_batch/lms_batch.py +++ b/community/lms/doctype/lms_batch/lms_batch.py @@ -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) diff --git a/community/lms/doctype/lms_batch_membership/lms_batch_membership.py b/community/lms/doctype/lms_batch_membership/lms_batch_membership.py index 1e0976c6..ee98c743 100644 --- a/community/lms/doctype/lms_batch_membership/lms_batch_membership.py +++ b/community/lms/doctype/lms_batch_membership/lms_batch_membership.py @@ -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"): diff --git a/community/lms/doctype/lms_course/lms_course.py b/community/lms/doctype/lms_course/lms_course.py index 9e1f87cd..a313ff74 100644 --- a/community/lms/doctype/lms_course/lms_course.py +++ b/community/lms/doctype/lms_course/lms_course.py @@ -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] 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 d9162bdf..08e514e4 100644 --- a/community/lms/doctype/lms_mentor_request/lms_mentor_request.py +++ b/community/lms/doctype/lms_mentor_request/lms_mentor_request.py @@ -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 diff --git a/community/lms/doctype/lms_message/lms_message.json b/community/lms/doctype/lms_message/lms_message.json index b4fc2319..f4acfc11 100644 --- a/community/lms/doctype/lms_message/lms_message.json +++ b/community/lms/doctype/lms_message/lms_message.json @@ -82,4 +82,4 @@ "sort_order": "DESC", "title_field": "author", "track_changes": 1 -} \ No newline at end of file +} diff --git a/community/lms/doctype/lms_message/lms_message.py b/community/lms/doctype/lms_message/lms_message.py index c3b2d012..fb491880 100644 --- a/community/lms/doctype/lms_message/lms_message.py +++ b/community/lms/doctype/lms_message/lms_message.py @@ -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 """ -
-
-
- {{ message.author_name }} -
-
- {{ message.message_time }} -
-
-
- {{ message.message }} -
-
- """ \ No newline at end of file + return """ +
+
+
+ {{ message.author_name }} +
+
+ {{ message.message_time }} +
+
+
+ {{ message.message }} +
+
+ """ diff --git a/community/patches.txt b/community/patches.txt index 5c9f065e..d7889b69 100644 --- a/community/patches.txt +++ b/community/patches.txt @@ -4,3 +4,5 @@ community.patches.save_abbr_for_community_members community.patches.create_mentor_request_email_templates 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_lms_message +community.patches.replace_member_with_user_in_mentor_request diff --git a/community/patches/replace_member_with_user_in_lms_message.py b/community/patches/replace_member_with_user_in_lms_message.py new file mode 100644 index 00000000..8cf2cb2b --- /dev/null +++ b/community/patches/replace_member_with_user_in_lms_message.py @@ -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) diff --git a/community/patches/replace_member_with_user_in_mentor_request.py b/community/patches/replace_member_with_user_in_mentor_request.py new file mode 100644 index 00000000..abda27ae --- /dev/null +++ b/community/patches/replace_member_with_user_in_mentor_request.py @@ -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) diff --git a/community/public/css/style.css b/community/public/css/style.css index e68467d2..65c9b48b 100644 --- a/community/public/css/style.css +++ b/community/public/css/style.css @@ -163,7 +163,7 @@ img.profile-photo { } .msger-inputarea { - position: absolute; + position: fixed; bottom: 0; width: 100%; display: flex; @@ -225,3 +225,8 @@ img.profile-photo { font-weight: 600; line-height: 51px; } + +.anchor_style { + text-decoration: none; + color: inherit; +} diff --git a/community/templates/message.html b/community/templates/message.html new file mode 100644 index 00000000..5826409a --- /dev/null +++ b/community/templates/message.html @@ -0,0 +1,13 @@ +
+
+
+ {{ message.author_name }} +
+
+ {{ message.message_time }} +
+
+
+ {{ message.message }} +
+
diff --git a/community/www/batch/discuss.js b/community/www/batch/discuss.js index d6380ac2..74f435c1 100644 --- a/community/www/batch/discuss.js +++ b/community/www/batch/discuss.js @@ -30,4 +30,4 @@ frappe.ready(() => { $(".msger-input").val(""); } }) -}) \ No newline at end of file +}) diff --git a/community/www/batch/discuss.py b/community/www/batch/discuss.py index fcd5ebda..5da3db2d 100644 --- a/community/www/batch/discuss.py +++ b/community/www/batch/discuss.py @@ -1,9 +1,6 @@ import frappe from . import utils -from community.lms.doctype.lms_batch.lms_batch import get_messages def get_context(context): utils.get_common_context(context) - - context.members = utils.get_batch_members(context.batch.name) - context.member_count = len(context.members) + context.messages = context.batch.get_messages() diff --git a/community/www/batch/members.html b/community/www/batch/members.html index 1fdff505..293af412 100644 --- a/community/www/batch/members.html +++ b/community/www/batch/members.html @@ -1,6 +1,5 @@ {% extends "templates/base.html" %} {% from "www/macros/sidebar.html" import Sidebar %} -{% from "www/macros/profile.html" import Profile %} {% from "www/macros/common_macro.html" import BatchHearder %} {% block title %}Members{% endblock %} @@ -14,27 +13,27 @@ {{ Sidebar(course, batch) }}
- {{ BatchHearder(course.title, member_count)}} - {{ MembersList(members)}} + {{ BatchHearder(course.title, member_count)}} + {{ MembersList(members)}}
{% endblock %} {% macro MembersList(members) %}
- {% for member in members %} -
-
- {{ widgets.Avatar(member=member, avatar_class="avatar-medium") }} {{ member.full_name }} -
-
- {{member.full_name}} -
- {% if member.is_mentor %} -
Mentor
- {% endif %} -
-
- {% endfor %} + {% for member in members %} +
+
+ {{ widgets.Avatar(member=member, avatar_class="avatar-medium") }} +
+ + {% if course.is_mentor(member.name) %} +
Mentor
+ {% endif %} +
+
+ {% endfor %}
{% endmacro %} diff --git a/community/www/batch/members.py b/community/www/batch/members.py index 1d04ac15..48be81c9 100644 --- a/community/www/batch/members.py +++ b/community/www/batch/members.py @@ -3,6 +3,3 @@ from . import utils def get_context(context): utils.get_common_context(context) - - context.members = utils.get_batch_members(context.batch.name) - context.member_count = len(context.members) diff --git a/community/www/batch/utils.py b/community/www/batch/utils.py index 51e77eba..8f375248 100644 --- a/community/www/batch/utils.py +++ b/community/www/batch/utils.py @@ -19,25 +19,10 @@ def get_common_context(context): context.course = course context.batch = batch + context.members = batch.get_mentors() + batch.get_students() + context.member_count = len(context.members) context.livecode_url = get_livecode_url() def get_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 - diff --git a/community/www/courses/utils.py b/community/www/courses/utils.py index 189a0f46..e69de29b 100644 --- a/community/www/courses/utils.py +++ b/community/www/courses/utils.py @@ -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 diff --git a/community/www/dashboard/index.html b/community/www/dashboard/index.html index bfbcf195..864ffcb4 100644 --- a/community/www/dashboard/index.html +++ b/community/www/dashboard/index.html @@ -90,12 +90,12 @@ {% block content %}
-
- {{ widgets.Avatar(member=member, avatar_class="avatar-medium") }} {{ member.full_name }} +
+ {{ widgets.Avatar(member=member, avatar_class="avatar-xl") }}
- {{member.full_name}} + {{ member.full_name }}