diff --git a/community/community/doctype/community_course_member/__init__.py b/community/community/doctype/community_course_member/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/community/community/doctype/community_course_member/community_course_member.js b/community/community/doctype/community_course_member/community_course_member.js
deleted file mode 100644
index a01a2c7c..00000000
--- a/community/community/doctype/community_course_member/community_course_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 Course Member', {
- // refresh: function(frm) {
-
- // }
-});
diff --git a/community/community/doctype/community_course_member/community_course_member.json b/community/community/doctype/community_course_member/community_course_member.json
deleted file mode 100644
index f6853b54..00000000
--- a/community/community/doctype/community_course_member/community_course_member.json
+++ /dev/null
@@ -1,96 +0,0 @@
-{
- "actions": [],
- "autoname": "field:user_name",
- "creation": "2021-03-02 11:24:49.612530",
- "doctype": "DocType",
- "editable_grid": 1,
- "engine": "InnoDB",
- "field_order": [
- "enabled",
- "full_name",
- "user_name",
- "email",
- "short_intro",
- "bio",
- "photo",
- "route"
- ],
- "fields": [
- {
- "default": "1",
- "fieldname": "enabled",
- "fieldtype": "Check",
- "label": "Enabled"
- },
- {
- "fieldname": "full_name",
- "fieldtype": "Data",
- "in_list_view": 1,
- "label": "Full Name",
- "reqd": 1
- },
- {
- "fieldname": "user_name",
- "fieldtype": "Data",
- "in_list_view": 1,
- "label": "User Name",
- "reqd": 1,
- "unique": 1
- },
- {
- "fieldname": "email",
- "fieldtype": "Data",
- "label": "Email",
- "options": "Email",
- "reqd": 1
- },
- {
- "fieldname": "short_intro",
- "fieldtype": "Data",
- "label": "Short Intro"
- },
- {
- "fieldname": "bio",
- "fieldtype": "Markdown Editor",
- "label": "Bio"
- },
- {
- "fieldname": "photo",
- "fieldtype": "Attach Image",
- "label": "Photo"
- },
- {
- "fieldname": "route",
- "fieldtype": "Data",
- "label": "Route"
- }
- ],
- "has_web_view": 1,
- "index_web_pages_for_search": 1,
- "is_published_field": "enabled",
- "links": [],
- "modified": "2021-04-06 11:50:41.551665",
- "modified_by": "Administrator",
- "module": "Community",
- "name": "Community Course 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
- }
- ],
- "quick_entry": 1,
- "route": "community-course-member",
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1
-}
\ No newline at end of file
diff --git a/community/community/doctype/community_course_member/community_course_member.py b/community/community/doctype/community_course_member/community_course_member.py
deleted file mode 100644
index 8455178f..00000000
--- a/community/community/doctype/community_course_member/community_course_member.py
+++ /dev/null
@@ -1,52 +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.website.website_generator import WebsiteGenerator
-from frappe import _
-
-class CommunityCourseMember(WebsiteGenerator):
-
- def get_context(self, context):
- context.abbr = ("").join([ s[0] for s in self.full_name.split() ])
- return context
-
- def validate(self):
- self.validate_user_name()
- if not self.route:
- self.route = self.user_name
-
- def validate_user_name(self):
- if len(self.user_name) < 4:
- frappe.throw(_("Username must be atleast 4 characters long."))
- if not re.match("^[A-Za-z0-9_]*$", self.user_name):
- frappe.throw(_("Username can only contain alphabets, numbers, and underscore."))
- self.user_name = self.user_name.lower()
-
- def after_insert(self):
- if frappe.db.exists("User", self.email):
- user = frappe.get_doc("User", self.email)
- else:
- user, update_password_link = self.create_user()
- self.send_email(update_password_link)
-
- def send_email(self, update_password_link):
-
- args = {
- 'update_password_link': update_password_link,
- 'full_name': self.full_name,
- }
-
- frappe.sendmail(
- recipients=self.email,
- sender="Administrator",
- subject=_("Set your Password"),
- template="community_course_membership",
- reference_doctype=self.doctype,
- reference_name=self.name,
- send_priority=0,
- queue_separately=True,
- args=args)
diff --git a/community/community/doctype/community_course_member/templates/community_course_member.html b/community/community/doctype/community_course_member/templates/community_course_member.html
deleted file mode 100644
index fabec4d2..00000000
--- a/community/community/doctype/community_course_member/templates/community_course_member.html
+++ /dev/null
@@ -1,25 +0,0 @@
-{% extends "templates/web.html" %}
-{% block page_content %}
-
- {% if photo %}
-
-

