-
- {{ BreadCrumb(course, lesson) }}
-
-
- {{ widgets.CourseOutline(course=course, membership=membership) }}
-
-
+
+ {{ BreadCrumb(course, lesson) }}
+
+
+ {{ widgets.CourseOutline(course=course, membership=membership) }}
+
+
+
-
{% endblock %}
@@ -58,63 +58,106 @@
{% set instructors = get_instructors(course.name) %}
{% set is_instructor = is_instructor(course.name) %}
-
+
-
{% if lesson.title %} {{ lesson.title }} {% endif %}
-
{{ _("COMPLETED") }}
+
+
{% if lesson.title %}{{ lesson.title }}{% endif %}
+
{{ _("COMPLETED") }}
- {% if is_instructor %}
-
{{ _("Edit") }}
- {% endif %}
-
-
-
-
- {% if membership or lesson.include_in_preview or is_instructor %}
- {% if is_instructor and not lesson.include_in_preview %}
-
- {{ _("This lesson is not available for preview. As you are the Instructor of the course only you can see it.") }}
-
×
-
- {% endif %}
- {{ render_html(lesson.body) }}
- {% else %}
-
-
{{ _("Start Learning") }}
-
{{ _("This lesson is not available for preview. Please join the course to access it.") }}
-
- {% endif %}
-
+
+
+
+
+
+ {% if membership or lesson.include_in_preview or is_instructor %}
+
+ {% if is_instructor and not lesson.include_in_preview and not lesson.edit_mode %}
+
+ {{ _("This lesson is not available for preview. As you are the Instructor of the course only you can see it.") }}
+
×
+
+ {% endif %}
+
+ {% if lesson.edit_mode %}
+
+
+
+
+
+ 0 {{ _("attachments") }}
+
+
+
+
+ {{ _("Upload Attachments") }}
+
+
+
+
+
+
+
+
+
{% if lesson.body %} {{ lesson.body }} {% endif %}
+
+
+ {% else %}
+ {{ render_html(lesson.body) }}
+ {% endif %}
+
+ {% else %}
+
+
{{ _("Start Learning") }}
+
{{ _("This lesson is not available for preview. Please join the course to access it.") }}
+
+ {% endif %}
+
+
+ {% if not lesson.edit_mode %}
+ {{ pagination(prev_url, next_url) }}
+ {% endif %}
{% endmacro %}
diff --git a/lms/www/batch/learn.js b/lms/www/batch/learn.js
index 17c0e076..621bccc7 100644
--- a/lms/www/batch/learn.js
+++ b/lms/www/batch/learn.js
@@ -45,12 +45,29 @@ frappe.ready(() => {
clear_work(e);
});
+ $(".btn-lesson").click((e) => {
+ save_lesson(e);
+ });
+
+ $(".add-attachment").click((e) => {
+ show_upload_modal();
+ });
+
$(".btn-start-quiz").click((e) => {
$("#start-banner").addClass("hide");
$("#quiz-form").removeClass("hide");
mark_active_question();
});
+ $(".btn-edit").click((e) => {
+ window.location.href = `${window.location.href}?edit=1`;
+ });
+
+ $(document).on("click", ".copy-link", (e) => {
+ frappe.utils.copy_to_clipboard($(e.currentTarget).data("link"));
+ $(".attachments").collapse("hide");
+ });
+
if ($("#quiz-title").data("max-attempts")) {
window.addEventListener("beforeunload", (e) => {
e.returnValue = "";
@@ -59,23 +76,26 @@ frappe.ready(() => {
}
});
+
const save_current_lesson = () => {
- if ($(".title").hasClass("is-member")) {
- frappe.call("lms.lms.api.save_current_lesson", {
- course_name: $(".title").attr("data-course"),
- lesson_name: $(".title").attr("data-lesson")
- })
- }
+ if ($(".title").hasClass("is-member")) {
+ frappe.call("lms.lms.api.save_current_lesson", {
+ course_name: $(".title").attr("data-course"),
+ lesson_name: $(".title").attr("data-lesson")
+ });
+ }
};
+
const enable_check = (e) => {
- if ($(".option:checked").length) {
- $("#check").removeAttr("disabled");
- $(".custom-checkbox").removeClass("active-option");
- $(".option:checked").closest(".custom-checkbox").addClass("active-option");
- }
+ if ($(".option:checked").length) {
+ $("#check").removeAttr("disabled");
+ $(".custom-checkbox").removeClass("active-option");
+ $(".option:checked").closest(".custom-checkbox").addClass("active-option");
+ }
};
+
const mark_active_question = (e = undefined) => {
$(".timer").addClass("hide");
calculate_and_display_time(100);
@@ -92,82 +112,87 @@ const mark_active_question = (e = undefined) => {
initialize_timer();
};
+
const mark_progress = (e) => {
- /* Prevent default only for Next button anchor tag and not for progress checkbox */
- if ($(e.currentTarget).prop("nodeName") != "INPUT")
- e.preventDefault();
- else
- return;
+ /* Prevent default only for Next button anchor tag and not for progress checkbox */
+ if ($(e.currentTarget).prop("nodeName") != "INPUT")
+ e.preventDefault();
+ else
+ return;
- const target = $(e.currentTarget).attr("data-progress") ? $(e.currentTarget) : $("input.mark-progress");
- const current_status = $(".lesson-progress").hasClass("hide") ? "Incomplete": "Complete";
+ const target = $(e.currentTarget).attr("data-progress") ? $(e.currentTarget) : $("input.mark-progress");
+ const current_status = $(".lesson-progress").hasClass("hide") ? "Incomplete": "Complete";
- let status = "Incomplete";
- if (target.prop("nodeName") == "INPUT" && target.prop("checked")) {
- status = "Complete";
- }
+ let status = "Incomplete";
+ if (target.prop("nodeName") == "INPUT" && target.prop("checked")) {
+ status = "Complete";
+ }
- if (status != current_status) {
- frappe.call({
- method: "lms.lms.doctype.course_lesson.course_lesson.save_progress",
- args: {
- lesson: $(".title").attr("data-lesson"),
- course: $(".title").attr("data-course"),
- status: status
- },
- callback: (data) => {
- change_progress_indicators(status, e);
- show_certificate_if_course_completed(data);
+ if (status != current_status) {
+ frappe.call({
+ method: "lms.lms.doctype.course_lesson.course_lesson.save_progress",
+ args: {
+ lesson: $(".title").attr("data-lesson"),
+ course: $(".title").attr("data-course"),
+ status: status
+ },
+ callback: (data) => {
+ change_progress_indicators(status, e);
+ show_certificate_if_course_completed(data);
+ move_to_next_lesson(status, e);
+ }
+ });
+ }
+ else
move_to_next_lesson(status, e);
- }
- });
- }
- else
- move_to_next_lesson(status, e);
};
+
const change_progress_indicators = (status, e) => {
- if (status == "Complete") {
- $(".lesson-progress").removeClass("hide");
- $(".active-lesson .lesson-progress-tick").removeClass("hide");
- }
- else {
- $(".lesson-progress").addClass("hide");
- $(".active-lesson .lesson-progress-tick").addClass("hide");
- }
- if (status == "Incomplete" && !$(e.currentTarget).hasClass("next")) {
- $(e.currentTarget).addClass("hide");
- $("input.mark-progress").prop("checked", false).closest(".custom-checkbox").removeClass("hide");
- }
+ if (status == "Complete") {
+ $(".lesson-progress").removeClass("hide");
+ $(".active-lesson .lesson-progress-tick").removeClass("hide");
+ }
+ else {
+ $(".lesson-progress").addClass("hide");
+ $(".active-lesson .lesson-progress-tick").addClass("hide");
+ }
+ if (status == "Incomplete" && !$(e.currentTarget).hasClass("next")) {
+ $(e.currentTarget).addClass("hide");
+ $("input.mark-progress").prop("checked", false).closest(".custom-checkbox").removeClass("hide");
+ }
};
+
const show_certificate_if_course_completed = (data) => {
- if (data.message == 100 && !$(".next").attr("data-next") && $("#certification").hasClass("hide")) {
- $("#certification").removeClass("hide");
- $(".next").addClass("hide");
- }
+ if (data.message == 100 && !$(".next").attr("data-next") && $("#certification").hasClass("hide")) {
+ $("#certification").removeClass("hide");
+ $(".next").addClass("hide");
+ }
};
+
const move_to_next_lesson = (status, e) => {
- if ($(e.currentTarget).hasClass("next") && $(e.currentTarget).attr("data-href")) {
- window.location.href = $(e.currentTarget).attr("data-href");
- }
- else if (status == "Complete") {
- $("input.mark-progress").closest(".custom-checkbox").addClass("hide");
- $("div.mark-progress").removeClass("hide");
- $(".next").addClass("hide");
- }
- else {
- $("input.mark-progress").closest(".custom-checkbox").removeClass("hide");
- $("div.mark-progress").addClass("hide");
- $(".next").removeClass("hide");
- }
+ if ($(e.currentTarget).hasClass("next") && $(e.currentTarget).attr("data-href")) {
+ window.location.href = $(e.currentTarget).attr("data-href");
+ }
+ else if (status == "Complete") {
+ $("input.mark-progress").closest(".custom-checkbox").addClass("hide");
+ $("div.mark-progress").removeClass("hide");
+ $(".next").addClass("hide");
+ }
+ else {
+ $("input.mark-progress").closest(".custom-checkbox").removeClass("hide");
+ $("div.mark-progress").addClass("hide");
+ $(".next").removeClass("hide");
+ }
};
+
const quiz_summary = (e=undefined) => {
e && e.preventDefault();
- var quiz_name = $("#quiz-title").text();
- var total_questions = $(".question").length;
+ let quiz_name = $("#quiz-title").text();
+ let total_questions = $(".question").length;
frappe.call({
method: "lms.lms.doctype.lms_quiz.lms_quiz.quiz_summary",
args: {
@@ -175,7 +200,7 @@ const quiz_summary = (e=undefined) => {
"results": localStorage.getItem(quiz_name)
},
callback: (data) => {
- var message = data.message == total_questions ? __("Excellent Work 👏") : __("Better luck next time")
+ let message = data.message == total_questions ? __("Excellent Work 👏") : __("Better luck next time")
$(".question").addClass("hide");
$("#summary").addClass("hide");
$("#quiz-form").parent().prepend(
@@ -183,20 +208,22 @@ const quiz_summary = (e=undefined) => {
${data.message}/${total_questions}
`);
$("#try-again").removeClass("hide");
}
- })
+ });
};
+
const try_quiz_again = (e) => {
- window.location.reload();
+ window.location.reload();
};
+
const check_answer = (e=undefined) => {
e && e.preventDefault();
clearInterval(self.timer);
$(".timer").addClass("hide");
- var quiz_name = $("#quiz-title").text();
- var total_questions = $(".question").length;
- var current_index = $(".active-question").attr("data-qt-index");
+ let quiz_name = $("#quiz-title").text();
+ let total_questions = $(".question").length;
+ let current_index = $(".active-question").attr("data-qt-index");
$(".explanation").removeClass("hide");
$("#check").addClass("hide");
@@ -212,193 +239,205 @@ const check_answer = (e=undefined) => {
else {
$("#next").removeClass("hide");
}
- var [answer, is_correct] = parse_options();
+ let [answer, is_correct] = parse_options();
add_to_local_storage(quiz_name, current_index, answer, is_correct);
};
+
const parse_options = () => {
- var answer = [];
- var is_correct = [];
- $(".active-question input").each((i, element) => {
- var correct = parseInt($(element).attr("data-correct"));
- if ($(element).prop("checked")) {
- answer.push(decodeURIComponent($(element).val()));
- correct && is_correct.push(1);
- correct ? add_icon(element, "check") : add_icon(element, "wrong");
- }
- else {
- correct && is_correct.push(0);
- correct ? add_icon(element, "minus-circle-green") : add_icon(element, "minus-circle");
- }
- })
- return [answer, is_correct];
+ let answer = [];
+ let is_correct = [];
+ $(".active-question input").each((i, element) => {
+ let correct = parseInt($(element).attr("data-correct"));
+ if ($(element).prop("checked")) {
+ answer.push(decodeURIComponent($(element).val()));
+ correct && is_correct.push(1);
+ correct ? add_icon(element, "check") : add_icon(element, "wrong");
+ }
+ else {
+ correct && is_correct.push(0);
+ correct ? add_icon(element, "minus-circle-green") : add_icon(element, "minus-circle");
+ }
+ });
+ return [answer, is_correct];
};
+
const add_icon = (element, icon) => {
- $(element).closest(".custom-checkbox").removeClass("active-option");
- var label = $(element).siblings(".option-text").text();
- $(element).siblings(".option-text").html(`
-
-

- ${label}
-
- `);
- //$(element).parent().empty().html(`

${label}
`);
+ $(element).closest(".custom-checkbox").removeClass("active-option");
+ let label = $(element).siblings(".option-text").text();
+ $(element).siblings(".option-text").html(`
+
+

+ ${label}
+
+ `);
+ //$(element).parent().empty().html(`

${label}
`);
};
+
const add_to_local_storage = (quiz_name, current_index, answer, is_correct) => {
- var quiz_stored = JSON.parse(localStorage.getItem(quiz_name));
- var quiz_obj = {
- "question_index": current_index,
- "answer": answer.join(),
- "is_correct": is_correct
- }
- quiz_stored ? quiz_stored.push(quiz_obj) : quiz_stored = [quiz_obj]
- localStorage.setItem(quiz_name, JSON.stringify(quiz_stored))
+ let quiz_stored = JSON.parse(localStorage.getItem(quiz_name));
+ let quiz_obj = {
+ "question_index": current_index,
+ "answer": answer.join(),
+ "is_correct": is_correct
+ }
+ quiz_stored ? quiz_stored.push(quiz_obj) : quiz_stored = [quiz_obj]
+ localStorage.setItem(quiz_name, JSON.stringify(quiz_stored))
};
+
const create_certificate = (e) => {
- e.preventDefault();
- course = $(".title").attr("data-course");
- frappe.call({
- method: "lms.lms.doctype.lms_certificate.lms_certificate.create_certificate",
- args: {
- "course": course
- },
- callback: (data) => {
- window.location.href = `/courses/${course}/${data.message.name}`;
- }
- })
+ e.preventDefault();
+ course = $(".title").attr("data-course");
+ frappe.call({
+ method: "lms.lms.doctype.lms_certificate.lms_certificate.create_certificate",
+ args: {
+ "course": course
+ },
+ callback: (data) => {
+ window.location.href = `/courses/${course}/${data.message.name}`;
+ }
+ });
};
+
const attach_work = (e) => {
- const target = $(e.currentTarget);
- let files = target.siblings(".attach-file").prop("files")
- if (files && files.length) {
- files = add_files(files)
- return_as_dataurl(files)
- files.map((file) => {
- upload_file(file, target);
- })
- }
+ const target = $(e.currentTarget);
+ let files = target.siblings(".attach-file").prop("files")
+ if (files && files.length) {
+ files = add_files(files)
+ return_as_dataurl(files)
+ files.map((file) => {
+ upload_file(file, target);
+ })
+ }
};
+
const upload_file = (file, target) => {
- return new Promise((resolve, reject) => {
- let xhr = new XMLHttpRequest();
+ return new Promise((resolve, reject) => {
+ let xhr = new XMLHttpRequest();
- xhr.onreadystatechange = () => {
- if (xhr.readyState == XMLHttpRequest.DONE) {
- if (xhr.status === 200) {
- let response = JSON.parse(xhr.responseText)
- create_lesson_work(response.message, target);
- } else if (xhr.status === 403) {
- let response = JSON.parse(xhr.responseText);
- frappe.msgprint(`Not permitted. ${response._error_message || ''}`);
+ xhr.onreadystatechange = () => {
+ if (xhr.readyState == XMLHttpRequest.DONE) {
+ if (xhr.status === 200) {
+ let response = JSON.parse(xhr.responseText)
+ create_lesson_work(response.message, target);
+ } else if (xhr.status === 403) {
+ let response = JSON.parse(xhr.responseText);
+ frappe.msgprint(`Not permitted. ${response._error_message || ''}`);
- } else if (xhr.status === 413) {
- frappe.msgprint('Size exceeds the maximum allowed file size.');
+ } else if (xhr.status === 413) {
+ frappe.msgprint('Size exceeds the maximum allowed file size.');
- } else {
- frappe.msgprint(xhr.status === 0 ? 'XMLHttpRequest Error' : `${xhr.status} : ${xhr.statusText}`);
+ } else {
+ frappe.msgprint(xhr.status === 0 ? 'XMLHttpRequest Error' : `${xhr.status} : ${xhr.statusText}`);
+ }
+ }
}
- }
- }
- xhr.open('POST', '/api/method/upload_file', true);
- xhr.setRequestHeader('Accept', 'application/json');
- xhr.setRequestHeader('X-Frappe-CSRF-Token', frappe.csrf_token);
+ xhr.open('POST', '/api/method/upload_file', true);
+ xhr.setRequestHeader('Accept', 'application/json');
+ xhr.setRequestHeader('X-Frappe-CSRF-Token', frappe.csrf_token);
- let form_data = new FormData();
- if (file.file_obj) {
- form_data.append('file', file.file_obj, `${frappe.session.user}-${file.name}`);
- form_data.append('folder', `${$(".title").attr("data-lesson")} ${$(".title").attr("data-course")}`)
- }
+ let form_data = new FormData();
+ if (file.file_obj) {
+ form_data.append('file', file.file_obj, `${frappe.session.user}-${file.name}`);
+ form_data.append('folder', `${$(".title").attr("data-lesson")} ${$(".title").attr("data-course")}`)
+ }
+
+ xhr.send(form_data);
+ });
+};
- xhr.send(form_data);
- });
-}
const create_lesson_work = (file, target) => {
- frappe.call({
- method: "lms.lms.doctype.lesson_assignment.lesson_assignment.upload_assignment",
- args: {
- assignment: file.file_url,
- lesson: $(".title").attr("data-lesson"),
- identifier: target.siblings(".attach-file").attr("id")
- },
- callback: (data) => {
- target.siblings(".attach-file").addClass("hide");
- target.siblings(".preview-work").removeClass("hide");
- target.siblings(".preview-work").find("a").attr("href", file.file_url).text(file.file_name)
- target.addClass("hide");
- }
- });
+ frappe.call({
+ method: "lms.lms.doctype.lesson_assignment.lesson_assignment.upload_assignment",
+ args: {
+ assignment: file.file_url,
+ lesson: $(".title").attr("data-lesson"),
+ identifier: target.siblings(".attach-file").attr("id")
+ },
+ callback: (data) => {
+ target.siblings(".attach-file").addClass("hide");
+ target.siblings(".preview-work").removeClass("hide");
+ target.siblings(".preview-work").find("a").attr("href", file.file_url).text(file.file_name)
+ target.addClass("hide");
+ }
+ });
};
+
const return_as_dataurl = (files) => {
- let promises = files.map(file =>
- frappe.dom.file_to_base64(file.file_obj)
- .then(dataurl => {
- file.dataurl = dataurl;
- this.on_success && this.on_success(file);
- })
- );
- return Promise.all(promises);
-}
+ let promises = files.map(file =>
+ frappe.dom.file_to_base64(file.file_obj)
+ .then(dataurl => {
+ file.dataurl = dataurl;
+ this.on_success && this.on_success(file);
+ })
+ );
+ return Promise.all(promises);
+};
+
const add_files = (files) => {
- files = Array.from(files).map(file => {
- let is_image = file.type.startsWith('image');
- return {
- file_obj: file,
- cropper_file: file,
- crop_box_data: null,
- optimize: this.attach_doc_image ? true : false,
- name: file.name,
- doc: null,
- progress: 0,
- total: 0,
- failed: false,
- request_succeeded: false,
- error_message: null,
- uploading: false,
- private: !is_image
- }
- });
- return files
+ files = Array.from(files).map(file => {
+ let is_image = file.type.startsWith('image');
+ return {
+ file_obj: file,
+ cropper_file: file,
+ crop_box_data: null,
+ optimize: this.attach_doc_image ? true : false,
+ name: file.name,
+ doc: null,
+ progress: 0,
+ total: 0,
+ failed: false,
+ request_succeeded: false,
+ error_message: null,
+ uploading: false,
+ private: !is_image
+ }
+ });
+ return files
};
+
const clear_work = (e) => {
- const target = $(e.currentTarget);
- const parent = target.closest(".preview-work");
- parent.addClass("hide");
- parent.siblings(".attach-file").removeClass("hide").val(null);
- parent.siblings(".submit-work").removeClass("hide");
+ const target = $(e.currentTarget);
+ const parent = target.closest(".preview-work");
+ parent.addClass("hide");
+ parent.siblings(".attach-file").removeClass("hide").val(null);
+ parent.siblings(".submit-work").removeClass("hide");
};
+
const fetch_assignments = () => {
- if ($(".attach-file").length <= 0)
- return;
- frappe.call({
- method: "lms.lms.doctype.lesson_assignment.lesson_assignment.get_assignment",
- args: {
- "lesson": $(".title").attr("data-lesson")
- },
- callback: (data) => {
- if (data.message && data.message.length) {
- const assignments = data.message;
- for (let i in assignments) {
- let target = $(`#${assignments[i]["id"]}`);
- target.addClass("hide");
- target.siblings(".submit-work").addClass("hide");
- target.siblings(".preview-work").removeClass("hide");
- target.siblings(".preview-work").find("a").attr("href", assignments[i]["assignment"]).text(assignments[i]["file_name"]);
+ if ($(".attach-file").length <= 0)
+ return;
+ frappe.call({
+ method: "lms.lms.doctype.lesson_assignment.lesson_assignment.get_assignment",
+ args: {
+ "lesson": $(".title").attr("data-lesson")
+ },
+ callback: (data) => {
+ if (data.message && data.message.length) {
+ const assignments = data.message;
+ for (let i in assignments) {
+ let target = $(`#${assignments[i]["id"]}`);
+ target.addClass("hide");
+ target.siblings(".submit-work").addClass("hide");
+ target.siblings(".preview-work").removeClass("hide");
+ target.siblings(".preview-work").find("a").attr("href", assignments[i]["assignment"]).text(assignments[i]["file_name"]);
+ }
}
- }
- }
- });
+ }
+ });
};
+
const initialize_timer = () => {
this.time_left = $(".timer").data("time");
calculate_and_display_time(100, this.time_left);
@@ -423,6 +462,7 @@ const initialize_timer = () => {
}, 100);
};
+
const calculate_and_display_time = (percent_time) => {
$(".timer .progress-bar").attr("aria-valuenow", percent_time);
$(".timer .progress-bar").attr("aria-valuemax", percent_time);
@@ -430,3 +470,50 @@ const calculate_and_display_time = (percent_time) => {
let progress_color = percent_time < 20 ? "red" : "var(--primary-color)";
$(".timer .progress-bar").css("background-color", progress_color);
};
+
+
+const save_lesson = (e) => {
+ let lesson = $("#title").data("lesson");
+ frappe.call({
+ method: "lms.lms.doctype.lms_course.lms_course.save_lesson",
+ args: {
+ "title": $("#title").text(),
+ "body": $("#body").text(),
+ "chapter": $("#title").data("chapter"),
+ "preview": $("#preview").prop("checked") ? 1 : 0,
+ "idx": $("#title").data("index"),
+ "lesson": lesson ? lesson : ""
+ },
+ callback: (data) => {
+ window.location.reload();
+ }
+ });
+};
+
+
+const show_upload_modal = () => {
+ new frappe.ui.FileUploader({
+ folder: "Home/Attachments",
+ restrictions: {
+ allowed_file_types: ['image/*']
+ },
+ on_success: (file_doc) => {
+ $(".attachments").append(build_attachment_table(file_doc));
+ let count = $(".attachment-count").data("count") + 1;
+ $(".attachment-count").data("count", count);
+ $(".attachment-count").html(__(`${count} attachments`));
+ $(".attachments").removeClass("hide");
+ },
+ });
+};
+
+
+const build_attachment_table = (file_doc) => {
+ return $(`
+
+ | ${file_doc.file_name} |
+ ${__("Copy Link")} |
+
+ `);
+};
diff --git a/lms/www/batch/learn.py b/lms/www/batch/learn.py
index c836ec06..43d73aee 100644
--- a/lms/www/batch/learn.py
+++ b/lms/www/batch/learn.py
@@ -10,28 +10,30 @@ def get_context(context):
chapter_index = frappe.form_dict.get("chapter")
lesson_index = frappe.form_dict.get("lesson")
lesson_number = f"{chapter_index}.{lesson_index}"
- print(chapter_index, lesson_index, type(chapter_index), type(lesson_index))
- if (not chapter_index and chapter_index != 0) or (not lesson_index and lesson_index != 0):
+ context.lesson_index = lesson_index
+ context.chapter = frappe.db.get_value("Chapter Reference", {
+ "idx": chapter_index,
+ "parent": context.course.name
+ }, "chapter")
+
+ if not chapter_index or not lesson_index:
if context.batch:
index_ = get_lesson_index(context.course, context.batch, frappe.session.user) or "1.1"
else:
index_ = "1.1"
redirect_to_lesson(context.course, index_)
- if chapter_index == 0 and lesson_index == 0:
- context.lesson = frappe._dict()
- context.lesson.edit_mode = True
- else:
- set_lesson_context(context, lesson_number)
-
-
-def set_lesson_context(context, lesson_number):
context.lesson = get_current_lesson_details(lesson_number, context)
+ if not context.lesson:
+ context.lessom = frappe._dict()
+
+ if frappe.form_dict.get("edit"):
+ context.lesson.edit_mode = True
+
neighbours = get_neighbours(lesson_number, context.lessons)
context.next_url = get_url(neighbours["next"], context.course)
context.prev_url = get_url(neighbours["prev"], context.course)
-
- meta_info = context.lesson.title + " - " + context.course.title
+ meta_info = context.lesson.title + " - " + context.course.title if context.lesson.title else "New Lesson"
context.metatags = {
"title": meta_info,
"keywords": meta_info,
@@ -42,7 +44,7 @@ def set_lesson_context(context, lesson_number):
context.page_context = {
"course": context.course.name,
"batch": context.get("batch") and context.batch.name,
- "lesson": context.lesson.name,
+ "lesson": context.lesson.name if context.lesson.name else "New Lesson",
"is_member": context.membership is not None
}
diff --git a/lms/www/courses/course.html b/lms/www/courses/course.html
index 0cc8c0a8..c3975797 100644
--- a/lms/www/courses/course.html
+++ b/lms/www/courses/course.html
@@ -72,8 +72,9 @@
{% endif %}
-