diff --git a/school/lms/api.py b/school/lms/api.py index fac39d52..46518a76 100644 --- a/school/lms/api.py +++ b/school/lms/api.py @@ -70,3 +70,41 @@ def join_cohort(course, cohort, subgroup, invite_code): doc = frappe.get_doc(data) doc.insert(ignore_permissions=True) return {"ok": True} + +@frappe.whitelist() +def approve_cohort_join_request(join_request): + r = frappe.get_doc("Cohort Join Request", join_request) + sg = r and frappe.get_doc("Cohort Subgroup", r.subgroup) + if not sg or r.status not in ["Pending", "Accepted"]: + return { + "ok": False, + "error": "Invalid Join Request" + } + if not sg.is_manager(frappe.session.user): + return { + "ok": False, + "error": "Permission Deined" + } + + r.status = "Accepted" + r.save(ignore_permissions=True) + return {"ok": True} + +@frappe.whitelist() +def reject_cohort_join_request(join_request): + r = frappe.get_doc("Cohort Join Request", join_request) + sg = r and frappe.get_doc("Cohort Subgroup", r.subgroup) + if not sg or r.status not in ["Pending", "Rejected"]: + return { + "ok": False, + "error": "Invalid Join Request" + } + if not sg.is_manager(frappe.session.user): + return { + "ok": False, + "error": "Permission Deined" + } + + r.status = "Rejected" + r.save(ignore_permissions=True) + return {"ok": True} diff --git a/school/lms/doctype/cohort_join_request/cohort_join_request.py b/school/lms/doctype/cohort_join_request/cohort_join_request.py index 984096ab..dde1f60f 100644 --- a/school/lms/doctype/cohort_join_request/cohort_join_request.py +++ b/school/lms/doctype/cohort_join_request/cohort_join_request.py @@ -1,7 +1,7 @@ # Copyright (c) 2021, FOSS United and contributors # For license information, please see license.txt -# import frappe +import frappe from frappe.model.document import Document class CohortJoinRequest(Document): @@ -10,4 +10,25 @@ class CohortJoinRequest(Document): self.ensure_student() def ensure_student(self): - pass + q = { + "doctype": "LMS Batch Membership", + "cohort": self.cohort, + "subgroup": self.subgroup, + "email": self.email + } + if frappe.db.exists(q): + return + + cohort = frappe.get_doc("Cohort", self.cohort) + + data = { + "doctype": "LMS Batch Membership", + "course": cohort.course, + "cohort": self.cohort, + "subgroup": self.subgroup, + "member": self.email, + "member_type": "Student", + "role": "Member" + } + doc = frappe.get_doc(data) + doc.insert(ignore_permissions=True) diff --git a/school/lms/doctype/cohort_subgroup/cohort_subgroup.py b/school/lms/doctype/cohort_subgroup/cohort_subgroup.py index 42d28ad2..aa675206 100644 --- a/school/lms/doctype/cohort_subgroup/cohort_subgroup.py +++ b/school/lms/doctype/cohort_subgroup/cohort_subgroup.py @@ -57,5 +57,15 @@ class CohortSubgroup(Document): } return frappe.db.exists(q) + def is_manager(self, email): + """Returns True if the given user is a manager of this subgroup. + + Mentors of the subgroup, admins of the Cohort are considered as managers. + """ + return self.is_mentor(email) or self.get_cohort().is_admin(email) + + def get_cohort(self): + return frappe.get_doc("Cohort", self.cohort) + #def after_doctype_insert(): # frappe.db.add_unique("Cohort Subgroup", ("cohort", "slug")) diff --git a/school/www/cohorts/subgroup.html b/school/www/cohorts/subgroup.html index c1b6f164..ea9be393 100644 --- a/school/www/cohorts/subgroup.html +++ b/school/www/cohorts/subgroup.html @@ -59,6 +59,8 @@ {% macro render_join_requests() %} + {% set join_requests = subgroup.get_join_requests() %} + {% if join_requests %} @@ -78,6 +80,9 @@ {% endfor %}
#
+ {% else %} + There are no pending join requests. + {% endif %} {% endmacro %} {% macro render_navitem(title, link, count, active) %} @@ -118,7 +123,7 @@ $(function() { frappe.confirm( `Are you sure to accept ${email} to this subgroup?`, function() { - console.log("approve", name); + run_action("school.lms.api.approve_cohort_join_request", name); } ); }); @@ -127,10 +132,23 @@ $(function() { var name = $(this).parent().data("name"); var email = $(this).parent().data("email"); frappe.confirm(`Are you sure to reject ${email} from joining this subgroup?`, function() { - console.log("reject", name); + run_action("school.lms.api.reject_cohort_join_request", name); }); }); + function run_action(method, join_request) { + frappe.call(method, { + join_request: join_request, + }) + .then(r => { + if (r.message.ok) { + window.location.reload(); + } + else { + frappe.msgprint(r.message.error); + } + }); + } }); {% endblock %}