diff --git a/community/lms/api.py b/community/lms/api.py index 9cf2fc9d..1ed198e1 100644 --- a/community/lms/api.py +++ b/community/lms/api.py @@ -43,7 +43,7 @@ def save_current_lesson(batch_name, lesson_name): doctype="LMS Batch Membership", filters={ "batch": batch_name, - "member_email": frappe.session.user + "member": frappe.session.user }, fieldname="name") if not name: diff --git a/community/lms/doctype/exercise/exercise.py b/community/lms/doctype/exercise/exercise.py index dde6b273..98da02f4 100644 --- a/community/lms/doctype/exercise/exercise.py +++ b/community/lms/doctype/exercise/exercise.py @@ -54,5 +54,6 @@ class Exercise(Document): image=image, solution=code) doc.insert(ignore_permissions=True) + return doc diff --git a/community/lms/doctype/exercise_submission/exercise_submission.py b/community/lms/doctype/exercise_submission/exercise_submission.py index fd631eb8..886de170 100644 --- a/community/lms/doctype/exercise_submission/exercise_submission.py +++ b/community/lms/doctype/exercise_submission/exercise_submission.py @@ -1,8 +1,13 @@ # Copyright (c) 2021, FOSS United and contributors # For license information, please see license.txt -# import frappe +import frappe from frappe.model.document import Document +from ..lesson.lesson import update_progress class ExerciseSubmission(Document): - pass + + def after_insert(self): + course_details = frappe.get_doc("LMS Course", self.course) + if not (course_details.is_mentor(frappe.session.user) or frappe.flags.in_test): + update_progress(self.lesson) diff --git a/community/lms/doctype/lesson/lesson.py b/community/lms/doctype/lesson/lesson.py index af495cd8..ef1f9825 100644 --- a/community/lms/doctype/lesson/lesson.py +++ b/community/lms/doctype/lesson/lesson.py @@ -65,3 +65,65 @@ class Lesson(Document): The return value would be like 1.2, 2.1 etc. It will be None if there is no next lesson. """ + + def get_progress(self): + return frappe.db.get_value("LMS Course Progress", {"lesson": self.name, "owner": frappe.session.user}, "status") + + def get_slugified_class(self): + if self.get_progress(): + return ("").join([ s for s in self.get_progress().lower().split() ]) + return + +@frappe.whitelist() +def save_progress(lesson, batch): + if not frappe.db.exists("LMS Batch Membership", + { + "member": frappe.session.user, + "batch": batch + }): + return + if frappe.db.exists("LMS Course Progress", + { + "lesson": lesson, + "owner": frappe.session.user + }): + return + + lesson_details = frappe.get_doc("Lesson", lesson) + dynamic_content = frappe.db.count("LMS Section", + filters={ + "type": ["not in", ["example", "text"]], + "parent": lesson_details.name + }) + + status = "Complete" + if dynamic_content: + status = "Partially Complete" + + frappe.get_doc({ + "doctype": "LMS Course Progress", + "lesson": lesson_details.name, + "status": status + }).save(ignore_permissions=True) + +def update_progress(lesson): + user = frappe.session.user + if not all_dynamic_content_submitted(lesson, user): + return + if frappe.db.exists("LMS Course Progress", {"lesson": lesson, "owner": user}): + course_progress = frappe.get_doc("LMS Course Progress", {"lesson": lesson, "owner": user}) + course_progress.status = "Complete" + course_progress.save() + +def all_dynamic_content_submitted(lesson, user): + exercise_names = frappe.get_list("Exercise", {"lesson": lesson}, ["name"], pluck="name") + all_exercises_submitted = False + print(exercise_names) + query = { + "exercise": ["in", exercise_names], + "owner": user + } + if frappe.db.count("Exercise Submission", query) == len(exercise_names): + all_exercises_submitted = True + + return all_exercises_submitted diff --git a/community/lms/doctype/lms_course_progress/__init__.py b/community/lms/doctype/lms_course_progress/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/community/lms/doctype/lms_course_progress/lms_course_progress.js b/community/lms/doctype/lms_course_progress/lms_course_progress.js new file mode 100644 index 00000000..77ef3c16 --- /dev/null +++ b/community/lms/doctype/lms_course_progress/lms_course_progress.js @@ -0,0 +1,8 @@ +// Copyright (c) 2021, FOSS United and contributors +// For license information, please see license.txt + +frappe.ui.form.on('LMS Course Progress', { + // refresh: function(frm) { + + // } +}); diff --git a/community/lms/doctype/lms_course_progress/lms_course_progress.json b/community/lms/doctype/lms_course_progress/lms_course_progress.json new file mode 100644 index 00000000..33d785f6 --- /dev/null +++ b/community/lms/doctype/lms_course_progress/lms_course_progress.json @@ -0,0 +1,78 @@ +{ + "actions": [], + "creation": "2021-05-31 17:20:13.388453", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "status", + "column_break_3", + "lesson", + "chapter", + "course" + ], + "fields": [ + { + "fetch_from": "chapter.course", + "fieldname": "course", + "fieldtype": "Link", + "in_list_view": 1, + "in_standard_filter": 1, + "label": "Course", + "options": "LMS Course", + "read_only": 1 + }, + { + "fetch_from": "lesson.chapter", + "fieldname": "chapter", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Chapter", + "options": "Chapter", + "read_only": 1 + }, + { + "fieldname": "lesson", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Lesson", + "options": "Lesson" + }, + { + "fieldname": "status", + "fieldtype": "Select", + "in_list_view": 1, + "in_standard_filter": 1, + "label": "Status", + "options": "Complete\nPartially Complete\nIncomplete" + }, + { + "fieldname": "column_break_3", + "fieldtype": "Column Break" + } + ], + "index_web_pages_for_search": 1, + "links": [], + "modified": "2021-06-02 13:05:31.114939", + "modified_by": "Administrator", + "module": "LMS", + "name": "LMS Course Progress", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "write": 1 + } + ], + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 +} \ No newline at end of file diff --git a/community/lms/doctype/lms_course_progress/lms_course_progress.py b/community/lms/doctype/lms_course_progress/lms_course_progress.py new file mode 100644 index 00000000..98a022b7 --- /dev/null +++ b/community/lms/doctype/lms_course_progress/lms_course_progress.py @@ -0,0 +1,8 @@ +# Copyright (c) 2021, FOSS United and contributors +# For license information, please see license.txt + +# import frappe +from frappe.model.document import Document + +class LMSCourseProgress(Document): + pass diff --git a/community/lms/doctype/lms_course_progress/test_lms_course_progress.py b/community/lms/doctype/lms_course_progress/test_lms_course_progress.py new file mode 100644 index 00000000..9eabd5d3 --- /dev/null +++ b/community/lms/doctype/lms_course_progress/test_lms_course_progress.py @@ -0,0 +1,8 @@ +# Copyright (c) 2021, FOSS United and Contributors +# See license.txt + +# import frappe +import unittest + +class TestLMSCourseProgress(unittest.TestCase): + pass diff --git a/community/lms/web_form/add_a_new_batch/add_a_new_batch.json b/community/lms/web_form/add_a_new_batch/add_a_new_batch.json index e1785069..76735390 100644 --- a/community/lms/web_form/add_a_new_batch/add_a_new_batch.json +++ b/community/lms/web_form/add_a_new_batch/add_a_new_batch.json @@ -19,7 +19,7 @@ "is_standard": 1, "login_required": 1, "max_attachment_size": 0, - "modified": "2021-04-30 11:22:18.188712", + "modified": "2021-06-02 15:52:06.383260", "modified_by": "Administrator", "module": "LMS", "name": "add-a-new-batch", @@ -38,13 +38,13 @@ { "allow_read_on_all_link_options": 0, "fieldname": "course", - "fieldtype": "Data", - "hidden": 0, + "fieldtype": "Link", + "hidden": 1, "label": "Course", "max_length": 0, "max_value": 0, - "options": "", - "read_only": 1, + "options": "LMS Course", + "read_only": 0, "reqd": 0, "show_in_filter": 0 }, @@ -111,4 +111,4 @@ "show_in_filter": 0 } ] -} +} \ No newline at end of file diff --git a/community/lms/widgets/ChapterTeaser.html b/community/lms/widgets/ChapterTeaser.html index 49f3af78..1678b1bb 100644 --- a/community/lms/widgets/ChapterTeaser.html +++ b/community/lms/widgets/ChapterTeaser.html @@ -8,6 +8,9 @@ {% for lesson in chapter.get_lessons() %}
{% endfor %} diff --git a/community/lms/widgets/CourseOutline.html b/community/lms/widgets/CourseOutline.html index 9dd26835..249013ff 100644 --- a/community/lms/widgets/CourseOutline.html +++ b/community/lms/widgets/CourseOutline.html @@ -1,5 +1,5 @@