From acd003814aae23c199c2b2196de80f7abf9f2e0c Mon Sep 17 00:00:00 2001 From: Jannat Patel Date: Mon, 18 Aug 2025 15:51:07 +0530 Subject: [PATCH] refactor: program list for students --- frontend/src/pages/Programs/ProgramForm.vue | 45 +++++++--- frontend/src/pages/Programs/Programs.vue | 74 +++++++++------- .../src/pages/Programs/StudentPrograms.vue | 87 +++++++++++++++++++ lms/lms/doctype/lms_program/lms_program.json | 11 ++- lms/lms/doctype/lms_program/lms_program.py | 11 +++ lms/lms/utils.py | 33 +++++-- lms/patches.txt | 3 +- lms/patches/v2_0/count_in_program.py | 18 ++++ 8 files changed, 235 insertions(+), 47 deletions(-) create mode 100644 frontend/src/pages/Programs/StudentPrograms.vue create mode 100644 lms/patches/v2_0/count_in_program.py diff --git a/frontend/src/pages/Programs/ProgramForm.vue b/frontend/src/pages/Programs/ProgramForm.vue index 02ca95ce..b2db0621 100644 --- a/frontend/src/pages/Programs/ProgramForm.vue +++ b/frontend/src/pages/Programs/ProgramForm.vue @@ -2,16 +2,9 @@ + diff --git a/lms/lms/doctype/lms_program/lms_program.json b/lms/lms/doctype/lms_program/lms_program.json index 0684f481..bd3936ad 100644 --- a/lms/lms/doctype/lms_program/lms_program.json +++ b/lms/lms/doctype/lms_program/lms_program.json @@ -93,7 +93,7 @@ "grid_page_length": 50, "index_web_pages_for_search": 1, "links": [], - "modified": "2025-08-13 14:36:59.168945", + "modified": "2025-08-18 13:08:04.993241", "modified_by": "sayali@frappe.io", "module": "LMS", "name": "LMS Program", @@ -135,6 +135,15 @@ "role": "Course Creator", "share": 1, "write": 1 + }, + { + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "LMS Student", + "share": 1 } ], "row_format": "Dynamic", diff --git a/lms/lms/doctype/lms_program/lms_program.py b/lms/lms/doctype/lms_program/lms_program.py index d0d6fa13..95bd312b 100644 --- a/lms/lms/doctype/lms_program/lms_program.py +++ b/lms/lms/doctype/lms_program/lms_program.py @@ -10,6 +10,7 @@ class LMSProgram(Document): def validate(self): self.validate_program_courses() self.validate_program_members() + self.update_count() def validate_program_courses(self): courses = [row.course for row in self.program_courses] @@ -30,3 +31,13 @@ class LMSProgram(Document): frappe.bold(next(iter(duplicates))) ) ) + + def update_count(self): + course_count = len(self.program_courses) + member_count = len(self.program_members) + + if self.course_count != course_count: + self.course_count = course_count + + if self.member_count != member_count: + self.member_count = member_count diff --git a/lms/lms/utils.py b/lms/lms/utils.py index b39dc544..c0682a44 100644 --- a/lms/lms/utils.py +++ b/lms/lms/utils.py @@ -1919,9 +1919,33 @@ def update_certificate_purchase(course, payment_name): @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"]) + enrolled_programs = frappe.get_all( + "LMS Program Member", {"member": frappe.session.user}, ["parent as name", "progress"] + ) + for program in enrolled_programs: + program.update( + frappe.db.get_value( + "LMS Program", program.name, ["name", "course_count", "member_count"], as_dict=True + ) + ) + published_programs = frappe.get_all( + "LMS Program", + { + "published": 1, + "allow_self_enrollment": 1, + }, + ["name", "course_count", "member_count"], + ) + published_programs = [program for program in published_programs if program not in enrolled_programs] + + return { + "enrolled": enrolled_programs, + "published": published_programs, + } + + +""" def set_program_details(programs): for program in programs: program_courses = frappe.get_all( "LMS Program Course", {"parent": program.name}, ["course"], order_by="idx" @@ -1939,10 +1963,7 @@ def get_programs(): previous_progress = details.membership.progress if details.membership else 0 program.courses.append(details) - - program.members = frappe.db.count("LMS Program Member", {"parent": program.name}) - - return programs + """ @frappe.whitelist() diff --git a/lms/patches.txt b/lms/patches.txt index efc2345c..79b4afad 100644 --- a/lms/patches.txt +++ b/lms/patches.txt @@ -109,4 +109,5 @@ lms.patches.v2_0.link_zoom_account_to_live_class lms.patches.v2_0.link_zoom_account_to_batch lms.patches.v2_0.sidebar_for_certified_members lms.patches.v2_0.move_batch_instructors_to_evaluators -lms.patches.v2_0.enable_programming_exercises_in_sidebar \ No newline at end of file +lms.patches.v2_0.enable_programming_exercises_in_sidebar +lms.patches.v2_0.count_in_program \ No newline at end of file diff --git a/lms/patches/v2_0/count_in_program.py b/lms/patches/v2_0/count_in_program.py new file mode 100644 index 00000000..fb263a91 --- /dev/null +++ b/lms/patches/v2_0/count_in_program.py @@ -0,0 +1,18 @@ +import frappe + + +def execute(): + programs = frappe.get_all("LMS Program", pluck="name") + + for program in programs: + course_count = frappe.db.count( + "LMS Program Course", + {"parent": program, "parenttype": "LMS Program", "parentfield": "program_courses"}, + ) + frappe.db.set_value("LMS Program", program, "course_count", course_count) + + member_count = frappe.db.count( + "LMS Program Member", + {"parent": program, "parenttype": "LMS Program", "parentfield": "program_members"}, + ) + frappe.db.set_value("LMS Program", program, "member_count", member_count)