refactor: removed community member doctype
This commit is contained in:
@@ -13,13 +13,13 @@
|
|||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"in_list_view": 1,
|
"in_list_view": 1,
|
||||||
"label": "Member",
|
"label": "Member",
|
||||||
"options": "Community Member"
|
"options": "User"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"index_web_pages_for_search": 1,
|
"index_web_pages_for_search": 1,
|
||||||
"istable": 1,
|
"istable": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2021-02-15 12:03:31.153575",
|
"modified": "2021-05-21 12:15:51.286478",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Community",
|
"module": "Community",
|
||||||
"name": "Community Event Volunteer",
|
"name": "Community Event Volunteer",
|
||||||
|
|||||||
@@ -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) {
|
|
||||||
|
|
||||||
// }
|
|
||||||
});
|
|
||||||
@@ -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
|
|
||||||
}
|
|
||||||
@@ -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"<CommunityMember: {self.email}>"
|
|
||||||
|
|
||||||
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)))
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
{% extends "templates/web.html" %}
|
|
||||||
{% block page_content %}
|
|
||||||
<div class="py-20 row">
|
|
||||||
{% if photo %}
|
|
||||||
<div class="col-sm-2 border border-dark">
|
|
||||||
<img src="{{ photo }}" alt="{{ full_name }}">
|
|
||||||
</div>
|
|
||||||
{% else %}
|
|
||||||
<div class="col-sm-2">
|
|
||||||
<div class="standard-image" style="font-size: 30px;">{{ abbr }}</div>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
<div class="col">
|
|
||||||
<h1>{{ full_name }}</h1>
|
|
||||||
{% if short_intro %}
|
|
||||||
<p class="lead"> {{ short_intro }} </p>
|
|
||||||
{% endif %}
|
|
||||||
{% if bio %}
|
|
||||||
<p class="markdown-style"> {{ frappe.utils.md_to_html(bio) }} </p>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
<!-- this is a sample default web page template -->
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
<div>
|
|
||||||
<a href="{{ doc.route }}">{{ doc.title or doc.name }}</a>
|
|
||||||
</div>
|
|
||||||
<!-- this is a sample default list template -->
|
|
||||||
@@ -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})
|
|
||||||
@@ -1,16 +1 @@
|
|||||||
import frappe
|
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)
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
frappe.ready(function() {
|
|
||||||
frappe.web_form.after_save = () => {
|
|
||||||
window.location.href = frappe.web_form.get_value("username")
|
|
||||||
}
|
|
||||||
})
|
|
||||||
@@ -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
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
from __future__ import unicode_literals
|
|
||||||
|
|
||||||
import frappe
|
|
||||||
|
|
||||||
def get_context(context):
|
|
||||||
# do your magic here
|
|
||||||
pass
|
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
{% set color = member.get_palette() %}
|
{% set color = member.get_palette() %}
|
||||||
<a href="/{{member.username}}">
|
<a href="/{{member.username}}">
|
||||||
<span class="avatar {{ avatar_class }}" title="{{ member.full_name }}">
|
<span class="avatar {{ avatar_class }}" title="{{ member.full_name }}">
|
||||||
{% if member.get_photo_url() %}
|
{% if member.user_image %}
|
||||||
<img class="avatar-frame standard-image" src="{{ member.get_photo_url() }}" title="{{ member.full_name }}">
|
<img class="avatar-frame standard-image" src="{{ member.user_image }}" title="{{ member.full_name }}">
|
||||||
</img>
|
</img>
|
||||||
{% else %}
|
{% else %}
|
||||||
<span class="avatar-frame standard-image" title="{{ member.full_name }}"
|
<span class="avatar-frame standard-image" title="{{ member.full_name }}"
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
"fieldname": "organizer",
|
"fieldname": "organizer",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"label": "Organizer",
|
"label": "Organizer",
|
||||||
"options": "Community Member"
|
"options": "User"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldname": "year",
|
"fieldname": "year",
|
||||||
@@ -34,7 +34,7 @@
|
|||||||
],
|
],
|
||||||
"index_web_pages_for_search": 1,
|
"index_web_pages_for_search": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2021-04-14 11:43:23.515972",
|
"modified": "2021-05-21 12:22:26.619776",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Hackathon",
|
"module": "Hackathon",
|
||||||
"name": "Community Hackathon",
|
"name": "Community Hackathon",
|
||||||
|
|||||||
@@ -84,9 +84,9 @@ web_include_css = "community.bundle.css"
|
|||||||
# ---------------
|
# ---------------
|
||||||
# Override standard doctype classes
|
# Override standard doctype classes
|
||||||
|
|
||||||
# override_doctype_class = {
|
override_doctype_class = {
|
||||||
# "ToDo": "custom_app.overrides.CustomToDo"
|
"User": "community.overrides.user.CustomUser"
|
||||||
# }
|
}
|
||||||
|
|
||||||
# Document Events
|
# Document Events
|
||||||
# ---------------
|
# ---------------
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ class LMSBatch(Document):
|
|||||||
{"batch": self.name, "member_type": "Mentor"},
|
{"batch": self.name, "member_type": "Mentor"},
|
||||||
["member"])
|
["member"])
|
||||||
member_names = [m['member'] for m in memberships]
|
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):
|
def is_member(self, email):
|
||||||
"""Checks if a person is part of a batch.
|
"""Checks if a person is part of a batch.
|
||||||
|
|||||||
@@ -27,7 +27,7 @@
|
|||||||
"in_list_view": 1,
|
"in_list_view": 1,
|
||||||
"in_standard_filter": 1,
|
"in_standard_filter": 1,
|
||||||
"label": "Member",
|
"label": "Member",
|
||||||
"options": "Community Member"
|
"options": "User"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldname": "member_type",
|
"fieldname": "member_type",
|
||||||
@@ -58,7 +58,7 @@
|
|||||||
],
|
],
|
||||||
"index_web_pages_for_search": 1,
|
"index_web_pages_for_search": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2021-04-26 12:52:59.826509",
|
"modified": "2021-05-21 11:48:05.363738",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "LMS",
|
"module": "LMS",
|
||||||
"name": "LMS Batch Membership",
|
"name": "LMS Batch Membership",
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ class LMSCourse(Document):
|
|||||||
course_mentors = []
|
course_mentors = []
|
||||||
mentors = frappe.get_all("LMS Course Mentor Mapping", {"course": self.name}, ["mentor"])
|
mentors = frappe.get_all("LMS Course Mentor Mapping", {"course": self.name}, ["mentor"])
|
||||||
for mentor in mentors:
|
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
|
# TODO: change this to count query
|
||||||
member.batch_count = len(frappe.get_all("LMS Batch Membership", {"member": member.name, "member_type": "Mentor"}))
|
member.batch_count = len(frappe.get_all("LMS Batch Membership", {"member": member.name, "member_type": "Mentor"}))
|
||||||
course_mentors.append(member)
|
course_mentors.append(member)
|
||||||
@@ -144,8 +144,7 @@ class LMSCourse(Document):
|
|||||||
return frappe.get_doc("LMS Batch", batches[0])
|
return frappe.get_doc("LMS Batch", batches[0])
|
||||||
|
|
||||||
def get_instructor(self):
|
def get_instructor(self):
|
||||||
member_name = self.get_community_member(self.owner)
|
return frappe.get_doc("User", self.owner)
|
||||||
return frappe.get_doc("Community Member", member_name)
|
|
||||||
|
|
||||||
def get_chapters(self):
|
def get_chapters(self):
|
||||||
"""Returns all chapters of this course.
|
"""Returns all chapters of this course.
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"in_standard_filter": 1,
|
"in_standard_filter": 1,
|
||||||
"label": "Mentor",
|
"label": "Mentor",
|
||||||
"options": "Community Member"
|
"options": "User"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fetch_from": "mentor.full_name",
|
"fetch_from": "mentor.full_name",
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
],
|
],
|
||||||
"index_web_pages_for_search": 1,
|
"index_web_pages_for_search": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2021-04-20 12:46:48.460934",
|
"modified": "2021-05-21 11:48:43.340315",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "LMS",
|
"module": "LMS",
|
||||||
"name": "LMS Course Mentor Mapping",
|
"name": "LMS Course Mentor Mapping",
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"in_standard_filter": 1,
|
"in_standard_filter": 1,
|
||||||
"label": "Member",
|
"label": "Member",
|
||||||
"options": "Community Member"
|
"options": "User"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldname": "course",
|
"fieldname": "course",
|
||||||
@@ -52,7 +52,7 @@
|
|||||||
"fieldname": "reviewed_by",
|
"fieldname": "reviewed_by",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"label": "Reviewed By",
|
"label": "Reviewed By",
|
||||||
"options": "Community Member"
|
"options": "User"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldname": "comments",
|
"fieldname": "comments",
|
||||||
@@ -62,7 +62,7 @@
|
|||||||
],
|
],
|
||||||
"index_web_pages_for_search": 1,
|
"index_web_pages_for_search": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2021-04-19 09:27:03.814016",
|
"modified": "2021-05-21 11:49:12.543502",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "LMS",
|
"module": "LMS",
|
||||||
"name": "LMS Mentor Request",
|
"name": "LMS Mentor Request",
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"in_list_view": 1,
|
"in_list_view": 1,
|
||||||
"label": "Author",
|
"label": "Author",
|
||||||
"options": "Community Member"
|
"options": "User"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldname": "message",
|
"fieldname": "message",
|
||||||
@@ -58,7 +58,7 @@
|
|||||||
],
|
],
|
||||||
"index_web_pages_for_search": 1,
|
"index_web_pages_for_search": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2021-04-28 10:17:57.618127",
|
"modified": "2021-05-21 11:49:34.911479",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "LMS",
|
"module": "LMS",
|
||||||
"name": "LMS Message",
|
"name": "LMS Message",
|
||||||
|
|||||||
33
community/overrides/user.py
Normal file
33
community/overrides/user.py
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
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]
|
||||||
|
|
||||||
@@ -2,3 +2,4 @@ community.patches.set_email_preferences
|
|||||||
community.patches.change_name_for_community_members
|
community.patches.change_name_for_community_members
|
||||||
community.patches.save_abbr_for_community_members
|
community.patches.save_abbr_for_community_members
|
||||||
community.patches.create_mentor_request_email_templates
|
community.patches.create_mentor_request_email_templates
|
||||||
|
community.patches.replace_member_with_user_in_batch_membership
|
||||||
|
|||||||
@@ -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)
|
||||||
@@ -1,6 +1,4 @@
|
|||||||
import frappe
|
import frappe
|
||||||
from community.www.courses.utils import get_instructor
|
|
||||||
from frappe.utils import nowdate, getdate
|
|
||||||
from community.lms.models import Course
|
from community.lms.models import Course
|
||||||
|
|
||||||
def get_context(context):
|
def get_context(context):
|
||||||
|
|||||||
@@ -37,16 +37,6 @@ def get_course(name):
|
|||||||
except frappe.DoesNotExistError:
|
except frappe.DoesNotExistError:
|
||||||
return
|
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):
|
def get_batch_members(batch):
|
||||||
members = []
|
members = []
|
||||||
memberships = frappe.get_all("LMS Batch Membership", {"batch": batch}, ["member", "member_type"])
|
memberships = frappe.get_all("LMS Batch Membership", {"batch": batch}, ["member", "member_type"])
|
||||||
|
|||||||
Reference in New Issue
Block a user