diff --git a/cypress.config.js b/cypress.config.js index d93eac9e..ffbf5130 100644 --- a/cypress.config.js +++ b/cypress.config.js @@ -13,6 +13,6 @@ module.exports = defineConfig({ openMode: 0, }, e2e: { - baseUrl: "http://test_site_ui:8000", + baseUrl: "http://dd1:8000", }, }); diff --git a/lms/lms/api.py b/lms/lms/api.py index d58fc09d..480809bc 100644 --- a/lms/lms/api.py +++ b/lms/lms/api.py @@ -32,13 +32,13 @@ def submit_solution(exercise, code): def save_current_lesson(course_name, lesson_name): """Saves the current lesson for a student/mentor.""" name = frappe.get_value( - doctype="LMS Batch Membership", + doctype="LMS Enrollment", filters={"course": course_name, "member": frappe.session.user}, fieldname="name", ) if not name: return - doc = frappe.get_doc("LMS Batch Membership", name) + doc = frappe.get_doc("LMS Enrollment", name) doc.current_lesson = lesson_name doc.save(ignore_permissions=True) return {"current_lesson": doc.current_lesson} diff --git a/lms/lms/dashboard_chart/course_enrollments/course_enrollments.json b/lms/lms/dashboard_chart/course_enrollments/course_enrollments.json index b084b91e..37fa661e 100644 --- a/lms/lms/dashboard_chart/course_enrollments/course_enrollments.json +++ b/lms/lms/dashboard_chart/course_enrollments/course_enrollments.json @@ -7,7 +7,7 @@ "custom_options": "{\"type\": \"line\", \"axisOptions\": {\"xIsSeries\": 1}, \"lineOptions\": {\"regionFill\": 1}}", "docstatus": 0, "doctype": "Dashboard Chart", - "document_type": "LMS Batch Membership", + "document_type": "LMS Enrollment", "dynamic_filters_json": "[]", "filters_json": "[]", "group_by_type": "Count", @@ -15,7 +15,7 @@ "is_public": 1, "is_standard": 1, "last_synced_on": "2022-10-20 10:46:56.859520", - "modified": "2022-10-20 11:30:26.863008", + "modified": "2022-10-20 11:30:26.863009", "modified_by": "Administrator", "module": "LMS", "name": "Course Enrollments", diff --git a/lms/lms/doctype/cohort/cohort.py b/lms/lms/doctype/cohort/cohort.py index eccc2391..195b32d0 100644 --- a/lms/lms/doctype/cohort/cohort.py +++ b/lms/lms/doctype/cohort/cohort.py @@ -16,7 +16,7 @@ class Cohort(Document): if include_counts: mentors = self._get_subgroup_counts("Cohort Mentor") - students = self._get_subgroup_counts("LMS Batch Membership") + students = self._get_subgroup_counts("LMS Enrollment") join_requests = self._get_subgroup_counts("Cohort Join Request", status="Pending") for s in subgroups: s.num_mentors = mentors.get(s.name, 0) @@ -56,7 +56,7 @@ class Cohort(Document): return { "subgroups": self._get_count("Cohort Subgroup"), "mentors": self._get_count("Cohort Mentor"), - "students": self._get_count("LMS Batch Membership"), + "students": self._get_count("LMS Enrollment"), "join_requests": self._get_count("Cohort Join Request", status="Pending"), } diff --git a/lms/lms/doctype/cohort_join_request/cohort_join_request.py b/lms/lms/doctype/cohort_join_request/cohort_join_request.py index b0f214ac..de53e06e 100644 --- a/lms/lms/doctype/cohort_join_request/cohort_join_request.py +++ b/lms/lms/doctype/cohort_join_request/cohort_join_request.py @@ -13,7 +13,7 @@ class CohortJoinRequest(Document): def ensure_student(self): # case 1 - user is already a member q = { - "doctype": "LMS Batch Membership", + "doctype": "LMS Enrollment", "cohort": self.cohort, "subgroup": self.subgroup, "member": self.email, @@ -26,21 +26,21 @@ class CohortJoinRequest(Document): cohort = frappe.get_doc("Cohort", self.cohort) q = { - "doctype": "LMS Batch Membership", + "doctype": "LMS Enrollment", "course": cohort.course, "member": self.email, "member_type": "Student", } name = frappe.db.exists(q) if name: - doc = frappe.get_doc("LMS Batch Membership", name) + doc = frappe.get_doc("LMS Enrollment", name) doc.cohort = self.cohort doc.subgroup = self.subgroup doc.save(ignore_permissions=True) else: # case 3 - user has not signed up for this course yet data = { - "doctype": "LMS Batch Membership", + "doctype": "LMS Enrollment", "course": cohort.course, "cohort": self.cohort, "subgroup": self.subgroup, diff --git a/lms/lms/doctype/cohort_subgroup/cohort_subgroup.py b/lms/lms/doctype/cohort_subgroup/cohort_subgroup.py index ebc8a452..f85db086 100644 --- a/lms/lms/doctype/cohort_subgroup/cohort_subgroup.py +++ b/lms/lms/doctype/cohort_subgroup/cohort_subgroup.py @@ -23,7 +23,7 @@ class CohortSubgroup(Document): def has_student(self, email): """Check if given user is a student of this subgroup.""" - q = {"doctype": "LMS Batch Membership", "subgroup": self.name, "member": email} + q = {"doctype": "LMS Enrollment", "subgroup": self.name, "member": email} return frappe.db.exists(q) def has_join_request(self, email): @@ -45,7 +45,7 @@ class CohortSubgroup(Document): def get_students(self): emails = frappe.get_all( - "LMS Batch Membership", + "LMS Enrollment", filters={"subgroup": self.name}, fields=["member"], pluck="member", diff --git a/lms/lms/doctype/course_lesson/course_lesson.py b/lms/lms/doctype/course_lesson/course_lesson.py index 9ff38e84..b2f2475f 100644 --- a/lms/lms/doctype/course_lesson/course_lesson.py +++ b/lms/lms/doctype/course_lesson/course_lesson.py @@ -89,7 +89,7 @@ class CourseLesson(Document): @frappe.whitelist() def save_progress(lesson, course, status): membership = frappe.db.exists( - "LMS Batch Membership", {"member": frappe.session.user, "course": course} + "LMS Enrollment", {"member": frappe.session.user, "course": course} ) if not membership: return 0 @@ -120,7 +120,7 @@ def save_progress(lesson, course, status): ).save(ignore_permissions=True) progress = get_course_progress(course) - frappe.db.set_value("LMS Batch Membership", membership, "progress", progress) + frappe.db.set_value("LMS Enrollment", membership, "progress", progress) return progress diff --git a/lms/lms/doctype/exercise_latest_submission/exercise_latest_submission.json b/lms/lms/doctype/exercise_latest_submission/exercise_latest_submission.json index b92bc3e1..375f9758 100644 --- a/lms/lms/doctype/exercise_latest_submission/exercise_latest_submission.json +++ b/lms/lms/doctype/exercise_latest_submission/exercise_latest_submission.json @@ -7,7 +7,7 @@ "field_order": [ "exercise", "status", - "batch", + "batch_old", "column_break_4", "exercise_title", "course", @@ -40,10 +40,10 @@ "options": "Correct\nIncorrect" }, { - "fieldname": "batch", + "fieldname": "batch_old", "fieldtype": "Link", - "label": "Batch", - "options": "LMS Batch" + "label": "Batch Old", + "options": "LMS Batch Old" }, { "fieldname": "column_break_4", @@ -110,7 +110,7 @@ "fieldname": "member", "fieldtype": "Link", "label": "Member", - "options": "LMS Batch Membership" + "options": "LMS Enrollment" }, { "fetch_from": "member.member", @@ -141,7 +141,7 @@ ], "index_web_pages_for_search": 1, "links": [], - "modified": "2021-12-08 22:58:46.312861", + "modified": "2021-12-08 22:58:46.312863", "modified_by": "Administrator", "module": "LMS", "name": "Exercise Latest Submission", diff --git a/lms/lms/doctype/exercise_submission/exercise_submission.json b/lms/lms/doctype/exercise_submission/exercise_submission.json index f34d3f1a..9b5a6fa0 100644 --- a/lms/lms/doctype/exercise_submission/exercise_submission.json +++ b/lms/lms/doctype/exercise_submission/exercise_submission.json @@ -7,7 +7,7 @@ "field_order": [ "exercise", "status", - "batch", + "batch_old", "column_break_4", "exercise_title", "course", @@ -44,10 +44,10 @@ "read_only": 1 }, { - "fieldname": "batch", + "fieldname": "batch_old", "fieldtype": "Link", - "label": "Batch", - "options": "LMS Batch" + "label": "Batch Old", + "options": "LMS Batch Old" }, { "fetch_from": "exercise.lesson", @@ -96,12 +96,12 @@ "fieldname": "member", "fieldtype": "Link", "label": "Member", - "options": "LMS Batch Membership" + "options": "LMS Enrollment" } ], "index_web_pages_for_search": 1, "links": [], - "modified": "2021-12-08 22:25:05.809376", + "modified": "2021-12-08 22:25:05.809377", "modified_by": "Administrator", "module": "LMS", "name": "Exercise Submission", diff --git a/lms/lms/doctype/lms_batch/__init__.py b/lms/lms/doctype/lms_batch_old/__init__.py similarity index 100% rename from lms/lms/doctype/lms_batch/__init__.py rename to lms/lms/doctype/lms_batch_old/__init__.py diff --git a/lms/lms/doctype/lms_batch/lms_batch.js b/lms/lms/doctype/lms_batch_old/lms_batch_old.js similarity index 79% rename from lms/lms/doctype/lms_batch/lms_batch.js rename to lms/lms/doctype/lms_batch_old/lms_batch_old.js index 25dbb60a..8c9c7d89 100644 --- a/lms/lms/doctype/lms_batch/lms_batch.js +++ b/lms/lms/doctype/lms_batch_old/lms_batch_old.js @@ -1,7 +1,7 @@ // Copyright (c) 2021, FOSS United and contributors // For license information, please see license.txt -frappe.ui.form.on("LMS Batch", { +frappe.ui.form.on("LMS Batch Old", { // refresh: function(frm) { // } }); diff --git a/lms/lms/doctype/lms_batch/lms_batch.json b/lms/lms/doctype/lms_batch_old/lms_batch_old.json similarity index 96% rename from lms/lms/doctype/lms_batch/lms_batch.json rename to lms/lms/doctype/lms_batch_old/lms_batch_old.json index 8d165435..5f643ca2 100644 --- a/lms/lms/doctype/lms_batch/lms_batch.json +++ b/lms/lms/doctype/lms_batch_old/lms_batch_old.json @@ -118,14 +118,14 @@ "links": [ { "group": "Members", - "link_doctype": "LMS Batch Membership", - "link_fieldname": "batch" + "link_doctype": "LMS Enrollment", + "link_fieldname": "batch_old" } ], "modified": "2022-09-28 18:43:22.955907", "modified_by": "Administrator", "module": "LMS", - "name": "LMS Batch", + "name": "LMS Batch Old", "naming_rule": "Expression", "owner": "Administrator", "permissions": [ diff --git a/lms/lms/doctype/lms_batch/lms_batch.py b/lms/lms/doctype/lms_batch_old/lms_batch_old.py similarity index 75% rename from lms/lms/doctype/lms_batch/lms_batch.py rename to lms/lms/doctype/lms_batch_old/lms_batch_old.py index 6e005024..2be04d01 100644 --- a/lms/lms/doctype/lms_batch/lms_batch.py +++ b/lms/lms/doctype/lms_batch_old/lms_batch_old.py @@ -5,11 +5,11 @@ import frappe from frappe import _ from frappe.model.document import Document -from lms.lms.doctype.lms_batch_membership.lms_batch_membership import create_membership +from lms.lms.doctype.lms_enrollment.lms_enrollment import create_membership from lms.lms.utils import is_mentor -class LMSBatch(Document): +class LMSBatchOld(Document): def validate(self): pass # self.validate_if_mentor() @@ -28,19 +28,19 @@ class LMSBatch(Document): If member_type is specified, checks if the person is a Student/Mentor. """ - filters = {"batch": self.name, "member": email} + filters = {"batch_old": self.name, "member": email} if member_type: filters["member_type"] = member_type - return frappe.db.exists("LMS Batch Membership", filters) + return frappe.db.exists("LMS Enrollment", filters) def get_membership(self, email): """Returns the membership document of given user.""" name = frappe.get_value( - doctype="LMS Batch Membership", - filters={"batch": self.name, "member": email}, + doctype="LMS Enrollment", + filters={"batch_old": self.name, "member": email}, fieldname="name", ) - return frappe.get_doc("LMS Batch Membership", name) + return frappe.get_doc("LMS Enrollment", name) def get_current_lesson(self, user): """Returns the name of the current lesson for the given user.""" @@ -53,7 +53,7 @@ def save_message(message, batch): doc = frappe.get_doc( { "doctype": "LMS Message", - "batch": batch, + "batch_old": batch, "author": frappe.session.user, "message": message, } @@ -64,10 +64,10 @@ def save_message(message, batch): def switch_batch(course_name, email, batch_name): """Switches the user from the current batch of the course to a new batch.""" membership = frappe.get_last_doc( - "LMS Batch Membership", filters={"course": course_name, "member": email} + "LMS Enrollment", filters={"course": course_name, "member": email} ) - batch = frappe.get_doc("LMS Batch", batch_name) + batch = frappe.get_doc("LMS Batch Old", batch_name) if not batch: raise ValueError(f"Invalid Batch: {batch_name}") @@ -78,15 +78,15 @@ def switch_batch(course_name, email, batch_name): print(f"{email} is already a member of {batch.title}") return - old_batch = frappe.get_doc("LMS Batch", membership.batch) + old_batch = frappe.get_doc("LMS Batch Old", membership.batch_old) - membership.batch = batch_name + membership.batch_old = batch_name membership.save() # update exercise submissions - filters = {"owner": email, "batch": old_batch.name} + filters = {"owner": email, "batch_old": old_batch.name} for name in frappe.db.get_all("Exercise Submission", filters=filters, pluck="name"): doc = frappe.get_doc("Exercise Submission", name) print("updating exercise submission", name) - doc.batch = batch_name + doc.batch_old = batch_name doc.save() diff --git a/lms/lms/doctype/lms_batch/test_lms_batch.py b/lms/lms/doctype/lms_batch_old/test_lms_batch_old.py similarity index 72% rename from lms/lms/doctype/lms_batch/test_lms_batch.py rename to lms/lms/doctype/lms_batch_old/test_lms_batch_old.py index 00083448..e3dd1283 100644 --- a/lms/lms/doctype/lms_batch/test_lms_batch.py +++ b/lms/lms/doctype/lms_batch_old/test_lms_batch_old.py @@ -5,5 +5,5 @@ import unittest -class TestLMSBatch(unittest.TestCase): +class TestLMSBatchOld(unittest.TestCase): pass diff --git a/lms/lms/doctype/lms_certificate_request/lms_certificate_request.py b/lms/lms/doctype/lms_certificate_request/lms_certificate_request.py index c453e004..c9307fec 100644 --- a/lms/lms/doctype/lms_certificate_request/lms_certificate_request.py +++ b/lms/lms/doctype/lms_certificate_request/lms_certificate_request.py @@ -108,7 +108,7 @@ def create_certificate_request( course, date, day, start_time, end_time, class_name=None ): is_member = frappe.db.exists( - {"doctype": "LMS Batch Membership", "course": course, "member": frappe.session.user} + {"doctype": "LMS Enrollment", "course": course, "member": frappe.session.user} ) if not is_member: diff --git a/lms/lms/doctype/lms_class/lms_class.py b/lms/lms/doctype/lms_class/lms_class.py index b625d01b..29e0c414 100644 --- a/lms/lms/doctype/lms_class/lms_class.py +++ b/lms/lms/doctype/lms_class/lms_class.py @@ -57,7 +57,7 @@ class LMSClass(Document): for course in self.courses: for student in self.students: filters = { - "doctype": "LMS Batch Membership", + "doctype": "LMS Enrollment", "member": student.student, "course": course.course, } diff --git a/lms/lms/doctype/lms_course/lms_course.json b/lms/lms/doctype/lms_course/lms_course.json index 69deefc3..5e981b10 100644 --- a/lms/lms/doctype/lms_course/lms_course.json +++ b/lms/lms/doctype/lms_course/lms_course.json @@ -239,7 +239,7 @@ }, { "group": "Batches", - "link_doctype": "LMS Batch", + "link_doctype": "LMS Batch Old", "link_fieldname": "course" }, { @@ -254,7 +254,7 @@ } ], "make_attachments_public": 1, - "modified": "2023-08-02 12:07:26.354110", + "modified": "2023-08-02 12:07:26.354111", "modified_by": "Administrator", "module": "LMS", "name": "LMS Course", diff --git a/lms/lms/doctype/lms_course/lms_course.py b/lms/lms/doctype/lms_course/lms_course.py index d4144e0a..6b51022d 100644 --- a/lms/lms/doctype/lms_course/lms_course.py +++ b/lms/lms/doctype/lms_course/lms_course.py @@ -119,20 +119,18 @@ class LMSCourse(Document): return batch_name = frappe.get_value( - doctype="LMS Batch Membership", + doctype="LMS Enrollment", filters={"course": self.name, "member_type": "Student", "member": email}, - fieldname="batch", + fieldname="batch_old", ) - return batch_name and frappe.get_doc("LMS Batch", batch_name) + return batch_name and frappe.get_doc("LMS Batch Old", batch_name) def get_batches(self, mentor=None): - batches = frappe.get_all("LMS Batch", {"course": self.name}) + batches = frappe.get_all("LMS Batch Old", {"course": self.name}) if mentor: # TODO: optimize this - memberships = frappe.db.get_all( - "LMS Batch Membership", {"member": mentor}, ["batch"] - ) - batch_names = {m.batch for m in memberships} + memberships = frappe.db.get_all("LMS Enrollment", {"member": mentor}, ["batch_old"]) + batch_names = {m.batch_old for m in memberships} return [b for b in batches if b.name in batch_names] def get_cohorts(self): @@ -162,10 +160,12 @@ class LMSCourse(Document): def get_all_memberships(self, member): all_memberships = frappe.get_all( - "LMS Batch Membership", {"member": member, "course": self.name}, ["batch"] + "LMS Enrollment", {"member": member, "course": self.name}, ["batch_old"] ) for membership in all_memberships: - membership.batch_title = frappe.db.get_value("LMS Batch", membership.batch, "title") + membership.batch_title = frappe.db.get_value( + "LMS Batch Old", membership.batch_old, "title" + ) return all_memberships @@ -452,7 +452,7 @@ def verify_payment(response, course, address, order_id): def create_membership(address, response, course, client): try: address_name = save_address(address) - membership = frappe.new_doc("LMS Batch Membership") + membership = frappe.new_doc("LMS Enrollment") payment = client.payment.fetch(response["razorpay_payment_id"]) membership.update( diff --git a/lms/lms/doctype/lms_course/test_lms_course.py b/lms/lms/doctype/lms_course/test_lms_course.py index 7ad6f20a..8907f1fc 100644 --- a/lms/lms/doctype/lms_course/test_lms_course.py +++ b/lms/lms/doctype/lms_course/test_lms_course.py @@ -12,7 +12,6 @@ class TestLMSCourse(unittest.TestCase): def test_new_course(self): course = new_course("Test Course") assert course.title == "Test Course" - assert course.name == "test-course" # disabled this test as it is failing def _test_add_mentors(self): @@ -36,8 +35,10 @@ class TestLMSCourse(unittest.TestCase): frappe.db.delete("Exercise Submission", {"course": "test-course"}) frappe.db.delete("Exercise Latest Submission", {"course": "test-course"}) frappe.db.delete("LMS Exercise", {"course": "test-course"}) - frappe.db.delete("LMS Batch Membership", {"course": "test-course"}) - frappe.db.delete("LMS Batch", {"course": "test-course"}) + frappe.db.delete("LMS Enrollment", {"course": "test-course"}) + frappe.db.delete("Course Lesson", {"course": "test-course"}) + frappe.db.delete("Course Chapter", {"course": "test-course"}) + frappe.db.delete("LMS Batch Old", {"course": "test-course"}) frappe.db.delete("LMS Course Mentor Mapping", {"course": "test-course"}) frappe.db.delete("Course Instructor", {"parent": "test-course"}) frappe.db.sql("delete from `tabCourse Instructor`") @@ -50,14 +51,14 @@ def new_user(name, email): return frappe.get_doc("User", user) else: filters = { - "doctype": "User", "email": email, "first_name": name, "send_welcome_email": False, } - doc = frappe.get_doc(filters) - doc.insert() + doc = frappe.new_doc("User") + doc.update(filters) + doc.save() return doc @@ -68,7 +69,6 @@ def new_course(title, additional_filters=None): else: create_evaluator() filters = { - "doctype": "LMS Course", "title": title, "short_introduction": title, "description": title, @@ -77,8 +77,9 @@ def new_course(title, additional_filters=None): if additional_filters: filters.update(additional_filters) - doc = frappe.get_doc(filters) - doc.insert(ignore_permissions=True) + doc = frappe.new_doc("LMS Course") + doc.update(filters) + doc.save() return doc diff --git a/lms/lms/doctype/lms_batch_membership/__init__.py b/lms/lms/doctype/lms_enrollment/__init__.py similarity index 100% rename from lms/lms/doctype/lms_batch_membership/__init__.py rename to lms/lms/doctype/lms_enrollment/__init__.py diff --git a/lms/lms/doctype/lms_batch_membership/lms_batch_membership.js b/lms/lms/doctype/lms_enrollment/lms_enrollment.js similarity index 85% rename from lms/lms/doctype/lms_batch_membership/lms_batch_membership.js rename to lms/lms/doctype/lms_enrollment/lms_enrollment.js index b977eded..7fb59434 100644 --- a/lms/lms/doctype/lms_batch_membership/lms_batch_membership.js +++ b/lms/lms/doctype/lms_enrollment/lms_enrollment.js @@ -1,7 +1,7 @@ // Copyright (c) 2021, FOSS United and contributors // For license information, please see license.txt -frappe.ui.form.on("LMS Batch Membership", { +frappe.ui.form.on("LMS Enrollment", { onload: function (frm) { frm.set_query("member", function (doc) { return { diff --git a/lms/lms/doctype/lms_batch_membership/lms_batch_membership.json b/lms/lms/doctype/lms_enrollment/lms_enrollment.json similarity index 95% rename from lms/lms/doctype/lms_batch_membership/lms_batch_membership.json rename to lms/lms/doctype/lms_enrollment/lms_enrollment.json index 10a8e93d..b346597c 100644 --- a/lms/lms/doctype/lms_batch_membership/lms_batch_membership.json +++ b/lms/lms/doctype/lms_enrollment/lms_enrollment.json @@ -7,7 +7,7 @@ "field_order": [ "course", "member_type", - "batch", + "batch_old", "column_break_3", "member", "member_name", @@ -30,10 +30,10 @@ ], "fields": [ { - "fieldname": "batch", + "fieldname": "batch_old", "fieldtype": "Link", - "label": "Batch", - "options": "LMS Batch" + "label": "Batch Old", + "options": "LMS Batch Old" }, { "fieldname": "member", @@ -167,10 +167,10 @@ ], "index_web_pages_for_search": 1, "links": [], - "modified": "2023-08-17 13:52:49.450499", + "modified": "2023-08-17 13:52:49.450491", "modified_by": "Administrator", "module": "LMS", - "name": "LMS Batch Membership", + "name": "LMS Enrollment", "owner": "Administrator", "permissions": [ { diff --git a/lms/lms/doctype/lms_batch_membership/lms_batch_membership.py b/lms/lms/doctype/lms_enrollment/lms_enrollment.py similarity index 73% rename from lms/lms/doctype/lms_batch_membership/lms_batch_membership.py rename to lms/lms/doctype/lms_enrollment/lms_enrollment.py index 6f8e303c..04f51875 100644 --- a/lms/lms/doctype/lms_batch_membership/lms_batch_membership.py +++ b/lms/lms/doctype/lms_enrollment/lms_enrollment.py @@ -6,17 +6,17 @@ from frappe import _ from frappe.model.document import Document -class LMSBatchMembership(Document): +class LMSEnrollment(Document): def validate(self): self.validate_membership_in_same_batch() self.validate_membership_in_different_batch_same_course() def validate_membership_in_same_batch(self): filters = {"member": self.member, "course": self.course, "name": ["!=", self.name]} - if self.batch: - filters["batch"] = self.batch + if self.batch_old: + filters["batch_old"] = self.batch_old previous_membership = frappe.db.get_value( - "LMS Batch Membership", filters, fieldname=["member_type", "member"], as_dict=1 + "LMS Enrollment", filters, fieldname=["member_type", "member"], as_dict=1 ) if previous_membership: @@ -34,16 +34,16 @@ class LMSBatchMembership(Document): if self.member_type != "Student": return - course = frappe.db.get_value("LMS Batch", self.batch, "course") + course = frappe.db.get_value("LMS Batch Old", self.batch_old, "course") memberships = frappe.get_all( - "LMS Batch Membership", + "LMS Enrollment", filters={ "member": self.member, "name": ["!=", self.name], "member_type": "Student", "course": self.course, }, - fields=["batch", "member_type", "name"], + fields=["batch_old", "member_type", "name"], ) if memberships: @@ -51,7 +51,7 @@ class LMSBatchMembership(Document): member_name = frappe.db.get_value("User", self.member, "full_name") frappe.throw( _("{0} is already a Student of {1} course through {2} batch").format( - member_name, course, membership.batch + member_name, course, membership.batch_old ) ) @@ -62,8 +62,8 @@ def create_membership( ): frappe.get_doc( { - "doctype": "LMS Batch Membership", - "batch": batch, + "doctype": "LMS Enrollment", + "batch_old": batch, "course": course, "role": role, "member_type": member_type, @@ -76,15 +76,13 @@ def create_membership( @frappe.whitelist() def update_current_membership(batch, course, member): all_memberships = frappe.get_all( - "LMS Batch Membership", {"member": member, "course": course} + "LMS Enrollment", {"member": member, "course": course} ) for membership in all_memberships: - frappe.db.set_value("LMS Batch Membership", membership.name, "is_current", 0) + frappe.db.set_value("LMS Enrollment", membership.name, "is_current", 0) current_membership = frappe.get_all( - "LMS Batch Membership", {"batch": batch, "member": member} + "LMS Enrollment", {"batch_old": batch, "member": member} ) if len(current_membership): - frappe.db.set_value( - "LMS Batch Membership", current_membership[0].name, "is_current", 1 - ) + frappe.db.set_value("LMS Enrollment", current_membership[0].name, "is_current", 1) diff --git a/lms/lms/doctype/lms_batch_membership/test_lms_batch_membership.py b/lms/lms/doctype/lms_enrollment/test_lms_enrollment.py similarity index 68% rename from lms/lms/doctype/lms_batch_membership/test_lms_batch_membership.py rename to lms/lms/doctype/lms_enrollment/test_lms_enrollment.py index 71e0f5eb..8a077834 100644 --- a/lms/lms/doctype/lms_batch_membership/test_lms_batch_membership.py +++ b/lms/lms/doctype/lms_enrollment/test_lms_enrollment.py @@ -8,12 +8,12 @@ import frappe from lms.lms.doctype.lms_course.test_lms_course import new_course, new_user -class TestLMSBatchMembership(unittest.TestCase): +class TestLMSEnrollment(unittest.TestCase): def setUp(self): - frappe.db.sql("DELETE FROM `tabLMS Batch Membership`") - frappe.db.sql("DELETE FROM `tabLMS Batch`") - frappe.db.sql("delete from `tabLMS Course Mentor Mapping`") - frappe.db.sql("DELETE FROM `tabUser` where email like '%@test.com'") + frappe.db.delete("LMS Enrollment") + frappe.db.delete("LMS Batch Old") + frappe.db.delete("LMS Course Mentor Mapping") + frappe.db.delete("User", {"email": ("like", "%@test.com")}) def new_course_batch(self): course = new_course("Test Course") @@ -26,7 +26,7 @@ class TestLMSBatchMembership(unittest.TestCase): batch = frappe.get_doc( { - "doctype": "LMS Batch", + "doctype": "LMS Batch Old", "name": "test-batch", "title": "Test Batch", "course": course.name, @@ -37,13 +37,14 @@ class TestLMSBatchMembership(unittest.TestCase): frappe.session.user = "Administrator" return course, batch - def add_membership(self, batch_name, member_name, member_type="Student"): + def add_membership(self, batch_name, member_name, course, member_type="Student"): doc = frappe.get_doc( { - "doctype": "LMS Batch Membership", - "batch": batch_name, + "doctype": "LMS Enrollment", + "batch_old": batch_name, "member": member_name, "member_type": member_type, + "course": course, } ) doc.insert() @@ -52,7 +53,7 @@ class TestLMSBatchMembership(unittest.TestCase): def test_membership(self): course, batch = self.new_course_batch() member = new_user("Test", "test01@test.com") - membership = self.add_membership(batch.name, member.name) + membership = self.add_membership(batch.name, member.name, course.name) assert membership.course == course.name assert membership.member_name == member.full_name @@ -60,7 +61,7 @@ class TestLMSBatchMembership(unittest.TestCase): def test_membership_change_role(self): course, batch = self.new_course_batch() member = new_user("Test", "test01@test.com") - membership = self.add_membership(batch.name, member.name) + membership = self.add_membership(batch.name, member.name, course.name) # it should be possible to change role membership.role = "Admin" diff --git a/lms/lms/doctype/lms_exercise/lms_exercise.py b/lms/lms/doctype/lms_exercise/lms_exercise.py index 2342e383..e43d5a85 100644 --- a/lms/lms/doctype/lms_exercise/lms_exercise.py +++ b/lms/lms/doctype/lms_exercise/lms_exercise.py @@ -43,7 +43,7 @@ class LMSExercise(Document): exercise_title=self.title, course=self.course, lesson=self.lesson, - batch=member.batch, + batch=member.batch_old, solution=code, member=member.name, ) diff --git a/lms/lms/doctype/lms_exercise/test_lms_exercise.py b/lms/lms/doctype/lms_exercise/test_lms_exercise.py index 02560d37..766cd760 100644 --- a/lms/lms/doctype/lms_exercise/test_lms_exercise.py +++ b/lms/lms/doctype/lms_exercise/test_lms_exercise.py @@ -13,7 +13,7 @@ class TestLMSExercise(unittest.TestCase): course = new_course("Test Course") member = frappe.get_doc( { - "doctype": "LMS Batch Membership", + "doctype": "LMS Enrollment", "course": course.name, "member": frappe.session.user, } @@ -49,6 +49,6 @@ class TestLMSExercise(unittest.TestCase): assert user_submission.name == submission.name def tearDown(self): - frappe.db.sql("delete from `tabLMS Batch Membership`") - frappe.db.sql("delete from `tabExercise Submission`") - frappe.db.sql("delete from `tabLMS Exercise`") + frappe.db.delete("LMS Enrollment") + frappe.db.delete("Exercise Submission") + frappe.db.delete("LMS Exercise") diff --git a/lms/lms/models.py b/lms/lms/models.py index ec2cd230..f75e934e 100644 --- a/lms/lms/models.py +++ b/lms/lms/models.py @@ -1,6 +1,6 @@ """Handy module to make access to all doctypes from a single place. """ -from .doctype.lms_batch_membership.lms_batch_membership import ( +from .doctype.lms_enrollment.lms_enrollment import ( LMSBatchMembership as Membership, ) from .doctype.lms_course.lms_course import LMSCourse as Course diff --git a/lms/lms/report/course_progress_summary/course_progress_summary.json b/lms/lms/report/course_progress_summary/course_progress_summary.json index c3e85f54..7b1ecefe 100644 --- a/lms/lms/report/course_progress_summary/course_progress_summary.json +++ b/lms/lms/report/course_progress_summary/course_progress_summary.json @@ -9,13 +9,13 @@ "filters": [], "idx": 0, "is_standard": "Yes", - "modified": "2021-09-28 17:09:40.761819", + "modified": "2021-09-28 17:09:40.761810", "modified_by": "Administrator", "module": "LMS", "name": "Course Progress Summary", "owner": "Administrator", "prepared_report": 0, - "ref_doctype": "LMS Batch Membership", + "ref_doctype": "LMS Enrollment", "report_name": "Course Progress Summary", "report_type": "Script Report", "roles": [ diff --git a/lms/lms/report/course_progress_summary/course_progress_summary.py b/lms/lms/report/course_progress_summary/course_progress_summary.py index 9a54738e..cb39e924 100644 --- a/lms/lms/report/course_progress_summary/course_progress_summary.py +++ b/lms/lms/report/course_progress_summary/course_progress_summary.py @@ -21,7 +21,7 @@ def get_data(filters=None): query_filter = {"course": filters.course} memberships = frappe.get_all( - "LMS Batch Membership", + "LMS Enrollment", query_filter, ["name", "course", "member", "member_name", "progress"], order_by="course", diff --git a/lms/lms/utils.py b/lms/lms/utils.py index 74b55d46..f41480b5 100644 --- a/lms/lms/utils.py +++ b/lms/lms/utils.py @@ -63,19 +63,21 @@ def get_membership(course, member=None, batch=None): filters = {"member": member, "course": course} if batch: - filters["batch"] = batch + filters["batch_old"] = batch - is_member = frappe.db.exists("LMS Batch Membership", filters) + is_member = frappe.db.exists("LMS Enrollment", filters) if is_member: membership = frappe.db.get_value( - "LMS Batch Membership", + "LMS Enrollment", filters, - ["name", "batch", "current_lesson", "member_type", "progress"], + ["name", "batch_old", "current_lesson", "member_type", "progress"], as_dict=True, ) - if membership and membership.batch: - membership.batch_title = frappe.db.get_value("LMS Batch", membership.batch, "title") + if membership and membership.batch_old: + membership.batch_title = frappe.db.get_value( + "LMS Batch Old", membership.batch_old, "title" + ) return membership return False @@ -194,9 +196,9 @@ def get_students(course, batch=None): filters = {"course": course, "member_type": "Student"} if batch: - filters["batch"] = batch + filters["batch_old"] = batch - return frappe.get_all("LMS Batch Membership", filters, ["member"]) + return frappe.get_all("LMS Enrollment", filters, ["member"]) def get_average_rating(course): @@ -275,7 +277,7 @@ def get_lesson_url(course, lesson_number): def get_batch(course, batch_name): - return frappe.get_all("LMS Batch", {"name": batch_name, "course": course}) + return frappe.get_all("LMS Batch Old", {"name": batch_name, "course": course}) def get_slugified_chapter_title(chapter): @@ -337,7 +339,7 @@ def get_mentors(course): "User", mentor.mentor, ["name", "username", "full_name", "user_image"] ) member.batch_count = frappe.db.count( - "LMS Batch Membership", {"member": member.name, "member_type": "Mentor"} + "LMS Enrollment", {"member": member.name, "member_type": "Mentor"} ) course_mentors.append(member) return course_mentors @@ -368,9 +370,7 @@ def get_course_progress(course, member=None): def get_initial_members(course): - members = frappe.get_all( - "LMS Batch Membership", {"course": course}, ["member"], limit=3 - ) + members = frappe.get_all("LMS Enrollment", {"course": course}, ["member"], limit=3) member_details = [] for member in members: @@ -423,7 +423,7 @@ def get_popular_courses(): course_membership.append( { "course": course.name, - "members": cint(frappe.db.count("LMS Batch Membership", {"course": course.name})), + "members": cint(frappe.db.count("LMS Enrollment", {"course": course.name})), } ) @@ -648,9 +648,9 @@ def get_restriction_details(): def get_all_memberships(member): return frappe.get_all( - "LMS Batch Membership", + "LMS Enrollment", {"member": member}, - ["name", "course", "batch", "current_lesson", "member_type", "progress"], + ["name", "course", "batch_old", "current_lesson", "member_type", "progress"], ) @@ -724,8 +724,8 @@ def get_chart_data(chart_name, timespan, timegrain, from_date, to_date): @frappe.whitelist() def get_course_completion_data(): - all_membership = frappe.db.count("LMS Batch Membership") - completed = frappe.db.count("LMS Batch Membership", {"progress": ["like", "%100%"]}) + all_membership = frappe.db.count("LMS Enrollment") + completed = frappe.db.count("LMS Enrollment", {"progress": ["like", "%100%"]}) return { "labels": ["Completed", "In Progress"], diff --git a/lms/lms/web_form/add_a_new_batch/add_a_new_batch.json b/lms/lms/web_form/add_a_new_batch/add_a_new_batch.json index e792272c..92614d9c 100644 --- a/lms/lms/web_form/add_a_new_batch/add_a_new_batch.json +++ b/lms/lms/web_form/add_a_new_batch/add_a_new_batch.json @@ -12,14 +12,14 @@ "button_label": "Save", "creation": "2021-04-20 11:37:49.135114", "custom_css": ".datepicker.active {\n background-color: white;\n}\n\n[data-doctype=\"Web Form\"] {\n max-width: 720px;\n margin: 6rem auto;\n}", - "doc_type": "LMS Batch", + "doc_type": "LMS Batch Old", "docstatus": 0, "doctype": "Web Form", "idx": 0, "is_standard": 1, "login_required": 1, "max_attachment_size": 0, - "modified": "2021-06-15 18:49:50.530001", + "modified": "2021-06-15 18:49:50.530002", "modified_by": "Administrator", "module": "LMS", "name": "add-a-new-batch", diff --git a/lms/lms/widgets/CourseCard.html b/lms/lms/widgets/CourseCard.html index edda4130..1fcf2f93 100644 --- a/lms/lms/widgets/CourseCard.html +++ b/lms/lms/widgets/CourseCard.html @@ -1,7 +1,7 @@ {% if frappe.session.user != "Guest" %} -{% set membership = frappe.db.get_value("LMS Batch Membership", +{% set membership = frappe.db.get_value("LMS Enrollment", {"member": frappe.session.user, "course": course.name}, - ["name", "course", "batch", "current_lesson", "member_type", "progress"], as_dict=1) %} + ["name", "course", "batch_old", "current_lesson", "member_type", "progress"], as_dict=1) %} {% set progress = frappe.utils.cint(membership.progress) %} {% else %} {% set membership, progress = None, None %} @@ -123,7 +123,7 @@ {% set lesson_index = get_lesson_index(membership.current_lesson) or "1.1" %} - {% set query_parameter = "?batch=" + membership.batch if membership.batch else "" %} + {% set query_parameter = "?batch=" + membership.batch_old if membership.batch_old else "" %} diff --git a/lms/lms/workspace/lms/lms.json b/lms/lms/workspace/lms/lms.json index 474c3a1a..d3d51300 100644 --- a/lms/lms/workspace/lms/lms.json +++ b/lms/lms/workspace/lms/lms.json @@ -144,7 +144,7 @@ "type": "Link" } ], - "modified": "2023-05-11 15:41:25.514442", + "modified": "2023-05-11 15:41:25.514443", "modified_by": "Administrator", "module": "LMS", "name": "LMS", @@ -161,7 +161,7 @@ "doc_view": "List", "format": "{} Enrolled", "label": "Enrollments", - "link_to": "LMS Batch Membership", + "link_to": "LMS Enrollment", "stats_filter": "{\"member_type\":[\"=\",\"Student\"]}", "type": "DocType" }, @@ -170,7 +170,7 @@ "doc_view": "List", "format": "{} Completed", "label": "Course Completed", - "link_to": "LMS Batch Membership", + "link_to": "LMS Enrollment", "stats_filter": "{\"progress\":[\"like\",\"%100%\"]}", "type": "DocType" }, diff --git a/lms/overrides/user.py b/lms/overrides/user.py index db49b2c3..a02db99e 100644 --- a/lms/overrides/user.py +++ b/lms/overrides/user.py @@ -54,7 +54,7 @@ class CustomUser(User): def get_batch_count(self) -> int: """Returns the number of batches authored by this user.""" return frappe.db.count( - "LMS Batch Membership", {"member": self.name, "member_type": "Mentor"} + "LMS Enrollment", {"member": self.name, "member_type": "Mentor"} ) def get_user_reviews(self): @@ -112,7 +112,7 @@ def get_enrolled_courses(): if not course.published: continue course.enrollment_count = frappe.db.count( - "LMS Batch Membership", {"course": course.name, "member_type": "Student"} + "LMS Enrollment", {"course": course.name, "member_type": "Student"} ) course.avg_rating = get_average_rating(course.name) or 0 progress = cint(membership.progress) @@ -134,7 +134,7 @@ def get_course_membership(member=None, member_type=None): if member_type: filters["member_type"] = member_type - return frappe.get_all("LMS Batch Membership", filters, ["name", "course", "progress"]) + return frappe.get_all("LMS Enrollment", filters, ["name", "course", "progress"]) def get_authored_courses(member=None, only_published=True): @@ -167,7 +167,7 @@ def get_authored_courses(member=None, only_published=True): if only_published and detail and not detail.published: continue detail.enrollment_count = frappe.db.count( - "LMS Batch Membership", {"course": detail.name, "member_type": "Student"} + "LMS Enrollment", {"course": detail.name, "member_type": "Student"} ) detail.avg_rating = get_average_rating(detail.name) or 0 course_details.append(detail) diff --git a/lms/patches.txt b/lms/patches.txt index 9c3cda5c..d2f8efef 100644 --- a/lms/patches.txt +++ b/lms/patches.txt @@ -62,4 +62,6 @@ execute:frappe.permissions.reset_perms("Course Evaluator") execute:frappe.permissions.reset_perms("LMS Certificate Request") execute:frappe.permissions.reset_perms("LMS Certificate Evaluation") lms.patches.v1_0.paid_certificate_to_paid_course #18-08-2023 -lms.patches.v1_0.revert_class_registration #18-08-2023 \ No newline at end of file +lms.patches.v1_0.revert_class_registration #18-08-2023 +lms.patches.v1_0.rename_lms_batch_doctype +lms.patches.v1_0.rename_lms_batch_membership_doctype \ No newline at end of file diff --git a/lms/patches/replace_member_with_user_in_batch_membership.py b/lms/patches/replace_member_with_user_in_batch_membership.py index 56811a16..b055778a 100644 --- a/lms/patches/replace_member_with_user_in_batch_membership.py +++ b/lms/patches/replace_member_with_user_in_batch_membership.py @@ -3,7 +3,7 @@ import frappe def execute(): frappe.reload_doc("lms", "doctype", "lms_batch_membership") - memberships = frappe.get_all("LMS Batch Membership", ["member", "name"]) + memberships = frappe.get_all("LMS Enrollment", ["member", "name"]) for membership in memberships: email = frappe.db.get_value("Community Member", membership.member, "email") - frappe.db.set_value("LMS Batch Membership", membership.name, "member", email) + frappe.db.set_value("LMS Enrollment", membership.name, "member", email) diff --git a/lms/patches/v0_0/add_progress_to_membership.py b/lms/patches/v0_0/add_progress_to_membership.py index d79c238d..610f4b50 100644 --- a/lms/patches/v0_0/add_progress_to_membership.py +++ b/lms/patches/v0_0/add_progress_to_membership.py @@ -7,7 +7,7 @@ from lms.lms.utils import get_course_progress def execute(): frappe.reload_doc("lms", "doctype", "lms_batch_membership") memberships = frappe.get_all( - "LMS Batch Membership", ["name", "course", "member"], order_by="course" + "LMS Enrollment", ["name", "course", "member"], order_by="course" ) if len(memberships): @@ -17,7 +17,7 @@ def execute(): current_course = membership.course progress = rounded(get_course_progress(current_course, membership.member)) - frappe.db.set_value("LMS Batch Membership", membership.name, "progress", progress) + frappe.db.set_value("LMS Enrollment", membership.name, "progress", progress) frappe.db.delete("Prepared Report", {"ref_report_doctype": "Course Progress Summary"}) frappe.db.set_value("Report", "Course Progress Summary", "prepared_report", 0) diff --git a/lms/patches/v0_0/convert_progress_to_float.py b/lms/patches/v0_0/convert_progress_to_float.py index 28ba459a..4fb0b513 100644 --- a/lms/patches/v0_0/convert_progress_to_float.py +++ b/lms/patches/v0_0/convert_progress_to_float.py @@ -4,8 +4,8 @@ from frappe.utils import flt def execute(): frappe.reload_doc("lms", "doctype", "lms_course_progress") - progress_records = frappe.get_all("LMS Batch Membership", fields=["name", "progress"]) + progress_records = frappe.get_all("LMS Enrollment", fields=["name", "progress"]) for progress in progress_records: frappe.db.set_value( - "LMS Batch Membership", progress.name, "progress", flt(progress.progress) + "LMS Enrollment", progress.name, "progress", flt(progress.progress) ) diff --git a/lms/patches/v1_0/rename_lms_batch_doctype.py b/lms/patches/v1_0/rename_lms_batch_doctype.py new file mode 100644 index 00000000..3133f892 --- /dev/null +++ b/lms/patches/v1_0/rename_lms_batch_doctype.py @@ -0,0 +1,13 @@ +import frappe +from frappe.model.rename_doc import rename_doc + + +def execute(): + if frappe.db.exists("DocType", "LMS Batch Old"): + return + + frappe.flags.ignore_route_conflict_validation = True + rename_doc("DocType", "LMS Batch", "LMS Batch Old") + frappe.flags.ignore_route_conflict_validation = False + + frappe.reload_doctype("LMS Batch Old", force=True) diff --git a/lms/patches/v1_0/rename_lms_batch_membership_doctype.py b/lms/patches/v1_0/rename_lms_batch_membership_doctype.py new file mode 100644 index 00000000..2a0d71c2 --- /dev/null +++ b/lms/patches/v1_0/rename_lms_batch_membership_doctype.py @@ -0,0 +1,13 @@ +import frappe +from frappe.model.rename_doc import rename_doc + + +def execute(): + if frappe.db.exists("DocType", "LMS Enrollment"): + return + + frappe.flags.ignore_route_conflict_validation = True + rename_doc("DocType", "LMS Batch Membership", "LMS Enrollment") + frappe.flags.ignore_route_conflict_validation = False + + frappe.reload_doctype("LMS Enrollment", force=True) diff --git a/lms/subscription_utils.py b/lms/subscription_utils.py index 808bcf32..35971180 100644 --- a/lms/subscription_utils.py +++ b/lms/subscription_utils.py @@ -47,4 +47,4 @@ def get_add_on_members(plan: str) -> int: def get_members() -> int: - return frappe.db.count("LMS Batch Membership") + return frappe.db.count("LMS Enrollment") diff --git a/lms/templates/statistics.html b/lms/templates/statistics.html index 347107c4..c33d6d1e 100644 --- a/lms/templates/statistics.html +++ b/lms/templates/statistics.html @@ -1,75 +1,42 @@
- {{ frappe.db.count("Cohort Subgroup", {"cohort": cohort.name}) }} {{ _("Subgroups") }} - | {{ frappe.db.count("Cohort Mentor", {"cohort": cohort.name}) }} {{ _("Mentors") }} - | {{ frappe.db.count("LMS Batch Membership", {"cohort": cohort.name}) }} {{ _("Students") }} - | {{ frappe.db.count("Cohort Join Request", {"cohort": cohort.name}) }} {{ _("Join Requests") }} + {{ frappe.db.count("Cohort Subgroup", {"cohort": cohort.name}) }} {{ + _("Subgroups") }} | {{ frappe.db.count("Cohort Mentor", {"cohort": + cohort.name}) }} {{ _("Mentors") }} | {{ frappe.db.count("LMS Enrollment", + {"cohort": cohort.name}) }} {{ _("Students") }} | {{ frappe.db.count("Cohort + Join Request", {"cohort": cohort.name}) }} {{ _("Join Requests") }}
-{% if is_mentor %} -{% set sg = mentor.get_subgroup() %} +{% if is_mentor %} {% set sg = mentor.get_subgroup() %}- {{ _("You don't have permission to manage this course.") }} -
- {% endif %} -{% endblock %} - -{% macro render_cohort(course, cohort) %} +{% extends "www/cohorts/base.html" %} {% block title %} _("Manage") {{ +course.title }} {% endblock %} {% block page_content %} {% if cohorts %} +{{ _("You don't have permission to manage this course.") }}
+{% endif %} {% endblock %} {% macro render_cohort(course, cohort) %}- {{ frappe.db.count("Cohort Subgroup", {"cohort": cohort.name}) }} {{ _("Subgroups") }} - | {{ frappe.db.count("Cohort Mentor", {"cohort": cohort.name}) }} {{ _("Mentors") }} - | {{ frappe.db.count("LMS Batch Membership", {"cohort": cohort.name}) }} {{ _("Students") }} - | {{ frappe.db.count("Cohort Join Request", {"cohort": cohort.name}) }} {{ _("Join Requests") }} -
++ {{ frappe.db.count("Cohort Subgroup", {"cohort": cohort.name}) }} {{ + _("Subgroups") }} | {{ frappe.db.count("Cohort Mentor", {"cohort": + cohort.name}) }} {{ _("Mentors") }} | {{ frappe.db.count("LMS + Enrollment", {"cohort": cohort.name}) }} {{ _("Students") }} | {{ + frappe.db.count("Cohort Join Request", {"cohort": cohort.name}) }} + {{ _("Join Requests") }} +
- - -