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 151b993a..7b7439d6 100644 --- a/community/lms/doctype/exercise/exercise.py +++ b/community/lms/doctype/exercise/exercise.py @@ -4,6 +4,7 @@ import frappe from frappe.model.document import Document from ..lms_sketch.livecode import livecode_to_svg +from ..lesson.lesson import update_progress class Exercise(Document): def before_save(self): @@ -55,5 +56,9 @@ class Exercise(Document): image=image, solution=code) doc.insert(ignore_permissions=True) + + if not course.is_mentor(frappe.session.user): + update_progress(self.lesson) + return doc diff --git a/community/lms/doctype/lesson/lesson.py b/community/lms/doctype/lesson/lesson.py index 979515ea..f22592ca 100644 --- a/community/lms/doctype/lesson/lesson.py +++ b/community/lms/doctype/lesson/lesson.py @@ -43,3 +43,54 @@ 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): + 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 + 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): + exercises = frappe.get_all("Exercise", {"lesson": lesson}, ["name"]) + all_exercises_submitted = True + for exercise in exercises: + if not frappe.db.count("Exercise Submission", {"exercise": exercise.name, "owner": user}): + all_exercises_submitted = False + + 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/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 @@