diff --git a/community/community/doctype/community_course_enrollment/__init__.py b/community/community/doctype/community_course_enrollment/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/community/community/doctype/community_course_enrollment/community_course_enrollment.js b/community/community/doctype/community_course_enrollment/community_course_enrollment.js
new file mode 100644
index 00000000..9eaf784d
--- /dev/null
+++ b/community/community/doctype/community_course_enrollment/community_course_enrollment.js
@@ -0,0 +1,8 @@
+// Copyright (c) 2021, Frappe and contributors
+// For license information, please see license.txt
+
+frappe.ui.form.on('Community Course Enrollment', {
+ // refresh: function(frm) {
+
+ // }
+});
diff --git a/community/community/doctype/community_course_enrollment/community_course_enrollment.json b/community/community/doctype/community_course_enrollment/community_course_enrollment.json
new file mode 100644
index 00000000..c0b8cb21
--- /dev/null
+++ b/community/community/doctype/community_course_enrollment/community_course_enrollment.json
@@ -0,0 +1,54 @@
+{
+ "actions": [],
+ "creation": "2021-03-03 11:24:08.220185",
+ "doctype": "DocType",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "field_order": [
+ "course"
+ ],
+ "fields": [
+ {
+ "fieldname": "course",
+ "fieldtype": "Link",
+ "label": "Course",
+ "options": "Community Course"
+ }
+ ],
+ "index_web_pages_for_search": 1,
+ "links": [],
+ "modified": "2021-03-03 11:44:32.011805",
+ "modified_by": "Administrator",
+ "module": "Community",
+ "name": "Community Course Enrollment",
+ "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": "Student",
+ "share": 1,
+ "write": 1
+ }
+ ],
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "track_changes": 1
+}
\ No newline at end of file
diff --git a/community/community/doctype/community_course_enrollment/community_course_enrollment.py b/community/community/doctype/community_course_enrollment/community_course_enrollment.py
new file mode 100644
index 00000000..32025965
--- /dev/null
+++ b/community/community/doctype/community_course_enrollment/community_course_enrollment.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2021, Frappe and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+# import frappe
+from frappe.model.document import Document
+
+class CommunityCourseEnrollment(Document):
+ pass
diff --git a/community/community/doctype/community_course_enrollment/test_community_course_enrollment.py b/community/community/doctype/community_course_enrollment/test_community_course_enrollment.py
new file mode 100644
index 00000000..3cec732d
--- /dev/null
+++ b/community/community/doctype/community_course_enrollment/test_community_course_enrollment.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2021, Frappe and Contributors
+# See license.txt
+from __future__ import unicode_literals
+
+# import frappe
+import unittest
+
+class TestCommunityCourseEnrollment(unittest.TestCase):
+ pass
diff --git a/community/community/doctype/community_course_member/community_course_member.json b/community/community/doctype/community_course_member/community_course_member.json
index 2306cbb8..f945a918 100644
--- a/community/community/doctype/community_course_member/community_course_member.json
+++ b/community/community/doctype/community_course_member/community_course_member.json
@@ -41,7 +41,8 @@
"fieldname": "email",
"fieldtype": "Data",
"label": "Email",
- "options": "Email"
+ "options": "Email",
+ "reqd": 1
},
{
"fieldname": "short_intro",
@@ -68,7 +69,7 @@
"index_web_pages_for_search": 1,
"is_published_field": "enabled",
"links": [],
- "modified": "2021-03-02 17:53:40.252130",
+ "modified": "2021-03-03 15:00:46.298535",
"modified_by": "Administrator",
"module": "Community",
"name": "Community Course Member",
@@ -88,7 +89,7 @@
}
],
"quick_entry": 1,
- "route": "username",
+ "route": "me",
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 1
diff --git a/community/community/doctype/community_course_member/community_course_member.py b/community/community/doctype/community_course_member/community_course_member.py
index 78502c96..2ee58255 100644
--- a/community/community/doctype/community_course_member/community_course_member.py
+++ b/community/community/doctype/community_course_member/community_course_member.py
@@ -9,10 +9,15 @@ 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 = "username/" + self.user_name
+ self.route = "me/" + self.user_name
def validate_user_name(self):
if len(self.user_name) < 4:
@@ -55,7 +60,7 @@ class CommunityCourseMember(WebsiteGenerator):
"username": self.user_name,
"send_welcome_email": 0,
"user_type": 'Website User',
- "redirect_url": "username/" + self.name
+ "redirect_url": "me/" + self.name
})
user.save(ignore_permissions=True)
update_password_link = user.reset_password()
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
index f22d535c..fabec4d2 100644
--- a/community/community/doctype/community_course_member/templates/community_course_member.html
+++ b/community/community/doctype/community_course_member/templates/community_course_member.html
@@ -1,14 +1,23 @@
{% 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 %}
diff --git a/community/community/web_form/community_course_membership/community_course_membership.json b/community/community/web_form/community_course_membership/community_course_membership.json
index 288eefc7..dadd267f 100644
--- a/community/community/web_form/community_course_membership/community_course_membership.json
+++ b/community/community/web_form/community_course_membership/community_course_membership.json
@@ -18,7 +18,7 @@
"is_standard": 1,
"login_required": 0,
"max_attachment_size": 0,
- "modified": "2021-03-02 11:31:39.072501",
+ "modified": "2021-03-03 11:02:33.907687",
"modified_by": "Administrator",
"module": "Community",
"name": "community-course-membership",
@@ -70,42 +70,6 @@
"read_only": 0,
"reqd": 0,
"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/hooks.py b/community/hooks.py
index 0ca9b22f..c82a8a66 100644
--- a/community/hooks.py
+++ b/community/hooks.py
@@ -4,19 +4,18 @@ from . import __version__ as app_version
app_name = "community"
app_title = "Community"
-app_publisher = "Frappe"
+app_publisher = "FOSS United"
app_description = "Community App"
app_icon = "octicon octicon-file-directory"
app_color = "grey"
app_email = "jannat@erpnext.com"
-app_license = "MIT"
-
+app_license = "AGPL"
# Includes in
# ------------------
# include js, css files in header of desk.html
-# app_include_css = "/assets/community/css/community.css"
-# app_include_js = "/assets/community/js/community.js"
+app_include_css = "/assets/community/css/community.css"
+app_include_js = "/assets/community/js/community.js"
# include js, css files in header of web template
# web_include_css = "/assets/community/css/community.css"
diff --git a/community/www/courses/course.html b/community/www/courses/course.html
index 43077b2e..56965fa8 100644
--- a/community/www/courses/course.html
+++ b/community/www/courses/course.html
@@ -2,10 +2,10 @@
{% block title %}{{ 'Courses' }}{% endblock %}
{% from "www/courses/macros/card.html" import course_card, topic_card %}
{% block head_include %}
-
-
-
+
+
+
{% endblock %}
{% block content %}
@@ -13,22 +13,32 @@
-
{{ course.title }}
-
-
{{ course.description }}
+ {% if course_enrolled %}
+
+
Enrolled
+
+ {% endif %}
+
+ {% if not course_enrolled %}
+
+ {% endif %}
+
{{ course.title }}
+
+
{{ frappe.utils.md_to_html(course.description) }}
+
- {% for topic in course.topics %}
+ {% for topic in course.topics %}
- {% endfor %}
+ {% endfor %}
diff --git a/community/www/courses/course.js b/community/www/courses/course.js
new file mode 100644
index 00000000..87c7c869
--- /dev/null
+++ b/community/www/courses/course.js
@@ -0,0 +1,17 @@
+/* frappe.ready(() => {
+ var url_params = new URLSearchParams(window.location.search);
+ frappe.call('community.www.courses.course.has_enrolled', { course: url_params.get("course") }, (data) => {
+ if (data.message) {
+ $(".btn-enroll").addClass("hide");
+ $(".enrollment-details").removeClass("hide");
+ }
+ })
+}) */
+
+$('.btn-enroll').on('click', (e) => {
+ frappe.call('community.www.courses.course.enroll', { course: $(e.target).attr("data-course") }, (data) => {
+ $(".btn-enroll").addClass("hide");
+ $(".enrollment-details").removeClass("hide");
+ });
+});
+
diff --git a/community/www/courses/course.py b/community/www/courses/course.py
index 13426bea..6c470002 100644
--- a/community/www/courses/course.py
+++ b/community/www/courses/course.py
@@ -1,23 +1,35 @@
import frappe
def get_context(context):
- context.no_cache = 1
- try:
- course_id = frappe.form_dict['course']
- except KeyError:
- frappe.local.flags.redirect_location = '/courses'
- raise frappe.Redirect
- context.course = get_course(course_id)
+ context.no_cache = 1
+ try:
+ course_id = frappe.form_dict['course']
+ except KeyError:
+ frappe.local.flags.redirect_location = '/courses'
+ raise frappe.Redirect
+ context.course = get_course(course_id)
+ context.course_enrolled = has_enrolled(course_id)
def get_course(name):
- course = frappe.db.get_value('Community Course', name,
- ['name', 'title', 'description'], as_dict=1)
- course['topics'] = frappe.db.get_all('Community Course Topic',
- filters={
- 'course': name
- },
- fields=['name', 'title', 'description'],
- order_by='creation'
- )
- print(course)
- return course
\ No newline at end of file
+ course = frappe.db.get_value('Community Course', name,
+ ['name', 'title', 'description'], as_dict=1)
+ course['topics'] = frappe.db.get_all('Community Course Topic',
+ filters={
+ 'course': name
+ },
+ fields=['name', 'title', 'description'],
+ order_by='creation'
+ )
+ return course
+
+def has_enrolled(course):
+ return frappe.db.get_value("Community Course Enrollment", {"course": course, "owner": frappe.session.user})
+
+@frappe.whitelist()
+def enroll(course):
+ return frappe.get_doc({
+ "doctype": "Community Course Enrollment",
+ "course": course
+ }).save()
+
+
\ No newline at end of file
diff --git a/community/www/courses/macros/card.html b/community/www/courses/macros/card.html
index 9a3257a1..49b3ffff 100644
--- a/community/www/courses/macros/card.html
+++ b/community/www/courses/macros/card.html
@@ -2,8 +2,8 @@
-
{{course.description}}
-
See more →
+
{{ frappe.utils.md_to_html(course.description[:250]) }}
+
See more →
{% endmacro %}
diff --git a/community/www/jannat.html b/community/www/jannat.html
deleted file mode 100644
index 26ab1e3c..00000000
--- a/community/www/jannat.html
+++ /dev/null
@@ -1 +0,0 @@
-jannat
\ No newline at end of file
diff --git a/community/www/my-courses/index.html b/community/www/my-courses/index.html
new file mode 100644
index 00000000..22f194d2
--- /dev/null
+++ b/community/www/my-courses/index.html
@@ -0,0 +1,67 @@
+{% extends "templates/base.html" %}
+{% from "www/hackathons/macros/card.html" import null_card %}
+
+{% block title %}{{ 'My Courses' }}{% endblock %}
+{% block head_include %}
+
+
+
+{% endblock %}
+
+{% macro card(course) %}
+
+{% endmacro %}
+
+{% block content %}
+
+
+
+ {% for course in my_courses %}
+ {{ card(course) }}
+ {% endfor %}
+ {% if my_courses %}
+ {% for n in range( (3 - (my_courses|length)) %3) %}
+ {{ null_card() }}
+ {% endfor %}
+ {% endif %}
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/community/www/my-courses/index.py b/community/www/my-courses/index.py
new file mode 100644
index 00000000..c40c8ecd
--- /dev/null
+++ b/community/www/my-courses/index.py
@@ -0,0 +1,15 @@
+import frappe
+
+def get_context(context):
+ context.no_cache = 1
+ context.my_courses = get_my_courses()
+
+def get_my_courses():
+ my_courses = []
+ courses = frappe.get_all("Community Course Enrollment", {"owner": frappe.session.user}, ["course"])
+ for course in courses:
+ my_courses.append({
+ "name": course.course,
+ "title": frappe.db.get_value("Community Course", course.course, ["title"])
+ })
+ return my_courses
\ No newline at end of file