feat: new lesson redirect

This commit is contained in:
Jannat Patel
2022-08-08 11:47:23 +05:30
parent 0723f3091c
commit 65edd2ce22
8 changed files with 52 additions and 13 deletions

View File

@@ -135,8 +135,6 @@ website_route_rules = [
{"from_route": "/sketches/<sketch>", "to_route": "sketches/sketch"}, {"from_route": "/sketches/<sketch>", "to_route": "sketches/sketch"},
{"from_route": "/courses/<course>", "to_route": "courses/course"}, {"from_route": "/courses/<course>", "to_route": "courses/course"},
{"from_route": "/courses/<course>/<certificate>", "to_route": "courses/certificate"}, {"from_route": "/courses/<course>/<certificate>", "to_route": "courses/certificate"},
{"from_route": "/hackathons/<hackathon>", "to_route": "hackathons/hackathon"},
{"from_route": "/hackathons/<hackathon>/<project>", "to_route": "hackathons/project"},
{"from_route": "/courses/<course>/learn", "to_route": "batch/learn"}, {"from_route": "/courses/<course>/learn", "to_route": "batch/learn"},
{"from_route": "/courses/<course>/learn/<int:chapter>.<int:lesson>", "to_route": "batch/learn"}, {"from_route": "/courses/<course>/learn/<int:chapter>.<int:lesson>", "to_route": "batch/learn"},
{"from_route": "/courses/<course>/progress", "to_route": "batch/progress"}, {"from_route": "/courses/<course>/progress", "to_route": "batch/progress"},

View File

@@ -35,7 +35,7 @@
<div class="mt-2 mb-8"> <div class="mt-2 mb-8">
<button class="btn btn-sm btn-secondary btn-save-chapter" <button class="btn btn-sm btn-secondary btn-save-chapter"
data-index="{{ loop.index }}" data-chapter="{{ chapter.name }}"> {{ _('Save') }} </button> data-index="{{ loop.index }}" data-chapter="{{ chapter.name }}"> {{ _('Save') }} </button>
<button class="btn btn-sm btn-secondary btn-lesson ml-4"> {{ _("New Lesson") }} </button> <a class="btn btn-sm btn-secondary btn-lesson ml-4" href="/courses/{{ course.name }}/learn/0.0"> {{ _("New Lesson") }} </a>
</div> </div>
{% endif %} {% endif %}

View File

@@ -29,3 +29,4 @@ execute:frappe.delete_doc("Workspace", "School", ignore_missing=True, force=True
lms.patches.v0_0.move_certification_to_certificate lms.patches.v0_0.move_certification_to_certificate
lms.patches.v0_0.quiz_submission_member lms.patches.v0_0.quiz_submission_member
lms.patches.v0_0.delete_old_module_docs #08-07-2022 lms.patches.v0_0.delete_old_module_docs #08-07-2022
lms.patches.v0_0.delete_course_web_forms

View File

@@ -0,0 +1,6 @@
import frappe
def execute():
frappe.delete_doc("Web Form", "lesson", ignore_missing=True, force=True)
frappe.delete_doc("Web Form", "chapter", ignore_missing=True, force=True)
frappe.delete_doc("Web Form", "course", ignore_missing=True, force=True)

View File

@@ -1,6 +1,16 @@
{% extends "templates/base.html" %} {% extends "templates/base.html" %}
{% from "www/macros/livecode.html" import LiveCodeEditorJS, LiveCodeEditor with context %} {% from "www/macros/livecode.html" import LiveCodeEditorJS, LiveCodeEditor with context %}
{% block title %} {{ lesson.title }} - {{ course.title }} {% endblock %}
{% block title %}
{% if lesson.title %}
{{ lesson.title }} - {{ course.title }}
{% else %}
{{ _("New Lesson") }}
{% endif %}
{% endblock %}
{% block head_include %} {% block head_include %}
{% include "public/icons/symbol-defs.svg" %} {% include "public/icons/symbol-defs.svg" %}
@@ -12,6 +22,7 @@
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<div class="common-page-style lesson-page"> <div class="common-page-style lesson-page">
<div class="container course-details-page"> <div class="container course-details-page">
@@ -29,25 +40,31 @@
</div> </div>
{% endblock %} {% endblock %}
<!-- BreadCrumb -->
{% macro BreadCrumb(course, lesson) %} {% macro BreadCrumb(course, lesson) %}
<div class="breadcrumb"> <div class="breadcrumb">
<a class="dark-links" href="/courses">{{ _("All Courses") }}</a> <a class="dark-links" href="/courses">{{ _("All Courses") }}</a>
<img class="ml-1 mr-1" src="/assets/lms/icons/chevron-right.svg"> <img class="ml-1 mr-1" src="/assets/lms/icons/chevron-right.svg">
<a class="dark-links" href="/courses/{{ course.name }}">{{ course.title }}</a> <a class="dark-links" href="/courses/{{ course.name }}">{{ course.title }}</a>
<img class="ml-1 mr-1" src="/assets/lms/icons/chevron-right.svg"> <img class="ml-1 mr-1" src="/assets/lms/icons/chevron-right.svg">
<span class="breadcrumb-destination">{{ lesson.title }}</span> <span class="breadcrumb-destination">{{ lesson.title if lesson.title else _("New Lesson") }}</span>
</div> </div>
{% endmacro %} {% endmacro %}
<!-- Lesson Details -->
{% macro LessonContent(lesson) %} {% macro LessonContent(lesson) %}
{% set instructors = get_instructors(course.name) %} {% set instructors = get_instructors(course.name) %}
{% set is_instructor = is_instructor(course.name) %} {% set is_instructor = is_instructor(course.name) %}
<div class="common-card-style lesson-content"> <div class="common-card-style lesson-content">
<div class="lesson-title"> <div class="lesson-title">
<div class="course-home-headings title mb-0
{% if membership %} is-member {% endif %} <div class="course-home-headings title mb-0 {% if membership %} is-member {% endif %}
{% if membership or is_instructor %} eligible-for-submission {% endif %}" data-lesson="{{ lesson.name }}" {% if membership or is_instructor %} eligible-for-submission {% endif %}"
data-course="{{ course.name }}">{{ lesson.title }}</div> {% if lesson.edit_mode %} data-placeholder="{{ _('Title') }}" contenteditable="true" {% endif %}
data-lesson="{{ lesson.name }}" data-course="{{ course.name }}"
> {% if lesson.title %} {{ lesson.title }} {% endif %} </div>
<span class="lesson-progress {{hide if get_progress(course.name, lesson.name) != 'Complete' else ''}}">{{ _("COMPLETED") }}</span> <span class="lesson-progress {{hide if get_progress(course.name, lesson.name) != 'Complete' else ''}}">{{ _("COMPLETED") }}</span>
{% if is_instructor %} {% if is_instructor %}

View File

@@ -3,7 +3,6 @@ import frappe
from lms.www.utils import get_common_context, redirect_to_lesson from lms.www.utils import get_common_context, redirect_to_lesson
from lms.lms.utils import get_lesson_url from lms.lms.utils import get_lesson_url
from frappe.utils import cstr, flt from frappe.utils import cstr, flt
from lms.www import batch
def get_context(context): def get_context(context):
get_common_context(context) get_common_context(context)
@@ -11,13 +10,22 @@ def get_context(context):
chapter_index = frappe.form_dict.get("chapter") chapter_index = frappe.form_dict.get("chapter")
lesson_index = frappe.form_dict.get("lesson") lesson_index = frappe.form_dict.get("lesson")
lesson_number = f"{chapter_index}.{lesson_index}" lesson_number = f"{chapter_index}.{lesson_index}"
if not chapter_index or not 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):
if context.batch: if context.batch:
index_ = get_lesson_index(context.course, context.batch, frappe.session.user) or "1.1" index_ = get_lesson_index(context.course, context.batch, frappe.session.user) or "1.1"
else: else:
index_ = "1.1" index_ = "1.1"
redirect_to_lesson(context.course, index_) 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) context.lesson = get_current_lesson_details(lesson_number, context)
neighbours = get_neighbours(lesson_number, context.lessons) neighbours = get_neighbours(lesson_number, context.lessons)
context.next_url = get_url(neighbours["next"], context.course) context.next_url = get_url(neighbours["next"], context.course)
@@ -38,19 +46,23 @@ def get_context(context):
"is_member": context.membership is not None "is_member": context.membership is not None
} }
def get_current_lesson_details(lesson_number, context): def get_current_lesson_details(lesson_number, context):
details_list = list(filter(lambda x: cstr(x.number) == lesson_number, context.lessons)) details_list = list(filter(lambda x: cstr(x.number) == lesson_number, context.lessons))
if not len(details_list): if not len(details_list):
redirect_to_lesson(context.course) redirect_to_lesson(context.course)
return details_list[0] return details_list[0]
def get_url(lesson_number, course): def get_url(lesson_number, course):
return get_lesson_url(course.name, lesson_number) and get_lesson_url(course.name, lesson_number) + course.query_parameter return get_lesson_url(course.name, lesson_number) and get_lesson_url(course.name, lesson_number) + course.query_parameter
def get_lesson_index(course, batch, user): def get_lesson_index(course, batch, user):
lesson = batch.get_current_lesson(user) lesson = batch.get_current_lesson(user)
return lesson and course.get_lesson_index(lesson) return lesson and course.get_lesson_index(lesson)
def get_page_extensions(context): def get_page_extensions(context):
default_value = ["lms.plugins.PageExtension"] default_value = ["lms.plugins.PageExtension"]
classnames = frappe.get_hooks("lms_lesson_page_extensions") or default_value classnames = frappe.get_hooks("lms_lesson_page_extensions") or default_value
@@ -59,6 +71,7 @@ def get_page_extensions(context):
e.set_context(context) e.set_context(context)
return extensions return extensions
def get_neighbours(current, lessons): def get_neighbours(current, lessons):
current = flt(current) current = flt(current)
numbers = sorted(lesson.number for lesson in lessons) numbers = sorted(lesson.number for lesson in lessons)

