feat: reorder courses and students view for programs
This commit is contained in:
@@ -34,7 +34,7 @@
|
||||
],
|
||||
"index_web_pages_for_search": 1,
|
||||
"links": [],
|
||||
"modified": "2024-11-18 14:08:26.958831",
|
||||
"modified": "2024-11-20 12:26:02.214628",
|
||||
"modified_by": "Administrator",
|
||||
"module": "LMS",
|
||||
"name": "LMS Program",
|
||||
@@ -52,6 +52,30 @@
|
||||
"role": "System Manager",
|
||||
"share": 1,
|
||||
"write": 1
|
||||
},
|
||||
{
|
||||
"create": 1,
|
||||
"delete": 1,
|
||||
"email": 1,
|
||||
"export": 1,
|
||||
"print": 1,
|
||||
"read": 1,
|
||||
"report": 1,
|
||||
"role": "Moderator",
|
||||
"share": 1,
|
||||
"write": 1
|
||||
},
|
||||
{
|
||||
"create": 1,
|
||||
"delete": 1,
|
||||
"email": 1,
|
||||
"export": 1,
|
||||
"print": 1,
|
||||
"read": 1,
|
||||
"report": 1,
|
||||
"role": "Course Creator",
|
||||
"share": 1,
|
||||
"write": 1
|
||||
}
|
||||
],
|
||||
"sort_field": "creation",
|
||||
|
||||
@@ -1,9 +1,108 @@
|
||||
# Copyright (c) 2024, Frappe and contributors
|
||||
# For license information, please see license.txt
|
||||
|
||||
# import frappe
|
||||
import frappe
|
||||
from frappe import _
|
||||
from frappe.model.document import Document
|
||||
|
||||
|
||||
class LMSProgram(Document):
|
||||
pass
|
||||
def validate(self):
|
||||
self.validate_program_courses()
|
||||
self.validate_program_members()
|
||||
|
||||
def on_update(self):
|
||||
self.manage_acccess()
|
||||
|
||||
def manage_acccess(self):
|
||||
old_doc = self.get_doc_before_save()
|
||||
|
||||
if not old_doc:
|
||||
return
|
||||
|
||||
previous_courses = [row.course for row in old_doc.program_courses]
|
||||
current_courses = [row.course for row in self.program_courses]
|
||||
|
||||
print("previous_courses", previous_courses)
|
||||
print("current_courses", current_courses)
|
||||
|
||||
previous_members = [row.member for row in old_doc.program_members]
|
||||
current_members = [row.member for row in self.program_members]
|
||||
|
||||
print("previous_members", previous_members)
|
||||
print("current_members", current_members)
|
||||
|
||||
courses_added = [
|
||||
course for course in current_courses if course not in previous_courses
|
||||
]
|
||||
courses_removed = [
|
||||
course for course in previous_courses if course not in current_courses
|
||||
]
|
||||
|
||||
members_added = [
|
||||
member for member in current_members if member not in previous_members
|
||||
]
|
||||
members_removed = [
|
||||
member for member in previous_members if member not in current_members
|
||||
]
|
||||
|
||||
print(courses_removed)
|
||||
print(members_removed)
|
||||
|
||||
if len(courses_added) > 0:
|
||||
self.grant_program_access(current_members, courses_added)
|
||||
|
||||
if len(courses_removed) > 0:
|
||||
print(courses_removed)
|
||||
self.revoke_program_access(current_members, courses_removed)
|
||||
|
||||
if len(members_added) > 0:
|
||||
self.grant_program_access(members_added, current_courses)
|
||||
|
||||
if len(members_removed) > 0:
|
||||
print(members_removed)
|
||||
self.revoke_program_access(members_removed, current_courses)
|
||||
|
||||
def grant_program_access(self, members, courses):
|
||||
for course in courses:
|
||||
for member in members:
|
||||
enrollment = frappe.db.exists(
|
||||
"LMS Enrollment", {"course": course, "member": member}
|
||||
)
|
||||
if not enrollment:
|
||||
enrollment = frappe.new_doc("LMS Enrollment")
|
||||
enrollment.course = course
|
||||
enrollment.member = member
|
||||
enrollment.insert()
|
||||
|
||||
def revoke_program_access(self, members, courses):
|
||||
for course in courses:
|
||||
print(course)
|
||||
for member in members:
|
||||
print(member)
|
||||
enrollment = frappe.db.exists(
|
||||
"LMS Enrollment", {"course": course, "member": member}
|
||||
)
|
||||
print(enrollment)
|
||||
if enrollment:
|
||||
frappe.delete_doc("LMS Enrollment", enrollment)
|
||||
|
||||
def validate_program_courses(self):
|
||||
courses = [row.course for row in self.program_courses]
|
||||
duplicates = {course for course in courses if courses.count(course) > 1}
|
||||
if len(duplicates):
|
||||
frappe.throw(
|
||||
_("Course {0} has already been added to this batch.").format(
|
||||
frappe.bold(next(iter(duplicates)))
|
||||
)
|
||||
)
|
||||
|
||||
def validate_program_members(self):
|
||||
members = [row.member for row in self.program_members]
|
||||
duplicates = {member for member in members if members.count(member) > 1}
|
||||
if len(duplicates):
|
||||
frappe.throw(
|
||||
_("Member {0} has already been added to this batch.").format(
|
||||
frappe.bold(next(iter(duplicates)))
|
||||
)
|
||||
)
|
||||
|
||||
@@ -356,7 +356,7 @@
|
||||
"index_web_pages_for_search": 1,
|
||||
"issingle": 1,
|
||||
"links": [],
|
||||
"modified": "2024-11-18 12:52:41.236252",
|
||||
"modified": "2024-11-20 11:55:05.358421",
|
||||
"modified_by": "Administrator",
|
||||
"module": "LMS",
|
||||
"name": "LMS Settings",
|
||||
@@ -371,6 +371,13 @@
|
||||
"role": "System Manager",
|
||||
"share": 1,
|
||||
"write": 1
|
||||
},
|
||||
{
|
||||
"email": 1,
|
||||
"print": 1,
|
||||
"read": 1,
|
||||
"role": "LMS Student",
|
||||
"share": 1
|
||||
}
|
||||
],
|
||||
"sort_field": "modified",
|
||||
|
||||
@@ -1751,3 +1751,29 @@ def enroll_in_batch(batch, payment_name=None):
|
||||
)
|
||||
|
||||
student.save(ignore_permissions=True)
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_programs():
|
||||
if (
|
||||
has_course_moderator_role()
|
||||
or has_course_instructor_role()
|
||||
or has_course_evaluator_role()
|
||||
):
|
||||
programs = frappe.get_all("LMS Program", fields=["name"])
|
||||
else:
|
||||
programs = frappe.get_all(
|
||||
"LMS Program Member", {"member": frappe.session.user}, ["parent as name"]
|
||||
)
|
||||
|
||||
for program in programs:
|
||||
program_courses = frappe.get_all(
|
||||
"LMS Program Course", {"parent": program.name}, ["course"]
|
||||
)
|
||||
program.courses = []
|
||||
for course in program_courses:
|
||||
program.courses.append(get_course_details(course.course))
|
||||
|
||||
program.members = frappe.db.count("LMS Program Member", {"parent": program.name})
|
||||
|
||||
return programs
|
||||
|
||||
Reference in New Issue
Block a user