-
- {% else %}
-
- {% 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_course_member/templates/community_course_member_row.html b/community/community/doctype/community_course_member/templates/community_course_member_row.html
deleted file mode 100644
index 6444272c..00000000
--- a/community/community/doctype/community_course_member/templates/community_course_member_row.html
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
diff --git a/community/community/doctype/community_course_member/test_community_course_member.py b/community/community/doctype/community_course_member/test_community_course_member.py
deleted file mode 100644
index 45422930..00000000
--- a/community/community/doctype/community_course_member/test_community_course_member.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright (c) 2021, Frappe and Contributors
-# See license.txt
-from __future__ import unicode_literals
-
-# import frappe
-import unittest
-
-class TestCommunityCourseMember(unittest.TestCase):
- pass
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 %}
-
-

-
- {% else %}
-
- {% 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 @@
-
-
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..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.get_photo_url() %}
-
-
- {% else %}
-
- {{ member.abbr }}
+
+ {% if member.user_image %}
+
+
+ {% else %}
+
+ {{ frappe.utils.get_abbr(member.full_name) }}
+
+ {% endif %}
- {% endif %}
-
-
+
diff --git a/community/hackathon/doctype/community_hackathon/community_hackathon.json b/community/hackathon/doctype/community_hackathon/community_hackathon.json
index f893f9be..c140f547 100644
--- a/community/hackathon/doctype/community_hackathon/community_hackathon.json
+++ b/community/hackathon/doctype/community_hackathon/community_hackathon.json
@@ -23,7 +23,7 @@
"fieldname": "organizer",
"fieldtype": "Link",
"label": "Organizer",
- "options": "Community Member"
+ "options": "User"
},
{
"fieldname": "year",
@@ -34,7 +34,7 @@
],
"index_web_pages_for_search": 1,
"links": [],
- "modified": "2021-04-14 11:43:23.515972",
+ "modified": "2021-05-21 12:22:26.619776",
"modified_by": "Administrator",
"module": "Hackathon",
"name": "Community Hackathon",
diff --git a/community/hooks.py b/community/hooks.py
index 057b7b34..0c21b608 100644
--- a/community/hooks.py
+++ b/community/hooks.py
@@ -84,22 +84,17 @@ web_include_css = "community.bundle.css"
# ---------------
# Override standard doctype classes
-# override_doctype_class = {
-# "ToDo": "custom_app.overrides.CustomToDo"
-# }
+override_doctype_class = {
+ "User": "community.overrides.user.CustomUser"
+}
# Document Events
# ---------------
# Hook on document methods and events
doc_events = {
- "User": {
- "after_insert": "community.community.doctype.community_member.community_member.create_member_from_user"
- },
- "LMS Message": {
- "after_insert": "community.lms.doctype.lms_message.lms_message.publish_message"
- }
- }
+
+}
# Scheduled Tasks
# ---------------
diff --git a/community/lms/doctype/invite_request/test_invite_request.py b/community/lms/doctype/invite_request/test_invite_request.py
index e7ff5787..31bc7afe 100644
--- a/community/lms/doctype/invite_request/test_invite_request.py
+++ b/community/lms/doctype/invite_request/test_invite_request.py
@@ -52,15 +52,8 @@ class TestInviteRequest(unittest.TestCase):
self.assertEqual(user.send_welcome_email, 0)
self.assertEqual(user.user_type, "Website User")
- member = frappe.db.get_value("Community Member", {"email": "test_invite@example.com"})
- self.assertTrue(member)
-
@classmethod
def tearDownClass(self):
-
- if frappe.db.exists("Community Member", {"email": "test_invite@example.com"}):
- frappe.delete_doc("Community Member", {"email": "test_invite@example.com"})
-
if frappe.db.exists("User", "test_invite@example.com"):
frappe.delete_doc("User", "test_invite@example.com")
diff --git a/community/lms/doctype/lms_batch/lms_batch.py b/community/lms/doctype/lms_batch/lms_batch.py
index 1e5ae856..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
@@ -35,20 +34,17 @@ class LMSBatch(Document):
{"batch": self.name, "member_type": "Mentor"},
["member"])
member_names = [m['member'] for m in memberships]
- return find_all("Community Member", name=["IN", member_names])
+ return find_all("User", name=["IN", member_names])
def is_member(self, email, member_type=None):
"""Checks if a person is part of a batch.
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
@@ -62,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(
- "Community Member",
- {"name": ["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.json b/community/lms/doctype/lms_batch_membership/lms_batch_membership.json
index 67c41497..e6aa562d 100644
--- a/community/lms/doctype/lms_batch_membership/lms_batch_membership.json
+++ b/community/lms/doctype/lms_batch_membership/lms_batch_membership.json
@@ -29,7 +29,7 @@
"in_list_view": 1,
"in_standard_filter": 1,
"label": "Member",
- "options": "Community Member"
+ "options": "User"
},
{
"default": "Student",
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..3993eacd 100644
--- a/community/lms/doctype/lms_batch_membership/lms_batch_membership.py
+++ b/community/lms/doctype/lms_batch_membership/lms_batch_membership.py
@@ -14,28 +14,40 @@ 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
+ },
+ fields=["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))
+@frappe.whitelist()
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/lms/doctype/lms_course/lms_course.py b/community/lms/doctype/lms_course/lms_course.py
index 495efaf2..501f5341 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()
@@ -85,7 +69,7 @@ class LMSCourse(Document):
course_mentors = []
mentors = frappe.get_all("LMS Course Mentor Mapping", {"course": self.name}, ["mentor"])
for mentor in mentors:
- member = frappe.get_doc("Community Member", mentor.mentor)
+ member = frappe.get_doc("User", mentor.mentor)
# TODO: change this to count query
member.batch_count = len(frappe.get_all("LMS Batch Membership", {"member": member.name, "member_type": "Mentor"}))
course_mentors.append(member)
@@ -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):
@@ -116,14 +99,13 @@ class LMSCourse(Document):
filters={
"course": self.name,
"member_type": "Student",
- "member_email": email
+ "member": email
},
fieldname="batch")
return batch_name and frappe.get_doc("LMS Batch", batch_name)
def get_instructor(self):
- member_name = self.get_community_member(self.owner)
- return frappe.get_doc("Community Member", member_name)
+ return frappe.get_doc("User", self.owner)
def get_chapters(self):
"""Returns all chapters of this course.
@@ -138,10 +120,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_course/test_lms_course.py b/community/lms/doctype/lms_course/test_lms_course.py
index 61a3ecf8..69e78484 100644
--- a/community/lms/doctype/lms_course/test_lms_course.py
+++ b/community/lms/doctype/lms_course/test_lms_course.py
@@ -11,7 +11,6 @@ class TestLMSCourse(unittest.TestCase):
def setUp(self):
frappe.db.sql('delete from `tabLMS Course Mentor Mapping`')
frappe.db.sql('delete from `tabLMS Course`')
- frappe.db.sql('delete from `tabCommunity Member`')
def new_course(self, title):
doc = frappe.get_doc({
diff --git a/community/lms/doctype/lms_course_mentor_mapping/lms_course_mentor_mapping.json b/community/lms/doctype/lms_course_mentor_mapping/lms_course_mentor_mapping.json
index a9026aec..b17a6b0e 100644
--- a/community/lms/doctype/lms_course_mentor_mapping/lms_course_mentor_mapping.json
+++ b/community/lms/doctype/lms_course_mentor_mapping/lms_course_mentor_mapping.json
@@ -23,7 +23,7 @@
"fieldtype": "Link",
"in_standard_filter": 1,
"label": "Mentor",
- "options": "Community Member"
+ "options": "User"
},
{
"fetch_from": "mentor.full_name",
@@ -36,7 +36,7 @@
],
"index_web_pages_for_search": 1,
"links": [],
- "modified": "2021-04-20 12:46:48.460934",
+ "modified": "2021-05-21 11:48:43.340315",
"modified_by": "Administrator",
"module": "LMS",
"name": "LMS Course Mentor Mapping",
diff --git a/community/lms/doctype/lms_mentor_request/lms_mentor_request.json b/community/lms/doctype/lms_mentor_request/lms_mentor_request.json
index 00949bed..1f045beb 100644
--- a/community/lms/doctype/lms_mentor_request/lms_mentor_request.json
+++ b/community/lms/doctype/lms_mentor_request/lms_mentor_request.json
@@ -19,7 +19,7 @@
"fieldtype": "Link",
"in_standard_filter": 1,
"label": "Member",
- "options": "Community Member"
+ "options": "User"
},
{
"fieldname": "course",
@@ -52,7 +52,7 @@
"fieldname": "reviewed_by",
"fieldtype": "Link",
"label": "Reviewed By",
- "options": "Community Member"
+ "options": "User"
},
{
"fieldname": "comments",
@@ -62,7 +62,7 @@
],
"index_web_pages_for_search": 1,
"links": [],
- "modified": "2021-04-19 09:27:03.814016",
+ "modified": "2021-05-21 11:49:12.543502",
"modified_by": "Administrator",
"module": "LMS",
"name": "LMS Mentor Request",
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..6091d192 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,12 @@ 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',{
+ '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 38bc417b..f4acfc11 100644
--- a/community/lms/doctype/lms_message/lms_message.json
+++ b/community/lms/doctype/lms_message/lms_message.json
@@ -26,7 +26,7 @@
"fieldtype": "Link",
"in_list_view": 1,
"label": "Author",
- "options": "Community Member"
+ "options": "User"
},
{
"fieldname": "message",
@@ -58,7 +58,7 @@
],
"index_web_pages_for_search": 1,
"links": [],
- "modified": "2021-04-28 10:17:57.618127",
+ "modified": "2021-05-21 11:49:34.911479",
"modified_by": "Administrator",
"module": "LMS",
"name": "LMS Message",
@@ -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..f19d80ea 100644
--- a/community/lms/doctype/lms_message/lms_message.py
+++ b/community/lms/doctype/lms_message/lms_message.py
@@ -7,98 +7,103 @@ 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):
+ self.publish_message()
+ #Todo: Adding email preference field for users
+ #self.send_email()
+
+ def publish_message(self):
+ template = self.get_message_template()
+ message = frappe._dict({
+ "author_name": self.author_name,
+ "message_time": frappe.utils.pretty_date(self.creation),
+ "message": frappe.utils.md_to_html(self.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, self.owner)
+
+ frappe.publish_realtime(event="eval_js", message=js, after_commit=True)
+
+ def get_message_template(self):
+ return """
+
+
+
+ {{ message.author_name }}
+
+
+ {{ message.message_time }}
+
+
+
+ {{ message.message }}
+
+
+ """
+
+ 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:
+ #Todo: wrap sendmail in frappe.enqueue, else messages takes long to display.
+ 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)
-
- 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)
-
- 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
diff --git a/community/overrides/user.py b/community/overrides/user.py
new file mode 100644
index 00000000..500a9285
--- /dev/null
+++ b/community/overrides/user.py
@@ -0,0 +1,42 @@
+import frappe
+from frappe.core.doctype.user.user import User
+from frappe.utils import cint
+import hashlib
+
+class CustomUser(User):
+
+ 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_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 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 5b1b2f97..d7889b69 100644
--- a/community/patches.txt
+++ b/community/patches.txt
@@ -2,3 +2,7 @@ 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
+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_batch_membership.py b/community/patches/replace_member_with_user_in_batch_membership.py
new file mode 100644
index 00000000..4c2ae2cc
--- /dev/null
+++ b/community/patches/replace_member_with_user_in_batch_membership.py
@@ -0,0 +1,9 @@
+from __future__ import unicode_literals
+import frappe
+
+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/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/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/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..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 %}
-
-
- {{ Profile(member.photo, member.full_name, member.abbr, "small") }}
-
-
- {{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/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..e69de29b 100644
--- a/community/www/courses/utils.py
+++ b/community/www/courses/utils.py
@@ -1,59 +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_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"])
-
- 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 f87a06df..7c2ecfc3 100644
--- a/community/www/dashboard/index.html
+++ b/community/www/dashboard/index.html
@@ -1,5 +1,4 @@
{% extends "templates/base.html" %}
-{% from "www/macros/profile.html" import Profile %}
{% block title %}{{ _("Community") }}{% endblock %}
{% block head_include %}
@@ -15,34 +14,6 @@
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 {
display: flex;
}
@@ -90,12 +61,12 @@
{% block content %}
-
- {{ Profile(member.photo, member.full_name, member.abbr, "large")}}
+
+ {{ widgets.Avatar(member=member, avatar_class="avatar-xl") }}