diff --git a/lms/hooks.py b/lms/hooks.py index 801da69c..6eadb4a5 100644 --- a/lms/hooks.py +++ b/lms/hooks.py @@ -145,6 +145,10 @@ website_route_rules = [ "from_route": "/courses//learn/.", "to_route": "batch/learn", }, + { + "from_route": "/courses//learn/./edit", + "to_route": "batch/edit", + }, {"from_route": "/quizzes", "to_route": "batch/quiz_list"}, {"from_route": "/quizzes/", "to_route": "batch/quiz"}, {"from_route": "/classes/", "to_route": "classes/class"}, diff --git a/lms/lms/doctype/lms_class/lms_class.py b/lms/lms/doctype/lms_class/lms_class.py index b2186d5d..cd5d2586 100644 --- a/lms/lms/doctype/lms_class/lms_class.py +++ b/lms/lms/doctype/lms_class/lms_class.py @@ -157,3 +157,22 @@ def authenticate(): } response = requests.request("POST", authenticate_url, headers=headers) return response.json()["access_token"] + + +@frappe.whitelist() +def create_class(title, start_date, end_date, description=None, name=None): + if name: + class_details = frappe.get_doc("LMS Class", name) + else: + class_details = frappe.get_doc({"doctype": "LMS Class"}) + + class_details.update( + { + "title": title, + "start_date": start_date, + "end_date": end_date, + "description": description, + } + ) + class_details.save() + return class_details diff --git a/lms/lms/md.py b/lms/lms/md.py index 1a6b9ed7..770f556d 100644 --- a/lms/lms/md.py +++ b/lms/lms/md.py @@ -42,6 +42,7 @@ def find_macros(text): if not text: return [] macros = re.findall(MACRO_RE, text) + print(macros) # remove the quotes around the argument return [(name, _remove_quotes(arg)) for name, arg in macros] diff --git a/lms/lms/utils.py b/lms/lms/utils.py index 6e1b6e63..4086e111 100644 --- a/lms/lms/utils.py +++ b/lms/lms/utils.py @@ -275,6 +275,7 @@ def get_progress(course, lesson): def render_html(lesson): + print(lesson) youtube = lesson.youtube quiz_id = lesson.quiz_id body = lesson.body diff --git a/lms/lms/web_form/class/__init__.py b/lms/lms/web_form/class/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/lms/lms/web_form/class/class.js b/lms/lms/web_form/class/class.js deleted file mode 100644 index 8f56ebb3..00000000 --- a/lms/lms/web_form/class/class.js +++ /dev/null @@ -1,3 +0,0 @@ -frappe.ready(function () { - // bind events here -}); diff --git a/lms/lms/web_form/class/class.json b/lms/lms/web_form/class/class.json deleted file mode 100644 index f46c2faa..00000000 --- a/lms/lms/web_form/class/class.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "accept_payment": 0, - "allow_comments": 0, - "allow_delete": 0, - "allow_edit": 0, - "allow_incomplete": 0, - "allow_multiple": 0, - "allow_print": 0, - "amount": 0.0, - "amount_based_on_field": 0, - "apply_document_permissions": 0, - "button_label": "Save", - "creation": "2022-11-11 12:10:29.640675", - "custom_css": "", - "doc_type": "LMS Class", - "docstatus": 0, - "doctype": "Web Form", - "idx": 0, - "is_standard": 1, - "list_columns": [], - "login_required": 0, - "max_attachment_size": 0, - "modified": "2022-11-21 10:56:01.627821", - "modified_by": "Administrator", - "module": "LMS", - "name": "class", - "owner": "Administrator", - "payment_button_label": "Buy Now", - "published": 1, - "route": "class", - "show_attachments": 0, - "show_list": 0, - "show_sidebar": 0, - "success_title": "", - "success_url": "/classes", - "title": "Class", - "web_form_fields": [ - { - "allow_read_on_all_link_options": 0, - "fieldname": "title", - "fieldtype": "Data", - "hidden": 0, - "label": "Title", - "max_length": 0, - "max_value": 0, - "read_only": 0, - "reqd": 1, - "show_in_filter": 0 - }, - { - "allow_read_on_all_link_options": 0, - "fieldname": "start_date", - "fieldtype": "Date", - "hidden": 0, - "label": "Start Date", - "max_length": 0, - "max_value": 0, - "read_only": 0, - "reqd": 1, - "show_in_filter": 0 - }, - { - "allow_read_on_all_link_options": 0, - "fieldname": "end_date", - "fieldtype": "Date", - "hidden": 0, - "label": "End Date", - "max_length": 0, - "max_value": 0, - "read_only": 0, - "reqd": 1, - "show_in_filter": 0 - }, - { - "allow_read_on_all_link_options": 0, - "fieldname": "description", - "fieldtype": "Small Text", - "hidden": 0, - "label": "Description", - "max_length": 0, - "max_value": 0, - "read_only": 0, - "reqd": 0, - "show_in_filter": 0 - } - ] -} \ No newline at end of file diff --git a/lms/lms/web_form/class/class.py b/lms/lms/web_form/class/class.py deleted file mode 100644 index 80b7b873..00000000 --- a/lms/lms/web_form/class/class.py +++ /dev/null @@ -1,6 +0,0 @@ -import frappe - - -def get_context(context): - # do your magic here - pass diff --git a/lms/patches.txt b/lms/patches.txt index f4d1f1dd..791d9b3b 100644 --- a/lms/patches.txt +++ b/lms/patches.txt @@ -51,4 +51,5 @@ lms.patches.v0_0.rename_exercise_doctype lms.patches.v0_0.add_question_type #09-04-2023 lms.patches.v0_0.add_evaluator_to_assignment #09-04-2023 lms.patches.v0_0.convert_lesson_markdown_to_html #05-04-2023 -lms.patches.v0_0.convert_course_description_to_html \ No newline at end of file +lms.patches.v0_0.convert_course_description_to_html +execute:frappe.delete_doc("Web Form", "class", ignore_missing=True, force=True) diff --git a/lms/plugins.py b/lms/plugins.py index cc4fb359..72c2259d 100644 --- a/lms/plugins.py +++ b/lms/plugins.py @@ -138,6 +138,7 @@ def youtube_video_renderer(video_id): def video_renderer(src): + print(src) return f"" diff --git a/lms/public/css/style.css b/lms/public/css/style.css index 9cf635b1..59866468 100644 --- a/lms/public/css/style.css +++ b/lms/public/css/style.css @@ -2048,7 +2048,7 @@ select { font-weight: 500; } -.common-page-style .tooltip-content { +.tooltip-content { display: none; } diff --git a/lms/public/js/common_functions.js b/lms/public/js/common_functions.js index 9b134461..56306d1a 100644 --- a/lms/public/js/common_functions.js +++ b/lms/public/js/common_functions.js @@ -51,6 +51,10 @@ frappe.ready(() => { $(".chapter-dropzone").each((i, el) => { setSortable(el); }); + + $("#create-class").click((e) => { + open_class_dialog(e); + }); }); const setSortable = (el) => { @@ -385,3 +389,68 @@ const reorder_chapter = (e) => { }, }); }; + +const open_class_dialog = (e) => { + this.class_dialog = new frappe.ui.Dialog({ + title: __("New Class"), + fields: [ + { + fieldtype: "Data", + label: __("Title"), + fieldname: "title", + reqd: 1, + default: class_info && class_info.title, + }, + { + fieldtype: "Date", + label: __("Start Date"), + fieldname: "start_date", + reqd: 1, + default: class_info && class_info.start_date, + }, + { + fieldtype: "Date", + label: __("End Date"), + fieldname: "end_date", + reqd: 1, + default: class_info && class_info.end_date, + }, + { + fieldtype: "Small Text", + label: __("Description"), + fieldname: "description", + default: class_info && class_info.description, + }, + ], + primary_action_label: __("Save"), + primary_action: (values) => { + create_class(values); + }, + }); + this.class_dialog.show(); +}; + +const create_class = (values) => { + frappe.call({ + method: "lms.lms.doctype.lms_class.lms_class.create_class", + args: { + title: values.title, + start_date: values.start_date, + end_date: values.end_date, + description: values.description, + name: class_info && class_info.name, + }, + callback: (r) => { + if (r.message) { + frappe.show_alert({ + message: class_info + ? __("Class Updated") + : __("Class Created"), + indicator: "green", + }); + this.class_dialog.hide(); + window.location.href = `/classes/${r.message.name}`; + } + }, + }); +}; diff --git a/lms/public/js/editor.js b/lms/public/js/editor.js new file mode 100644 index 00000000..6b30eb64 --- /dev/null +++ b/lms/public/js/editor.js @@ -0,0 +1,5 @@ +import EditorJS from "@editorjs/editorjs"; + +const editor = new EditorJS("body"); + +console.log(editor); diff --git a/lms/public/js/website.bundle.js b/lms/public/js/website.bundle.js index 7d1dfd83..51b30e76 100644 --- a/lms/public/js/website.bundle.js +++ b/lms/public/js/website.bundle.js @@ -1,3 +1,4 @@ import "./profile.js"; import "./common_functions.js"; +import "./editor.js"; import "../../../../frappe/frappe/public/js/frappe/ui/chart.js"; diff --git a/lms/www/batch/edit.html b/lms/www/batch/edit.html new file mode 100644 index 00000000..8281851a --- /dev/null +++ b/lms/www/batch/edit.html @@ -0,0 +1,25 @@ +{% extends "lms/templates/lms_base.html" %} + +{% block title %} +{% if lesson.title %} +{{ lesson.title }} - {{ course.title }} +{% else %} +{{ _("New Lesson") }} +{% endif %} +{% endblock %} + +{% block content %} +
+
+
+
+ {{ _("Title") }} +
+
+ {{ _("Something short and concise.") }} +
+ +
+
+
+{% endblock %} \ No newline at end of file diff --git a/lms/www/batch/edit.py b/lms/www/batch/edit.py new file mode 100644 index 00000000..e7199149 --- /dev/null +++ b/lms/www/batch/edit.py @@ -0,0 +1,10 @@ +import frappe +from lms.www.utils import get_current_lesson_details, get_common_context + + +def get_context(context): + get_common_context(context) + chapter_index = frappe.form_dict.get("chapter") + lesson_index = frappe.form_dict.get("lesson") + lesson_number = f"{chapter_index}.{lesson_index}" + context.lesson = get_current_lesson_details(lesson_number, context) diff --git a/lms/www/batch/learn.js b/lms/www/batch/learn.js index 1d932d58..03873329 100644 --- a/lms/www/batch/learn.js +++ b/lms/www/batch/learn.js @@ -593,7 +593,7 @@ const build_attachment_table = (file_doc) => { }; const make_editor = () => { - this.code_field_group = new frappe.ui.FieldGroup({ + /* this.code_field_group = new frappe.ui.FieldGroup({ fields: [ { fieldname: "code_md", @@ -606,7 +606,7 @@ const make_editor = () => { this.code_field_group.make(); $("#body .form-section:last").removeClass("empty-section"); $("#body .frappe-control").removeClass("hide-control"); - $("#body .form-column").addClass("p-0"); + $("#body .form-column").addClass("p-0"); */ }; const set_file_type = () => { diff --git a/lms/www/batch/learn.py b/lms/www/batch/learn.py index a076cdf8..3b37d21c 100644 --- a/lms/www/batch/learn.py +++ b/lms/www/batch/learn.py @@ -3,7 +3,11 @@ from frappe import _ from frappe.utils import cstr, flt from lms.lms.utils import get_lesson_url, has_course_moderator_role, is_instructor -from lms.www.utils import get_common_context, redirect_to_lesson +from lms.www.utils import ( + get_common_context, + redirect_to_lesson, + get_current_lesson_details, +) def get_context(context): @@ -62,20 +66,6 @@ def get_context(context): } -def get_current_lesson_details(lesson_number, context): - details_list = list(filter(lambda x: cstr(x.number) == lesson_number, context.lessons)) - - if not len(details_list): - if frappe.form_dict.get("edit"): - return None - else: - redirect_to_lesson(context.course) - - lesson_info = details_list[0] - lesson_info.body = lesson_info.body.replace('"', "'") - return lesson_info - - def get_url(lesson_number, course): return ( get_lesson_url(course.name, lesson_number) diff --git a/lms/www/classes/class.html b/lms/www/classes/class.html index 29ce41d4..1df30575 100644 --- a/lms/www/classes/class.html +++ b/lms/www/classes/class.html @@ -61,6 +61,11 @@ {% macro ClassSections(class_info, class_courses, class_students, published_courses) %}
+ + +