feat: program restrictions
This commit is contained in:
@@ -93,15 +93,15 @@ def save_progress(lesson, course):
|
||||
|
||||
frappe.db.set_value("LMS Enrollment", membership, "current_lesson", lesson)
|
||||
|
||||
quiz_completed = get_quiz_progress(lesson)
|
||||
if not quiz_completed:
|
||||
return 0
|
||||
|
||||
if frappe.db.exists(
|
||||
"LMS Course Progress", {"lesson": lesson, "member": frappe.session.user}
|
||||
):
|
||||
return
|
||||
|
||||
quiz_completed = get_quiz_progress(lesson)
|
||||
if not quiz_completed:
|
||||
return 0
|
||||
|
||||
frappe.get_doc(
|
||||
{
|
||||
"doctype": "LMS Course Progress",
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
import frappe
|
||||
from frappe import _
|
||||
from frappe.model.document import Document
|
||||
from frappe.utils import ceil
|
||||
|
||||
|
||||
class LMSEnrollment(Document):
|
||||
@@ -11,6 +12,9 @@ class LMSEnrollment(Document):
|
||||
self.validate_membership_in_same_batch()
|
||||
self.validate_membership_in_different_batch_same_course()
|
||||
|
||||
def on_update(self):
|
||||
self.update_program_progress()
|
||||
|
||||
def validate_membership_in_same_batch(self):
|
||||
filters = {"member": self.member, "course": self.course, "name": ["!=", self.name]}
|
||||
if self.batch_old:
|
||||
@@ -55,6 +59,26 @@ class LMSEnrollment(Document):
|
||||
)
|
||||
)
|
||||
|
||||
def update_program_progress(self):
|
||||
programs = frappe.get_all(
|
||||
"LMS Program Member", {"member": self.member}, ["parent", "name"]
|
||||
)
|
||||
|
||||
for program in programs:
|
||||
total_progress = 0
|
||||
courses = frappe.get_all(
|
||||
"LMS Program Course", {"parent": program.parent}, pluck="course"
|
||||
)
|
||||
for course in courses:
|
||||
progress = frappe.db.get_value(
|
||||
"LMS Enrollment", {"course": course, "member": self.member}, "progress"
|
||||
)
|
||||
progress = progress or 0
|
||||
total_progress += progress
|
||||
|
||||
average_progress = ceil(total_progress / len(courses))
|
||||
frappe.db.set_value("LMS Program Member", program.name, "progress", average_progress)
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def create_membership(
|
||||
|
||||
@@ -11,82 +11,6 @@ class LMSProgram(Document):
|
||||
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}
|
||||
|
||||
@@ -7,7 +7,8 @@
|
||||
"engine": "InnoDB",
|
||||
"field_order": [
|
||||
"member",
|
||||
"full_name"
|
||||
"full_name",
|
||||
"progress"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
@@ -25,12 +26,19 @@
|
||||
"in_list_view": 1,
|
||||
"label": "Full Name",
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"default": "0",
|
||||
"fieldname": "progress",
|
||||
"fieldtype": "Int",
|
||||
"in_list_view": 1,
|
||||
"label": "Progress"
|
||||
}
|
||||
],
|
||||
"index_web_pages_for_search": 1,
|
||||
"istable": 1,
|
||||
"links": [],
|
||||
"modified": "2024-11-18 12:44:02.648786",
|
||||
"modified": "2024-11-21 12:51:31.882576",
|
||||
"modified_by": "Administrator",
|
||||
"module": "LMS",
|
||||
"name": "LMS Program Member",
|
||||
|
||||
@@ -1763,12 +1763,12 @@ def get_programs():
|
||||
programs = frappe.get_all("LMS Program", fields=["name"])
|
||||
else:
|
||||
programs = frappe.get_all(
|
||||
"LMS Program Member", {"member": frappe.session.user}, ["parent as name"]
|
||||
"LMS Program Member", {"member": frappe.session.user}, ["parent as name", "progress"]
|
||||
)
|
||||
|
||||
for program in programs:
|
||||
program_courses = frappe.get_all(
|
||||
"LMS Program Course", {"parent": program.name}, ["course"]
|
||||
"LMS Program Course", {"parent": program.name}, ["course"], order_by="idx"
|
||||
)
|
||||
program.courses = []
|
||||
for course in program_courses:
|
||||
@@ -1777,3 +1777,55 @@ def get_programs():
|
||||
program.members = frappe.db.count("LMS Program Member", {"parent": program.name})
|
||||
|
||||
return programs
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def enroll_in_program_course(program, course):
|
||||
enrollment = frappe.db.exists(
|
||||
"LMS Enrollment", {"member": frappe.session.user, "course": course}
|
||||
)
|
||||
|
||||
if enrollment:
|
||||
enrollment = frappe.db.get_value(
|
||||
"LMS Enrollment", enrollment, ["name", "current_lesson"], as_dict=1
|
||||
)
|
||||
enrollment.current_lesson = get_lesson_index(enrollment.current_lesson)
|
||||
return enrollment
|
||||
|
||||
program_courses = frappe.get_all(
|
||||
"LMS Program Course", {"parent": program}, ["course", "idx"], order_by="idx"
|
||||
)
|
||||
current_course_idx = [
|
||||
program_course.idx
|
||||
for program_course in program_courses
|
||||
if program_course.course == course
|
||||
][0]
|
||||
|
||||
for program_course in program_courses:
|
||||
if program_course.idx < current_course_idx:
|
||||
enrollment = frappe.db.get_value(
|
||||
"LMS Enrollment",
|
||||
{"member": frappe.session.user, "course": program_course.course},
|
||||
["name", "progress"],
|
||||
as_dict=1,
|
||||
)
|
||||
if enrollment and enrollment.progress != 100:
|
||||
frappe.throw(
|
||||
_("Please complete the previous courses in the program to enroll in this course.")
|
||||
)
|
||||
elif not enrollment:
|
||||
frappe.throw(
|
||||
_("Please complete the previous courses in the program to enroll in this course.")
|
||||
)
|
||||
else:
|
||||
continue
|
||||
|
||||
enrollment = frappe.new_doc("LMS Enrollment")
|
||||
enrollment.update(
|
||||
{
|
||||
"member": frappe.session.user,
|
||||
"course": course,
|
||||
}
|
||||
)
|
||||
enrollment.save()
|
||||
return enrollment
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
{
|
||||
"app": "lms",
|
||||
"charts": [
|
||||
{
|
||||
"chart_name": "New Signups",
|
||||
@@ -145,7 +146,7 @@
|
||||
"type": "Link"
|
||||
}
|
||||
],
|
||||
"modified": "2024-08-09 13:19:06.273056",
|
||||
"modified": "2024-11-21 12:16:25.886431",
|
||||
"modified_by": "Administrator",
|
||||
"module": "LMS",
|
||||
"name": "LMS",
|
||||
@@ -212,5 +213,6 @@
|
||||
"type": "DocType"
|
||||
}
|
||||
],
|
||||
"title": "LMS"
|
||||
}
|
||||
"title": "LMS",
|
||||
"type": "Workspace"
|
||||
}
|
||||
Reference in New Issue
Block a user