feat: discussions tab and web form for messages
This commit is contained in:
@@ -1,7 +1,8 @@
|
||||
{
|
||||
"actions": [],
|
||||
"allow_guest_to_view": 1,
|
||||
"autoname": "field:email",
|
||||
"allow_rename": 1,
|
||||
"autoname": "field:username",
|
||||
"creation": "2021-02-12 15:47:23.591567",
|
||||
"doctype": "DocType",
|
||||
"editable_grid": 1,
|
||||
@@ -14,7 +15,7 @@
|
||||
"photo",
|
||||
"short_intro",
|
||||
"bio",
|
||||
"user_name",
|
||||
"username",
|
||||
"route"
|
||||
],
|
||||
"fields": [
|
||||
@@ -29,8 +30,7 @@
|
||||
"fieldtype": "Data",
|
||||
"in_list_view": 1,
|
||||
"label": "Full Name",
|
||||
"reqd": 1,
|
||||
"unique": 1
|
||||
"reqd": 1
|
||||
},
|
||||
{
|
||||
"allow_in_quick_entry": 1,
|
||||
@@ -56,12 +56,6 @@
|
||||
"fieldtype": "Markdown Editor",
|
||||
"label": "Bio"
|
||||
},
|
||||
{
|
||||
"fieldname": "user_name",
|
||||
"fieldtype": "Data",
|
||||
"label": "User Name",
|
||||
"unique": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "route",
|
||||
"fieldtype": "Data",
|
||||
@@ -74,12 +68,18 @@
|
||||
"options": "Email",
|
||||
"reqd": 1,
|
||||
"unique": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "username",
|
||||
"fieldtype": "Data",
|
||||
"label": "User Name",
|
||||
"unique": 1
|
||||
}
|
||||
],
|
||||
"has_web_view": 1,
|
||||
"index_web_pages_for_search": 1,
|
||||
"links": [],
|
||||
"modified": "2021-03-12 17:41:32.786762",
|
||||
"modified": "2021-03-22 12:16:18.823037",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Community",
|
||||
"name": "Community Member",
|
||||
|
||||
@@ -7,6 +7,7 @@ import frappe
|
||||
from frappe.website.website_generator import WebsiteGenerator
|
||||
import re
|
||||
from frappe import _
|
||||
from frappe.model.rename_doc import rename_doc
|
||||
|
||||
class CommunityMember(WebsiteGenerator):
|
||||
def get_context(self, context):
|
||||
@@ -14,24 +15,27 @@ class CommunityMember(WebsiteGenerator):
|
||||
return context
|
||||
|
||||
def validate(self):
|
||||
self.validate_user_name()
|
||||
if self.route != self.user_name:
|
||||
self.route = self.user_name
|
||||
self.validate_username()
|
||||
if self.route != self.username:
|
||||
self.route = self.username
|
||||
|
||||
def validate_user_name(self):
|
||||
if self.user_name:
|
||||
if len(self.user_name) < 4:
|
||||
def validate_username(self):
|
||||
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.user_name):
|
||||
if not re.match("^[A-Za-z0-9_]*$", self.username):
|
||||
frappe.throw(_("Username can only contain alphabets, numbers and underscore."))
|
||||
self.user_name = self.user_name.lower()
|
||||
self.username = self.username.lower()
|
||||
|
||||
def on_update(self):
|
||||
if self.username != self.name:
|
||||
rename_doc(self.doctype, self.name, self.username, force=False, merge=False, ignore_permissions=True, ignore_if_exists=False)
|
||||
|
||||
def create_member_from_user(doc, method):
|
||||
member = frappe.get_doc({
|
||||
"doctype": "Community Member",
|
||||
"full_name": doc.full_name,
|
||||
"user_name": doc.username,
|
||||
"username": doc.username if len(doc.username) > 3 else doc.username + "_community",
|
||||
"email": doc.email,
|
||||
"route": doc.username,
|
||||
"owner": doc.email
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
frappe.ready(function() {
|
||||
// bind events here
|
||||
frappe.web_form.after_save = () => {
|
||||
window.location.href = frappe.web_form.get_value("username")
|
||||
}
|
||||
})
|
||||
@@ -19,7 +19,7 @@
|
||||
"is_standard": 1,
|
||||
"login_required": 1,
|
||||
"max_attachment_size": 0,
|
||||
"modified": "2021-03-12 18:14:19.363139",
|
||||
"modified": "2021-03-22 12:04:22.571655",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Community",
|
||||
"name": "update-profile",
|
||||
@@ -50,14 +50,14 @@
|
||||
},
|
||||
{
|
||||
"allow_read_on_all_link_options": 0,
|
||||
"fieldname": "user_name",
|
||||
"fieldname": "username",
|
||||
"fieldtype": "Data",
|
||||
"hidden": 0,
|
||||
"label": "User Name",
|
||||
"max_length": 0,
|
||||
"max_value": 0,
|
||||
"read_only": 0,
|
||||
"reqd": 0,
|
||||
"reqd": 1,
|
||||
"show_in_filter": 0
|
||||
},
|
||||
{
|
||||
|
||||
0
community/lms/doctype/lms_batch/__init__.py
Normal file
0
community/lms/doctype/lms_batch/__init__.py
Normal file
8
community/lms/doctype/lms_batch/lms_batch.js
Normal file
8
community/lms/doctype/lms_batch/lms_batch.js
Normal file
@@ -0,0 +1,8 @@
|
||||
// Copyright (c) 2021, FOSS United and contributors
|
||||
// For license information, please see license.txt
|
||||
|
||||
frappe.ui.form.on('LMS Batch', {
|
||||
// refresh: function(frm) {
|
||||
|
||||
// }
|
||||
});
|
||||
113
community/lms/doctype/lms_batch/lms_batch.json
Normal file
113
community/lms/doctype/lms_batch/lms_batch.json
Normal file
@@ -0,0 +1,113 @@
|
||||
{
|
||||
"actions": [],
|
||||
"autoname": "field:title",
|
||||
"creation": "2021-03-18 19:37:34.614796",
|
||||
"doctype": "DocType",
|
||||
"editable_grid": 1,
|
||||
"engine": "InnoDB",
|
||||
"field_order": [
|
||||
"course",
|
||||
"title",
|
||||
"column_break_3",
|
||||
"code",
|
||||
"section_break_5",
|
||||
"description",
|
||||
"section_break_7",
|
||||
"visibility",
|
||||
"membership",
|
||||
"column_break_9",
|
||||
"status",
|
||||
"stage"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"fieldname": "course",
|
||||
"fieldtype": "Link",
|
||||
"label": "Course",
|
||||
"options": "LMS Course"
|
||||
},
|
||||
{
|
||||
"fieldname": "code",
|
||||
"fieldtype": "Data",
|
||||
"label": "Code",
|
||||
"read_only": 1,
|
||||
"unique": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "title",
|
||||
"fieldtype": "Data",
|
||||
"label": "Title",
|
||||
"unique": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "description",
|
||||
"fieldtype": "Markdown Editor",
|
||||
"label": "Description"
|
||||
},
|
||||
{
|
||||
"fieldname": "visibility",
|
||||
"fieldtype": "Select",
|
||||
"label": "Visibility",
|
||||
"options": "\nPublic\nUnlisted\nPrivate"
|
||||
},
|
||||
{
|
||||
"fieldname": "membership",
|
||||
"fieldtype": "Select",
|
||||
"label": "Membership",
|
||||
"options": "\nOpen\nRestricted\nInvite Only\nClosed"
|
||||
},
|
||||
{
|
||||
"fieldname": "status",
|
||||
"fieldtype": "Select",
|
||||
"label": "Status",
|
||||
"options": "\nActive\nInactive"
|
||||
},
|
||||
{
|
||||
"fieldname": "stage",
|
||||
"fieldtype": "Select",
|
||||
"label": "Stage",
|
||||
"options": "\nReady\nIn Progress\nCompleted\nCancelled"
|
||||
},
|
||||
{
|
||||
"fieldname": "column_break_3",
|
||||
"fieldtype": "Column Break"
|
||||
},
|
||||
{
|
||||
"fieldname": "section_break_5",
|
||||
"fieldtype": "Section Break"
|
||||
},
|
||||
{
|
||||
"fieldname": "column_break_9",
|
||||
"fieldtype": "Column Break"
|
||||
},
|
||||
{
|
||||
"fieldname": "section_break_7",
|
||||
"fieldtype": "Section Break"
|
||||
}
|
||||
],
|
||||
"index_web_pages_for_search": 1,
|
||||
"links": [],
|
||||
"modified": "2021-03-19 12:56:33.054884",
|
||||
"modified_by": "Administrator",
|
||||
"module": "LMS",
|
||||
"name": "LMS Batch",
|
||||
"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,
|
||||
"sort_field": "modified",
|
||||
"sort_order": "DESC",
|
||||
"track_changes": 1
|
||||
}
|
||||
17
community/lms/doctype/lms_batch/lms_batch.py
Normal file
17
community/lms/doctype/lms_batch/lms_batch.py
Normal file
@@ -0,0 +1,17 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright (c) 2021, FOSS United and contributors
|
||||
# For license information, please see license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
from frappe.model.document import Document
|
||||
|
||||
class LMSBatch(Document):
|
||||
def validate(self):
|
||||
if not self.code:
|
||||
self.generate_code()
|
||||
|
||||
def generate_code(self):
|
||||
short_code = frappe.db.get_value("LMS Course", self.course, "short_code")
|
||||
course_batches = frappe.get_all("LMS Batch",{"course":self.course})
|
||||
self.code = short_code + str(len(course_batches) + 1)
|
||||
10
community/lms/doctype/lms_batch/test_lms_batch.py
Normal file
10
community/lms/doctype/lms_batch/test_lms_batch.py
Normal file
@@ -0,0 +1,10 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright (c) 2021, FOSS United and Contributors
|
||||
# See license.txt
|
||||
from __future__ import unicode_literals
|
||||
|
||||
# import frappe
|
||||
import unittest
|
||||
|
||||
class TestLMSBatch(unittest.TestCase):
|
||||
pass
|
||||
@@ -0,0 +1,8 @@
|
||||
// Copyright (c) 2021, FOSS United and contributors
|
||||
// For license information, please see license.txt
|
||||
|
||||
frappe.ui.form.on('LMS Batch Membership', {
|
||||
// refresh: function(frm) {
|
||||
|
||||
// }
|
||||
});
|
||||
@@ -0,0 +1,68 @@
|
||||
{
|
||||
"actions": [],
|
||||
"creation": "2021-03-18 19:52:10.673835",
|
||||
"doctype": "DocType",
|
||||
"editable_grid": 1,
|
||||
"engine": "InnoDB",
|
||||
"field_order": [
|
||||
"batch",
|
||||
"member",
|
||||
"member_type",
|
||||
"role"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"fieldname": "batch",
|
||||
"fieldtype": "Link",
|
||||
"in_list_view": 1,
|
||||
"label": "Batch",
|
||||
"options": "LMS Batch"
|
||||
},
|
||||
{
|
||||
"fieldname": "member",
|
||||
"fieldtype": "Link",
|
||||
"in_list_view": 1,
|
||||
"label": "Member",
|
||||
"options": "Community Member"
|
||||
},
|
||||
{
|
||||
"fieldname": "member_type",
|
||||
"fieldtype": "Select",
|
||||
"in_list_view": 1,
|
||||
"label": "Member Type",
|
||||
"options": "\nStudent\nMentor\nStaff"
|
||||
},
|
||||
{
|
||||
"fieldname": "role",
|
||||
"fieldtype": "Select",
|
||||
"in_list_view": 1,
|
||||
"label": "Role",
|
||||
"options": "\nMember\nAdmin"
|
||||
}
|
||||
],
|
||||
"index_web_pages_for_search": 1,
|
||||
"links": [],
|
||||
"modified": "2021-03-19 15:06:21.374601",
|
||||
"modified_by": "Administrator",
|
||||
"module": "LMS",
|
||||
"name": "LMS Batch Membership",
|
||||
"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,
|
||||
"sort_field": "modified",
|
||||
"sort_order": "DESC",
|
||||
"track_changes": 1
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright (c) 2021, FOSS United and contributors
|
||||
# For license information, please see license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
from frappe.model.document import Document
|
||||
from frappe import _
|
||||
|
||||
class LMSBatchMembership(Document):
|
||||
|
||||
def validate(self):
|
||||
self.validate_membership_in_same_batch()
|
||||
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}, ["member_type","member"], as_dict=1)
|
||||
if previous_membership:
|
||||
member_name = frappe.db.get_value("Community Member", 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"])
|
||||
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")
|
||||
frappe.throw(_("{0} is already a {1} of {2} course through {3} batch").format(member_name, membership.member_type, course, membership.batch))
|
||||
@@ -0,0 +1,10 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright (c) 2021, FOSS United and Contributors
|
||||
# See license.txt
|
||||
from __future__ import unicode_literals
|
||||
|
||||
# import frappe
|
||||
import unittest
|
||||
|
||||
class TestLMSBatchMembership(unittest.TestCase):
|
||||
pass
|
||||
@@ -10,7 +10,10 @@
|
||||
"field_order": [
|
||||
"title",
|
||||
"description",
|
||||
"is_published"
|
||||
"section_break_3",
|
||||
"is_published",
|
||||
"column_break_5",
|
||||
"short_code"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
@@ -31,12 +34,25 @@
|
||||
"fieldname": "is_published",
|
||||
"fieldtype": "Check",
|
||||
"label": "Published"
|
||||
},
|
||||
{
|
||||
"fieldname": "short_code",
|
||||
"fieldtype": "Data",
|
||||
"label": "Short Code"
|
||||
},
|
||||
{
|
||||
"fieldname": "section_break_3",
|
||||
"fieldtype": "Section Break"
|
||||
},
|
||||
{
|
||||
"fieldname": "column_break_5",
|
||||
"fieldtype": "Column Break"
|
||||
}
|
||||
],
|
||||
"index_web_pages_for_search": 1,
|
||||
"is_published_field": "is_published",
|
||||
"links": [],
|
||||
"modified": "2021-03-05 11:01:09.327111",
|
||||
"modified": "2021-03-19 15:44:47.411705",
|
||||
"modified_by": "Administrator",
|
||||
"module": "LMS",
|
||||
"name": "LMS Course",
|
||||
|
||||
0
community/lms/doctype/lms_message/__init__.py
Normal file
0
community/lms/doctype/lms_message/__init__.py
Normal file
8
community/lms/doctype/lms_message/lms_message.js
Normal file
8
community/lms/doctype/lms_message/lms_message.js
Normal file
@@ -0,0 +1,8 @@
|
||||
// Copyright (c) 2021, FOSS United and contributors
|
||||
// For license information, please see license.txt
|
||||
|
||||
frappe.ui.form.on('LMS Message', {
|
||||
// refresh: function(frm) {
|
||||
|
||||
// }
|
||||
});
|
||||
63
community/lms/doctype/lms_message/lms_message.json
Normal file
63
community/lms/doctype/lms_message/lms_message.json
Normal file
@@ -0,0 +1,63 @@
|
||||
{
|
||||
"actions": [],
|
||||
"creation": "2021-03-19 12:19:32.355307",
|
||||
"doctype": "DocType",
|
||||
"editable_grid": 1,
|
||||
"engine": "InnoDB",
|
||||
"field_order": [
|
||||
"batch",
|
||||
"author",
|
||||
"message",
|
||||
"pin"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"fieldname": "batch",
|
||||
"fieldtype": "Link",
|
||||
"label": "Batch",
|
||||
"options": "LMS Batch"
|
||||
},
|
||||
{
|
||||
"fieldname": "author",
|
||||
"fieldtype": "Link",
|
||||
"label": "Author",
|
||||
"options": "Community Member"
|
||||
},
|
||||
{
|
||||
"fieldname": "message",
|
||||
"fieldtype": "Markdown Editor",
|
||||
"label": "Message"
|
||||
},
|
||||
{
|
||||
"default": "0",
|
||||
"fieldname": "pin",
|
||||
"fieldtype": "Check",
|
||||
"label": "Pin"
|
||||
}
|
||||
],
|
||||
"index_web_pages_for_search": 1,
|
||||
"links": [],
|
||||
"modified": "2021-03-22 13:57:50.500746",
|
||||
"modified_by": "Administrator",
|
||||
"module": "LMS",
|
||||
"name": "LMS Message",
|
||||
"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,
|
||||
"sort_field": "modified",
|
||||
"sort_order": "DESC",
|
||||
"track_changes": 1
|
||||
}
|
||||
10
community/lms/doctype/lms_message/lms_message.py
Normal file
10
community/lms/doctype/lms_message/lms_message.py
Normal file
@@ -0,0 +1,10 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright (c) 2021, FOSS United and contributors
|
||||
# For license information, please see license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
# import frappe
|
||||
from frappe.model.document import Document
|
||||
|
||||
class LMSMessage(Document):
|
||||
pass
|
||||
10
community/lms/doctype/lms_message/test_lms_message.py
Normal file
10
community/lms/doctype/lms_message/test_lms_message.py
Normal file
@@ -0,0 +1,10 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright (c) 2021, FOSS United and Contributors
|
||||
# See license.txt
|
||||
from __future__ import unicode_literals
|
||||
|
||||
# import frappe
|
||||
import unittest
|
||||
|
||||
class TestLMSMessage(unittest.TestCase):
|
||||
pass
|
||||
0
community/lms/web_form/__init__.py
Normal file
0
community/lms/web_form/__init__.py
Normal file
0
community/lms/web_form/add_messages/__init__.py
Normal file
0
community/lms/web_form/add_messages/__init__.py
Normal file
12
community/lms/web_form/add_messages/add_messages.js
Normal file
12
community/lms/web_form/add_messages/add_messages.js
Normal file
@@ -0,0 +1,12 @@
|
||||
frappe.ready(function() {
|
||||
// bind events here
|
||||
frappe.web_form.after_load = () => {
|
||||
frappe.web_form.set_value(["batch"], [frappe.utils.get_url_arg('batch')]);
|
||||
frappe.web_form.set_value(["author"], [frappe.utils.get_url_arg('author')]);
|
||||
}
|
||||
frappe.web_form.success_url = `courses/course?course=${frappe.utils.get_url_arg('course')}`;
|
||||
|
||||
$('.breadcrumb-container')
|
||||
.html(`<a href="${frappe.web_form.success_url}">Back to my course</a>`)
|
||||
.addClass('py-4');
|
||||
})
|
||||
77
community/lms/web_form/add_messages/add_messages.json
Normal file
77
community/lms/web_form/add_messages/add_messages.json
Normal file
@@ -0,0 +1,77 @@
|
||||
{
|
||||
"accept_payment": 0,
|
||||
"allow_comments": 0,
|
||||
"allow_delete": 0,
|
||||
"allow_edit": 0,
|
||||
"allow_incomplete": 0,
|
||||
"allow_multiple": 0,
|
||||
"allow_print": 0,
|
||||
"amount": 0.0,
|
||||
"amount_based_on_field": 0,
|
||||
"apply_document_permissions": 0,
|
||||
"button_label": "Send",
|
||||
"client_script": "",
|
||||
"creation": "2021-03-23 13:10:16.814983",
|
||||
"doc_type": "LMS Message",
|
||||
"docstatus": 0,
|
||||
"doctype": "Web Form",
|
||||
"idx": 0,
|
||||
"is_standard": 1,
|
||||
"login_required": 1,
|
||||
"max_attachment_size": 0,
|
||||
"modified": "2021-03-23 15:10:24.681090",
|
||||
"modified_by": "Administrator",
|
||||
"module": "LMS",
|
||||
"name": "add-messages",
|
||||
"owner": "Administrator",
|
||||
"payment_button_label": "Buy Now",
|
||||
"published": 1,
|
||||
"route": "add-messages",
|
||||
"route_to_success_link": 0,
|
||||
"show_attachments": 0,
|
||||
"show_in_grid": 0,
|
||||
"show_sidebar": 0,
|
||||
"sidebar_items": [],
|
||||
"success_url": "",
|
||||
"title": "Add Messages",
|
||||
"web_form_fields": [
|
||||
{
|
||||
"allow_read_on_all_link_options": 0,
|
||||
"fieldname": "batch",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
"label": "Batch",
|
||||
"max_length": 0,
|
||||
"max_value": 0,
|
||||
"options": "LMS Batch",
|
||||
"read_only": 1,
|
||||
"reqd": 0,
|
||||
"show_in_filter": 0
|
||||
},
|
||||
{
|
||||
"allow_read_on_all_link_options": 0,
|
||||
"fieldname": "message",
|
||||
"fieldtype": "Data",
|
||||
"hidden": 0,
|
||||
"label": "Message",
|
||||
"max_length": 0,
|
||||
"max_value": 0,
|
||||
"read_only": 0,
|
||||
"reqd": 0,
|
||||
"show_in_filter": 0
|
||||
},
|
||||
{
|
||||
"allow_read_on_all_link_options": 0,
|
||||
"fieldname": "author",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 1,
|
||||
"label": "Author",
|
||||
"max_length": 0,
|
||||
"max_value": 0,
|
||||
"options": "Community Member",
|
||||
"read_only": 1,
|
||||
"reqd": 0,
|
||||
"show_in_filter": 0
|
||||
}
|
||||
]
|
||||
}
|
||||
7
community/lms/web_form/add_messages/add_messages.py
Normal file
7
community/lms/web_form/add_messages/add_messages.py
Normal file
@@ -0,0 +1,7 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import frappe
|
||||
|
||||
def get_context(context):
|
||||
# do your magic here
|
||||
pass
|
||||
@@ -9,7 +9,7 @@
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<section class="top-section" style="padding: 1rem 0rem;">
|
||||
<section class="top-section container" style="padding: 1rem 0rem;">
|
||||
<div class='container pb-5'>
|
||||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb">
|
||||
@@ -18,15 +18,56 @@
|
||||
</nav>
|
||||
<div class="badge badge-info enrollment-badge hide">Enrolled</div>
|
||||
<div>
|
||||
{% if not course_enrolled and frappe.session.user != "Guest" %}
|
||||
<!-- {% if not course_enrolled and frappe.session.user != "Guest" %}
|
||||
<button class="btn btn-dark btn-enroll float-right" data-course="{{ course.name }}">Enroll</button>
|
||||
{% endif %}
|
||||
{% endif %} -->
|
||||
<h1>{{ course.title }}</h1>
|
||||
</div>
|
||||
<div>{{ frappe.utils.md_to_html(course.description) }}</div>
|
||||
|
||||
<ul class="nav nav-tabs mt-4" id="myTab" role="tablist">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link active" id="home-tab" data-toggle="tab" href="#home" role="tab" aria-controls="home"
|
||||
aria-selected="true">Course Details</a>
|
||||
</li>
|
||||
{% if discussions %}
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" id="discussions-tab" data-toggle="tab" href="#discussions" role="tab" aria-controls="discussions"
|
||||
aria-selected="false">Discussions</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</div>
|
||||
<div class="tab-content">
|
||||
<div class="tab-pane fade py-4 show active" role="tabpanel" id="home">
|
||||
<div>{{ frappe.utils.md_to_html(course.description) }}</div>
|
||||
</div>
|
||||
<div class="tab-pane fade py-4" role="tabpanel" id="discussions">
|
||||
<div>
|
||||
{% if batches %}
|
||||
<div class="d-inline-block">
|
||||
<select id="batches-dropdown" class="m-5">
|
||||
{% for batch in batches %}
|
||||
<option value="{{batch}}">{{ batch }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if discussions %}
|
||||
<p class="d-inline-block float-right add-message">
|
||||
<a href="/add-messages?new=1&batch={{ current_batch }}&author={{ author }}&course={{ course.title }}" class="btn btn-secondary btn-sm">Add Message</a>
|
||||
</p>
|
||||
<div class="discussions">
|
||||
{% for message in discussions %}
|
||||
<div class="list-group-item">
|
||||
<h6>{{ message.author }}</h6>
|
||||
{{ message.message }}
|
||||
<div class="small text-muted text-right">{{ message.creation }}</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class='container'>
|
||||
<div class="list-group">
|
||||
{% for topic in course.topics %}
|
||||
|
||||
@@ -1,13 +1,34 @@
|
||||
frappe.ready(() => {
|
||||
if(frappe.session.user != "Guest"){
|
||||
var dropdown = document.getElementById("batches-dropdown")
|
||||
if (dropdown) {
|
||||
dropdown.onchange = () => {
|
||||
frappe.call("community.www.courses.course.get_messages", {batch: dropdown.value}, (data) => {
|
||||
var href_params = new URLSearchParams($(".add-message").children("a")[0].href)
|
||||
$(".add-message").children("a")[0].href = `/add-messages?new=1&batch=${dropdown.value}&author=${href_params.get("author")}&course=${href_params.get("course")}`
|
||||
if(data.message){
|
||||
$(".discussions").children().remove()
|
||||
for (var i = 0; i < data.message.length; i++) {
|
||||
var message = data.message[i]
|
||||
var element = `<div class="list-group-item">
|
||||
<h6> ${message.author} </h6>
|
||||
${ message.message }
|
||||
<div class="small text-muted text-right"> ${ message.creation } </div>
|
||||
</div>`
|
||||
$(".discussions").append(element)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
/* if(frappe.session.user != "Guest"){
|
||||
frappe.call('community.www.courses.course.has_enrolled', { course: get_search_params().get("course") }, (data) => {
|
||||
if (data.message) {
|
||||
show_enrollment_badge()
|
||||
}
|
||||
})
|
||||
}
|
||||
} */
|
||||
})
|
||||
|
||||
/*
|
||||
var show_enrollment_badge = () => {
|
||||
$(".btn-enroll").addClass("hide");
|
||||
$(".enrollment-badge").removeClass("hide");
|
||||
@@ -21,5 +42,5 @@ $('.btn-enroll').on('click', (e) => {
|
||||
frappe.call('community.www.courses.course.enroll', { course: get_search_params().get("course") }, (data) => {
|
||||
show_enrollment_badge()
|
||||
});
|
||||
});
|
||||
}); */
|
||||
|
||||
|
||||
@@ -8,7 +8,13 @@ def get_context(context):
|
||||
frappe.local.flags.redirect_location = '/courses'
|
||||
raise frappe.Redirect
|
||||
context.course = get_course(course_id)
|
||||
context.course_enrolled = has_enrolled(course_id)
|
||||
#context.course_enrolled = has_enrolled(course_id)
|
||||
context.discussions, context.memberships = get_discussions(course_id)
|
||||
context.member_type = context.memberships[0].member_type
|
||||
if context.member_type != "Student":
|
||||
context.batches = [membership.batch for membership in context.memberships]
|
||||
context.current_batch = context.memberships[0].batch
|
||||
context.author = context.memberships[0].member
|
||||
|
||||
def get_course(name):
|
||||
course = frappe.db.get_value('LMS Course', name,
|
||||
@@ -22,9 +28,34 @@ def get_course(name):
|
||||
)
|
||||
return course
|
||||
|
||||
def get_discussions(course):
|
||||
memberships = get_membership(course)
|
||||
messages = get_messages(memberships[0].batch)
|
||||
return messages, memberships
|
||||
|
||||
def get_membership(course):
|
||||
memberships = []
|
||||
member = frappe.db.get_value("Community Member", {"email": frappe.session.user}, "name")
|
||||
batches = frappe.get_all("LMS Batch", {"course": course}, ["name"])
|
||||
for batch in batches:
|
||||
membership = frappe.db.get_value("LMS Batch Membership", {"member": member, "batch": batch.name}, ["batch", "member", "member_type"], as_dict=1)
|
||||
if membership:
|
||||
memberships.append(membership)
|
||||
return memberships
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_messages(batch):
|
||||
messages = frappe.get_all("LMS Message", {"batch": batch}, ["*"], order_by="creation desc")
|
||||
for message in messages:
|
||||
message.message = frappe.utils.md_to_html(message.message)
|
||||
message.creation = frappe.utils.format_datetime(message.creation, "medium")
|
||||
member_email = frappe.db.get_value("Community Member", message.author, "email")
|
||||
if member_email == frappe.session.user:
|
||||
message.author = "You"
|
||||
return messages
|
||||
|
||||
@frappe.whitelist()
|
||||
def has_enrolled(course):
|
||||
print(frappe.db)
|
||||
return frappe.db.get_value("LMS Course Enrollment", {"course": course, "owner": frappe.session.user})
|
||||
|
||||
@frappe.whitelist()
|
||||
|
||||
Reference in New Issue
Block a user