From f1157895dbec3f21a1237bc52cd9dac897b7a43b Mon Sep 17 00:00:00 2001 From: Anand Chitipothu Date: Tue, 30 Nov 2021 08:29:24 +0530 Subject: [PATCH] feat: added portal page to join a cohort Issue #271 --- school/hooks.py | 1 + school/lms/api.py | 25 ++++++ school/lms/doctype/lms_course/lms_course.py | 4 + school/www/cohorts/join.html | 88 +++++++++++++++++++++ school/www/cohorts/join.py | 24 ++++++ 5 files changed, 142 insertions(+) create mode 100644 school/www/cohorts/join.html create mode 100644 school/www/cohorts/join.py diff --git a/school/hooks.py b/school/hooks.py index 7eaed275..7c217970 100644 --- a/school/hooks.py +++ b/school/hooks.py @@ -146,6 +146,7 @@ website_route_rules = [ {"from_route": "/courses//subgroups//", "to_route": "cohorts/subgroup", "defaults": {"page": "info"}}, {"from_route": "/courses//subgroups///students", "to_route": "cohorts/subgroup", "defaults": {"page": "students"}}, {"from_route": "/courses//subgroups///join-requests", "to_route": "cohorts/subgroup", "defaults": {"page": "join-requests"}}, + {"from_route": "/courses//join///", "to_route": "cohorts/join"}, {"from_route": "/users", "to_route": "profiles/profile"} ] diff --git a/school/lms/api.py b/school/lms/api.py index b60d2d13..fac39d52 100644 --- a/school/lms/api.py +++ b/school/lms/api.py @@ -45,3 +45,28 @@ def save_current_lesson(course_name, lesson_name): doc.current_lesson = lesson_name doc.save(ignore_permissions=True) return {"current_lesson": doc.current_lesson} + + +@frappe.whitelist() +def join_cohort(course, cohort, subgroup, invite_code): + """Creates a Cohort Join Request for given user. + """ + course_doc = frappe.get_doc("LMS Course", course) + cohort_doc = course_doc and course_doc.get_cohort(cohort) + subgroup_doc = cohort_doc and cohort_doc.get_subgroup(subgroup) + + if not subgroup_doc or subgroup_doc.invite_code != invite_code: + return { + "ok": False, + "error": "Invalid join link" + } + + data = { + "doctype": "Cohort Join Request", + "cohort": cohort_doc.name, + "subgroup": subgroup_doc.name, + "email": frappe.session.user + } + doc = frappe.get_doc(data) + doc.insert(ignore_permissions=True) + return {"ok": True} diff --git a/school/lms/doctype/lms_course/lms_course.py b/school/lms/doctype/lms_course/lms_course.py index 6815dd6e..9562445c 100644 --- a/school/lms/doctype/lms_course/lms_course.py +++ b/school/lms/doctype/lms_course/lms_course.py @@ -213,6 +213,10 @@ class LMSCourse(Document): def get_cohorts(self): return find_all("Cohort", course=self.name, order_by="creation") + def get_cohort(self, cohort_slug): + name = frappe.get_value("Cohort", {"course": self.name, "slug": cohort_slug}) + return name and frappe.get_doc("Cohort", name) + def is_cohort_staff(self, user_email): """Returns True if the user is either a mentor or a staff for one or more active cohorts of this course. """ diff --git a/school/www/cohorts/join.html b/school/www/cohorts/join.html new file mode 100644 index 00000000..a31ecc63 --- /dev/null +++ b/school/www/cohorts/join.html @@ -0,0 +1,88 @@ +{% extends "www/cohorts/base.html" %} + +{% block title %}Join Course{% endblock %} + +{% block page_content %} + +

Join Course

+ +

+ Course: {{course.title}} +

+

+ Cohort: {{cohort.title}} +

+

+ Subgroup: {{subgroup.title}} +

+ +{% if frappe.session.user == "Guest" %} + +
+

+ Please login to be able to join the course.

+ +

+ If you don't already have an account, you can sign up for a new account. +

+ Login to continue +
+{% elif subgroup.has_student(frappe.session.user) %} +
+

You are already a student of this course.

+ Go to the course +
+{% elif subgroup.has_join_request(frappe.session.user) %} +
+

We have received your request to join the course. You'll hear back from us soon.

+
+{% else %} + +Join the course + +{% endif %} + +{% endblock %} + +{% block script %} + + + +{% endblock %} diff --git a/school/www/cohorts/join.py b/school/www/cohorts/join.py new file mode 100644 index 00000000..4b6368a3 --- /dev/null +++ b/school/www/cohorts/join.py @@ -0,0 +1,24 @@ +import frappe +from . import utils + +def get_context(context): + context.no_cache = 1 + + course = utils.get_course(frappe.form_dict["course"]) + cohort = course and utils.get_cohort(course, frappe.form_dict["cohort"]) + subgroup = cohort and utils.get_subgroup(cohort, frappe.form_dict["subgroup"]) + if not subgroup: + context.template = "www/404.html" + return + + invite_code = frappe.form_dict["invite_code"] + if subgroup.invite_code != invite_code: + context.template = "www/404.html" + return + + utils.add_nav(context, "All Courses", "/courses") + utils.add_nav(context, course.title, "/courses/" + course.name) + + context.course = course + context.cohort = cohort + context.subgroup = subgroup