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 %}
{{ full_name }}
+ {% else %} +
+
{{ abbr }}
+
+ {% 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 %}
{{topic.title}}
{{topic.description}}
- {% 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.title}}
-

{{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) %} +
+ +
+
+
{{ course.title }}
+
+
+
+
+{% 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