View File

@@ -72,8 +72,8 @@
{% endif %} {% endif %}
</div> </div>
<div {% if course.edit_mode %} data-placeholder="{{ _('Title') }}" contenteditable="true" {% endif %} <div {% if course.edit_mode %} data-placeholder="{{ _('Title') }}" contenteditable="true" {% endif %} id="title"
class="course-card-wide-title" id="title" data-course="{{ course.name | urlencode }}">{% if course.title %} {{ course.title }} {% endif %}</div> class="course-card-wide-title" data-course="{{ course.name | urlencode }}">{% if course.title %} {{ course.title }} {% endif %}</div>
<div {% if course.edit_mode %} contenteditable="true" data-placeholder="{{ _('Short Introduction') }}" <div {% if course.edit_mode %} contenteditable="true" data-placeholder="{{ _('Short Introduction') }}"
{% endif %} id="intro" >{% if course.short_introduction %} {{ course.short_introduction }} {% endif %}</div> {% endif %} id="intro" >{% if course.short_introduction %} {{ course.short_introduction }} {% endif %}</div>

View File

@@ -17,6 +17,7 @@ def get_context(context):
else: else:
set_course_context(context, course_name) set_course_context(context, course_name)
def set_course_context(context, course_name): def set_course_context(context, course_name):
course = frappe.db.get_value("LMS Course", course_name, course = frappe.db.get_value("LMS Course", course_name,
["name", "title", "image", "short_introduction", "description", "published", "upcoming", "disable_self_learning", ["name", "title", "image", "short_introduction", "description", "published", "upcoming", "disable_self_learning",
@@ -61,15 +62,18 @@ def set_course_context(context, course_name):
"keywords": course.title "keywords": course.title
} }
def get_user_interest(course): def get_user_interest(course):
return frappe.db.count("LMS Course Interest", { return frappe.db.count("LMS Course Interest", {
"course": course, "course": course,
"user": frappe.session.user "user": frappe.session.user
}) })
def show_start_learing_cta(course, membership, restriction): def show_start_learing_cta(course, membership, restriction):
return not course.disable_self_learning and not membership and not course.upcoming and not restriction.get("restrict") and not is_instructor(course.name) return not course.disable_self_learning and not membership and not course.upcoming and not restriction.get("restrict") and not is_instructor(course.name)
def redirect_to_courses_list(): def redirect_to_courses_list():
frappe.local.flags.redirect_location = "/courses" frappe.local.flags.redirect_location = "/courses"
raise frappe.Redirect raise frappe.Redirect