From 5d2b19cc439820967a612a87abd5152ac4f6bf60 Mon Sep 17 00:00:00 2001 From: Jannat Patel Date: Tue, 1 Aug 2023 10:10:06 +0530 Subject: [PATCH] feat: learning flow in class --- lms/lms/doctype/lms_class/lms_class.js | 21 +++++++ lms/lms/doctype/lms_class/lms_class.json | 25 +++++++- lms/lms/doctype/lms_class/lms_class.py | 12 ++++ lms/lms/doctype/scheduled_flow/__init__.py | 0 .../scheduled_flow/scheduled_flow.json | 60 +++++++++++++++++++ .../doctype/scheduled_flow/scheduled_flow.py | 9 +++ lms/www/classes/class.html | 48 ++++++++++++++- lms/www/classes/class.py | 12 ++++ 8 files changed, 184 insertions(+), 3 deletions(-) create mode 100644 lms/lms/doctype/scheduled_flow/__init__.py create mode 100644 lms/lms/doctype/scheduled_flow/scheduled_flow.json create mode 100644 lms/lms/doctype/scheduled_flow/scheduled_flow.py diff --git a/lms/lms/doctype/lms_class/lms_class.js b/lms/lms/doctype/lms_class/lms_class.js index d3d3e2a2..a460c88e 100644 --- a/lms/lms/doctype/lms_class/lms_class.js +++ b/lms/lms/doctype/lms_class/lms_class.js @@ -11,4 +11,25 @@ frappe.ui.form.on("LMS Class", { }; }); }, + + fetch_lessons: (frm) => { + frm.clear_table("scheduled_flow"); + frappe.call({ + method: "lms.lms.doctype.lms_class.lms_class.fetch_lessons", + args: { + courses: frm.doc.courses, + }, + callback: (r) => { + if (r.message) { + console.log(r.message); + r.message.forEach((lesson) => { + console.log(typeof lesson); + let row = frm.add_child("scheduled_flow"); + row.lesson = lesson.name; + }); + frm.refresh_field("scheduled_flow"); + } + }, + }); + }, }); diff --git a/lms/lms/doctype/lms_class/lms_class.json b/lms/lms/doctype/lms_class/lms_class.json index 7253100b..39f1ed36 100644 --- a/lms/lms/doctype/lms_class/lms_class.json +++ b/lms/lms/doctype/lms_class/lms_class.json @@ -24,6 +24,10 @@ "description", "students", "courses", + "section_break_lbwu", + "fetch_lessons", + "scheduled_flow", + "section_break_ubxi", "custom_component", "assessment_tab", "assessment" @@ -134,11 +138,30 @@ "fieldname": "category", "fieldtype": "Autocomplete", "label": "Category" + }, + { + "fieldname": "section_break_lbwu", + "fieldtype": "Section Break" + }, + { + "fieldname": "scheduled_flow", + "fieldtype": "Table", + "label": "Scheduled Flow", + "options": "Scheduled Flow" + }, + { + "fieldname": "section_break_ubxi", + "fieldtype": "Section Break" + }, + { + "fieldname": "fetch_lessons", + "fieldtype": "Button", + "label": "Fetch Lessons" } ], "index_web_pages_for_search": 1, "links": [], - "modified": "2023-07-13 11:30:09.097605", + "modified": "2023-07-31 15:45:03.839896", "modified_by": "Administrator", "module": "LMS", "name": "LMS Class", diff --git a/lms/lms/doctype/lms_class/lms_class.py b/lms/lms/doctype/lms_class/lms_class.py index 862bec75..36d7d255 100644 --- a/lms/lms/doctype/lms_class/lms_class.py +++ b/lms/lms/doctype/lms_class/lms_class.py @@ -8,6 +8,7 @@ import json from frappe import _ from frappe.model.document import Document from frappe.utils import cint, format_date, format_datetime +from lms.lms.utils import get_lessons class LMSClass(Document): @@ -188,3 +189,14 @@ def create_class( ) class_details.save() return class_details + + +@frappe.whitelist() +def fetch_lessons(courses): + lessons = [] + courses = json.loads(courses) + + for course in courses: + lessons.extend(get_lessons(course.get("course"))) + + return lessons diff --git a/lms/lms/doctype/scheduled_flow/__init__.py b/lms/lms/doctype/scheduled_flow/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lms/lms/doctype/scheduled_flow/scheduled_flow.json b/lms/lms/doctype/scheduled_flow/scheduled_flow.json new file mode 100644 index 00000000..22714acf --- /dev/null +++ b/lms/lms/doctype/scheduled_flow/scheduled_flow.json @@ -0,0 +1,60 @@ +{ + "actions": [], + "allow_rename": 1, + "creation": "2023-07-31 15:10:29.287475", + "default_view": "List", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "lesson", + "date", + "column_break_yikh", + "start_time", + "end_time" + ], + "fields": [ + { + "fieldname": "lesson", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Lesson", + "options": "Course Lesson", + "reqd": 1 + }, + { + "fieldname": "start_time", + "fieldtype": "Time", + "in_list_view": 1, + "label": "Start Time" + }, + { + "fieldname": "end_time", + "fieldtype": "Time", + "in_list_view": 1, + "label": "End Time" + }, + { + "fieldname": "column_break_yikh", + "fieldtype": "Column Break" + }, + { + "fieldname": "date", + "fieldtype": "Date", + "in_list_view": 1, + "label": "Date" + } + ], + "index_web_pages_for_search": 1, + "istable": 1, + "links": [], + "modified": "2023-07-31 16:53:36.829164", + "modified_by": "Administrator", + "module": "LMS", + "name": "Scheduled Flow", + "owner": "Administrator", + "permissions": [], + "sort_field": "modified", + "sort_order": "DESC", + "states": [] +} \ No newline at end of file diff --git a/lms/lms/doctype/scheduled_flow/scheduled_flow.py b/lms/lms/doctype/scheduled_flow/scheduled_flow.py new file mode 100644 index 00000000..a712ec39 --- /dev/null +++ b/lms/lms/doctype/scheduled_flow/scheduled_flow.py @@ -0,0 +1,9 @@ +# Copyright (c) 2023, Frappe and contributors +# For license information, please see license.txt + +# import frappe +from frappe.model.document import Document + + +class ScheduledFlow(Document): + pass diff --git a/lms/www/classes/class.html b/lms/www/classes/class.html index fd264025..c24a9a3b 100644 --- a/lms/www/classes/class.html +++ b/lms/www/classes/class.html @@ -10,7 +10,7 @@ {{ BreadCrumb(class_info) }}
{{ ClassDetails(class_info) }} - {{ ClassSections(class_info, class_courses, class_students, published_courses) }} + {{ ClassSections(class_info, class_courses, class_students, published_courses, flow) }}
@@ -82,7 +82,7 @@ -{% macro ClassSections(class_info, class_courses, class_students, published_courses) %} +{% macro ClassSections(class_info, class_courses, class_students, published_courses, flow) %}
{% if is_moderator %} @@ -92,6 +92,7 @@ {% endif %}
+ {% if flow | length %} +
+ {{ ScheduleSection(flow) }} +
+ {% endif %} +
{{ StudentsSection(class_info, class_students) }}
@@ -450,6 +468,32 @@ {% endmacro %} + +{% macro ScheduleSection(flow) %} +
+
+
+ {{ _("Schedule") }} +
+
+
+
+{% endmacro %} + {%- block script %} {{ super() }} {% if is_moderator %} diff --git a/lms/www/classes/class.py b/lms/www/classes/class.py index 74b4b5a3..25dea202 100644 --- a/lms/www/classes/class.py +++ b/lms/www/classes/class.py @@ -73,6 +73,7 @@ def get_context(context): context.is_student = is_student(class_students) context.all_assignments = get_all_assignments(class_name) context.all_quizzes = get_all_quizzes(class_name) + context.flow = get_scheduled_flow(class_name) def get_all_quizzes(class_name): @@ -185,3 +186,14 @@ def sort_students(class_students): def is_student(class_students): students = [student.student for student in class_students] return frappe.session.user in students + + +def get_scheduled_flow(class_name): + lessons = frappe.get_all("Scheduled Flow", {"parent": class_name}, ["name", "lesson"]) + + for lesson in lessons: + lesson.update( + frappe.db.get_value("Course Lesson", lesson.lesson, ["body"], as_dict=True) + ) + + return lessons