From 833e714a1fa1948993dccf49ef8c8c04a8b89c2d Mon Sep 17 00:00:00 2001 From: Jannat Patel Date: Thu, 31 Aug 2023 21:33:09 +0530 Subject: [PATCH 1/3] feat: embeds in lesson --- lms/hooks.py | 1 + lms/plugins.py | 14 ++++++++++++++ lms/public/css/style.css | 4 ++++ lms/www/batch/edit.html | 1 + lms/www/batch/edit.js | 29 +++++++++++++++++++++++++++++ 5 files changed, 49 insertions(+) diff --git a/lms/hooks.py b/lms/hooks.py index f8796e7e..e78659ab 100644 --- a/lms/hooks.py +++ b/lms/hooks.py @@ -295,6 +295,7 @@ lms_markdown_macro_renderers = { "YouTubeVideo": "lms.plugins.youtube_video_renderer", "Video": "lms.plugins.video_renderer", "Assignment": "lms.plugins.assignment_renderer", + "Embed": "lms.plugins.embed_renderer", } # page_renderer to manage profile pages diff --git a/lms/plugins.py b/lms/plugins.py index 69571476..a171e05e 100644 --- a/lms/plugins.py +++ b/lms/plugins.py @@ -155,6 +155,20 @@ def youtube_video_renderer(video_id): """ +def embed_renderer(details): + src = details.split("|||")[1] + return f""" + + """ + + def video_renderer(src): return ( f"" diff --git a/lms/public/css/style.css b/lms/public/css/style.css index c3f156a3..e5f5149f 100644 --- a/lms/public/css/style.css +++ b/lms/public/css/style.css @@ -2344,4 +2344,8 @@ select { grid-template-columns: 1fr 1fr; grid-gap: 0.5rem; margin-bottom: 1rem; +} + +.embed-tool__caption { + display: none; } \ No newline at end of file diff --git a/lms/www/batch/edit.html b/lms/www/batch/edit.html index 0ba36106..7ad0b37b 100644 --- a/lms/www/batch/edit.html +++ b/lms/www/batch/edit.html @@ -128,5 +128,6 @@ + {% endblock %} diff --git a/lms/www/batch/edit.js b/lms/www/batch/edit.js index 6b050957..ada34259 100644 --- a/lms/www/batch/edit.js +++ b/lms/www/batch/edit.js @@ -26,6 +26,22 @@ const setup_editor = () => { self.editor = new EditorJS({ holder: "lesson-content", tools: { + embed: { + class: Embed, + config: { + services: { + youtube: true, + vimeo: true, + codepen: true, + slides: { + regex: /https:\/\/docs\.google\.com\/presentation\/d\/e\/([A-Za-z0-9_-]+)\/pub/, + embedUrl: + "https://docs.google.com/presentation/d/e/<%= remote_id %>/embed", + html: "", + }, + }, + }, + }, header: { class: Header, inlineToolbar: ["bold", "italic", "link"], @@ -84,6 +100,15 @@ const parse_string_to_lesson = () => { file_url: video, }, }); + } else if (block.includes("{{ Embed")) { + let embed = block.match(/'([^']+)'/)[1]; + lesson_blocks.push({ + type: "embed", + data: { + service: embed.split("|||")[0], + embed: embed.split("|||")[1], + }, + }); } else if (block.includes("![]")) { let image = block.match(/\((.*?)\)/)[1]; lesson_blocks.push({ @@ -139,6 +164,10 @@ const parse_lesson_to_string = (data) => { "#".repeat(block.data.level) + ` ${block.data.text}\n`; } else if (block.type == "paragraph") { lesson_content += `${block.data.text}\n`; + } else if (block.type == "embed") { + lesson_content += `{{ Embed("${ + block.data.service + }|||${block.data.embed.replace(/&/g, "&")}") }}\n`; } }); save(lesson_content); From ffd9d56896be90348175c45d628e4ccd9603cb94 Mon Sep 17 00:00:00 2001 From: Jannat Patel Date: Thu, 31 Aug 2023 23:29:56 +0530 Subject: [PATCH 2/3] feat: embed pdf --- .../doctype/course_lesson/course_lesson.json | 6 ++-- lms/lms/utils.py | 3 +- lms/plugins.py | 29 ++++++++++++------- lms/www/batch/edit.js | 10 +++++++ lms/www/batch/learn.html | 2 +- 5 files changed, 35 insertions(+), 15 deletions(-) diff --git a/lms/lms/doctype/course_lesson/course_lesson.json b/lms/lms/doctype/course_lesson/course_lesson.json index dc224a69..3fd75f37 100644 --- a/lms/lms/doctype/course_lesson/course_lesson.json +++ b/lms/lms/doctype/course_lesson/course_lesson.json @@ -23,8 +23,8 @@ "column_break_15", "file_type", "section_break_11", - "instructor_notes", "body", + "instructor_notes", "help_section", "help" ], @@ -135,13 +135,13 @@ }, { "fieldname": "instructor_notes", - "fieldtype": "Text Editor", + "fieldtype": "Text", "label": "Instructor Notes" } ], "index_web_pages_for_search": 1, "links": [], - "modified": "2023-08-31 11:11:22.034553", + "modified": "2023-08-31 21:47:06.314995", "modified_by": "Administrator", "module": "LMS", "name": "Course Lesson", diff --git a/lms/lms/utils.py b/lms/lms/utils.py index f101e9f0..5347c2e0 100644 --- a/lms/lms/utils.py +++ b/lms/lms/utils.py @@ -147,6 +147,8 @@ def get_lesson_details(chapter): ) lesson_details.number = flt(f"{chapter.idx}.{row.idx}") lesson_details.icon = get_lesson_icon(lesson_details.body) + if lesson_details.instructor_notes: + lesson_details.instructor_notes = markdown_to_html(lesson_details.instructor_notes) lessons.append(lesson_details) return lessons @@ -311,7 +313,6 @@ def render_html(lesson): if lesson.question: assignment = "{{ Assignment('" + lesson.question + "-" + lesson.file_type + "') }}" text = text + assignment - return markdown_to_html(text) diff --git a/lms/plugins.py b/lms/plugins.py index a171e05e..bc763238 100644 --- a/lms/plugins.py +++ b/lms/plugins.py @@ -156,9 +156,17 @@ def youtube_video_renderer(video_id): def embed_renderer(details): + type = details.split("|||")[0] src = details.split("|||")[1] + width = "100%" + height = "400" + + if type == "pdf": + width = "75%" + height = "600" + return f""" - ", }, + pdf: { + regex: /(https?:\/\/.*\.pdf)/, + embedUrl: "<%= remote_id %>", + html: "", + }, }, }, }, @@ -165,6 +170,11 @@ const parse_lesson_to_string = (data) => { } else if (block.type == "paragraph") { lesson_content += `${block.data.text}\n`; } else if (block.type == "embed") { + if (block.data.service == "pdf") { + if (!block.data.embed.startsWith(window.location.origin)) { + frappe.throw(__("Invalid PDF URL")); + } + } lesson_content += `{{ Embed("${ block.data.service }|||${block.data.embed.replace(/&/g, "&")}") }}\n`; diff --git a/lms/www/batch/learn.html b/lms/www/batch/learn.html index 8f44c010..743a01fc 100644 --- a/lms/www/batch/learn.html +++ b/lms/www/batch/learn.html @@ -157,7 +157,7 @@ {% if lesson.instructor_notes and (is_moderator or instructor or is_evaluator) %}
-
+
{{ _("Instructor Notes") }}
From ce09f273734dccbe3628c1efd7f6c118133bcbe4 Mon Sep 17 00:00:00 2001 From: Jannat Patel Date: Thu, 31 Aug 2023 23:32:46 +0530 Subject: [PATCH 3/3] fix: assignment renderer --- lms/lms/utils.py | 1 + lms/plugins.py | 19 +++++++++---------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lms/lms/utils.py b/lms/lms/utils.py index 5347c2e0..2829f5d6 100644 --- a/lms/lms/utils.py +++ b/lms/lms/utils.py @@ -313,6 +313,7 @@ def render_html(lesson): if lesson.question: assignment = "{{ Assignment('" + lesson.question + "-" + lesson.file_type + "') }}" text = text + assignment + return markdown_to_html(text) diff --git a/lms/plugins.py b/lms/plugins.py index bc763238..59dcd3ab 100644 --- a/lms/plugins.py +++ b/lms/plugins.py @@ -183,21 +183,20 @@ def video_renderer(src): ) -def assignment_renderer(name): - - """supported_types = { - "Document": ".doc,.docx,.xml,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document", - "PDF": ".pdf", - "Image": ".png, .jpg, .jpeg", - "Video": "video/*", +def assignment_renderer(detail): + supported_types = { + "Document": ".doc,.docx,.xml,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + "PDF": ".pdf", + "Image": ".png, .jpg, .jpeg", + "Video": "video/*", } question = detail.split("-")[0] file_type = detail.split("-")[1] accept = supported_types[file_type] if file_type else "" return frappe.render_template( - "templates/assignment.html", - {"question": question, "accept": accept, "file_type": file_type}, - )""" + "templates/assignment.html", + {"question": question, "accept": accept, "file_type": file_type}, + ) def show_custom_signup():