fix: conflicts

This commit is contained in:
Jannat Patel
2022-09-26 09:45:16 +05:30
52 changed files with 1484 additions and 860 deletions

View File

@@ -48,25 +48,25 @@
<script>
frappe.ready(() => {
$("#confirm").click((e) => {
frappe.call({
"method": "lms.lms.doctype.lms_batch_membership.lms_batch_membership.create_membership",
"args": {
"batch": {{ batch.name }},
"course": {{ batch.course }}
},
"callback": (data) => {
if (data.message == "OK") {
frappe.msgprint({
message: __("You are now a member of this batch!"),
clear: true
});
setTimeout(function () {
window.location.href = "/courses/{{ batch.course }}/home";
}, 2000);
}
}
})
})
})
frappe.call({
"method": "lms.lms.doctype.lms_batch_membership.lms_batch_membership.create_membership",
"args": {
"batch": {{ batch.name }},
"course": {{ batch.course }}
},
"callback": (data) => {
if (data.message == "OK") {
frappe.msgprint({
message: __("You are now a member of this batch!"),
clear: true
});
setTimeout(function () {
window.location.href = "/courses/{{ batch.course }}/home";
}, 1000);
}
}
});
});
});
</script>
{% endblock %}

View File

@@ -33,7 +33,9 @@
</div>
<div class="lesson-pagination-parent">
{{ LessonContent(lesson) }}
{% if not lesson.edit_mode %} {{ Discussions() }} {% endif %}
{% if not lesson.edit_mode and course.status == "Approved" and not course.upcoming %}
{{ Discussions() }}
{% endif %}
</div>
</div>
</div>
@@ -57,6 +59,7 @@
{% macro LessonContent(lesson) %}
{% set instructors = get_instructors(course.name) %}
{% set is_instructor = is_instructor(course.name) %}
<div class="common-card-style lesson-content">
<div class="lesson-title">
@@ -67,10 +70,10 @@
data-index="{{ lesson_index }}" data-course="{{ course.name }}" data-chapter="{{ chapter }}"
{% if lesson.name %} data-lesson="{{ lesson.name }}" {% endif %}
>{% 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="indicator-pill green {{ hide if get_progress(course.name, lesson.name) != 'Complete' else ''}}">{{ _("COMPLETED") }}</span>
<!-- Edit Button -->
{% if is_instructor and not lesson.edit_mode %}
{% if (is_instructor or has_course_moderator_role()) and not lesson.edit_mode %}
<button class="button is-default button-links ml-auto btn-edit"> {{ _("Edit") }} </button>
{% endif %}
</div>
@@ -90,12 +93,14 @@
{% endfor %}
<a class="button-links ml-1" href="{{ get_profile_url(instructors[0].username) }}">
<span class="course-meta">
{% if ins_len == 1 %}
{{ instructors[0].full_name }}
{% else %}
{% set suffix = _("other") if ins_len - 1 == 1 else _("others") %}
{{ instructors[0].full_name.split(" ")[0] }} and {{ ins_len - 1 }} {{ suffix }}
{% endif %}
{% if ins_len == 1 %}
{{ instructors[0].full_name }}
{% elif ins_len == 2 %}
{{ instructors[0].full_name.split(" ")[0] }} and {{ instructors[1].full_name.split(" ")[0] }}
{% else %}
{% set suffix = "other" if ins_len - 1 == 1 else "others" %}
{{ instructors[0].full_name.split(" ")[0] }} and {{ ins_len - 1 }} {{ suffix }}
{% endif %}
</span>
</a>
<div class="ml-5 course-meta"> {{ frappe.utils.format_date(lesson.creation, "medium") }} </div>
@@ -103,7 +108,7 @@
<!-- Lesson Content -->
<div class="markdown-source lesson-content-card {% if lesson.edit_mode %} mb-0 mt-2 {% endif %} ">
{% if membership or lesson.include_in_preview or is_instructor %}
{% if show_lesson %}
{% if is_instructor and not lesson.include_in_preview and not lesson.edit_mode %}
<div class="small alert alert-secondary alert-dismissible mb-4">
@@ -115,13 +120,17 @@
{% if lesson.edit_mode %}
{{ EditLesson(lesson) }}
{% else %}
{{ render_html(lesson.body) }}
{{ render_html(lesson.body, lesson.youtube, lesson.quiz_id) }}
{% endif %}
{% else %}
{% set course_link = "<a class='join-batch' data-course=" + course.name | urlencode + " href=''>" + _('here') + "</a>" %}
<div class="">
<div class="btn btn-primary pull-right join-batch" data-course="{{ course.name | urlencode }}"> {{ _("Start Learning") }} </div>
<div class=""> {{ _("This lesson is not available for preview. Please join the course to access it.") }} </div>
<div>
{{ _("There is no preview available for this lesson.
Please join the course to access it.
Click {0} to enroll.").format(course_link) }}
</div>
</div>
{% endif %}
</div>
@@ -140,14 +149,14 @@
<div>
{% if prev_url %}
<a class="btn btn-secondary dark-links prev" href="{{ prev_url }}">
<img class="mr-2" src="/assets/lms/icons/left-arrow.svg">
{{ _("Prev") }}
{{ _("Previous") }}
</a>
{% endif %}
</div>
{% if not is_mentor(course.name, frappe.session.user) and membership %}
{% set progress = get_progress(course.name, lesson.name) %}
{% if not is_mentor(course.name, frappe.session.user) and membership %}
<div class="custom-checkbox {% if progress == 'Complete' %} hide {% endif %}">
<label class="quiz-label">
<input class="mark-progress" type="checkbox" checked>
@@ -155,18 +164,19 @@
<span class="small">{{ _("Mark as complete on moving to the next lesson") }}</span>
</label>
</div>
<div class="btn btn-default mark-progress {{ progress }} {% if progress == 'Incomplete' or progress == None %} hide {% endif %}"
data-progress="Incomplete">
{{ _("Mark as Incomplete") }}
</div>
{% endif %}
<div>
<a class="btn btn-primary next {% if not next_url and (membership.progress|int == 100 or is_instructor) %} hide {% endif %}"
{% if next_url %} data-href="{{ next_url }}" {% endif %} href="">
{% if next_url %} {{ _("Next") }} {% else %} {{ _("Mark as Complete") }} {% endif %}
<img class="ml-2" src="/assets/lms/icons/side-arrow-white.svg">
{% if not is_mentor(course.name, frappe.session.user) and membership %}
<div class="btn btn-default mark-progress {{ progress }} {% if progress == 'Incomplete' or progress == None %} hide {% endif %}"
data-progress="Incomplete">
{{ _("Mark as Incomplete") }}
</div>
{% endif %}
<a class="btn btn-primary next ml-2 {% if not next_url and (membership.progress|int == 100 or is_instructor) %} hide {% endif %}"
{% if next_url %} data-href="{{ next_url }}" {% endif %} href="">
{% if next_url %} {{ _("Next") }} {% else %} {{ _("Mark as Complete") }} {% endif %}
</a>
</div>
@@ -176,20 +186,34 @@
<!-- Edit Lesson -->
{% macro EditLesson(lesson) %}
<div id="body" {% if lesson.body %} data-body="{{ lesson.body }}" {% endif %}></div>
<label class="preview">
<input {% if lesson.include_in_preview %} checked {% endif %} type="checkbox"
id="preview"> {{ _("Show preview of this lesson to Guest users.") }}
</label>
<div class="medium mt-2" contenteditable="true" data-placeholder="{{ _('YouTube Video ID') }}"
id="youtube">{% if lesson.youtube %}{{ lesson.youtube }}{% endif %}</div>
<div id="body" {% if lesson.body %} data-body="{{ lesson.body }}" {% endif %}></div>
<div class="medium mb-4" contenteditable="true" data-placeholder="{{ _('Quiz ID') }}"
id="quiz-id">{% if lesson.quiz_id %}{{ lesson.quiz_id }}{% endif %}</div>
<div class="mt-4">
<button class="btn btn-primary btn-sm btn-lesson pull-right ml-2"> {{ _("Save") }} </button>
{% if lesson.name %}
<button class="btn btn-secondary btn-sm pull-right btn-back ml-2"> {{ _("Back to Lesson") }} </button>
<a class="btn btn-secondary btn-sm pull-right" href="/quizzes"> {{ _("Create Quiz") }} </a>
{% endif %}
<label class="preview" for="preview">
<input {% if lesson.include_in_preview %} checked {% endif %} type="checkbox" id="preview">
{{ _("Show preview of this lesson to Guest users.") }}
</label>
<div class="mt-4">
<button class="btn btn-primary btn-sm btn-lesson pull-right ml-2"> {{ _("Save") }} </button>
{% if lesson.name %}
<button class="btn btn-secondary btn-sm pull-right btn-back ml-2"> {{ _("Back to Lesson") }} </button>
<a class="btn btn-secondary btn-sm pull-right" href="/quizzes"> {{ _("Create Quiz") }} </a>
{% endif %}
{{ UploadAttachments() }}
</div>
{{ HelpArticle() }}
{% endmacro %}
{% macro UploadAttachments() %}
<div class="attachments-parent">
<div class="attachment-controls">
<div class="show-attachments" data-toggle="collapse" data-target="#collapse-attachments" aria-expanded="false">
@@ -209,94 +233,111 @@
</div>
<table class="attachments common-card-style collapse hide" id="collapse-attachments"></table>
</div>
</div>
{{ HelpArticle() }}
{% endmacro %}
<!-- Help Article -->
{% macro HelpArticle() %}
<div class="help-article">
<h3> {{ _("Help Article") }} </h3>
<p>
{{ _("You can add additional content to the lesson using a special syntax. The table below mentions
all types of dynamic content that you can add to the lessons and the syntax for the same.") }}
</p>
<table class="table w-100">
<tr>
<th style="width: 20%;"> {{ _("Content Type") }} </th>
<th style="width: 40%;"> {{ _("Syntax") }} </th>
<th> {{ _("Description") }} </th>
</tr>
<tr>
<td>
{{ _("YouTube Video") }}
</td>
<td>
{% raw %} {{ YouTubeVideo("embed_src") }} {% endraw %}
</td>
<td>
<span>
{{ _("Copy and paste the syntax in the editor. Replace 'embed_src' with the embed source
that YouTube provides. To get the source, follow the steps mentioned below.") }}
</span>
<ul class="p-4">
<div class="medium">
<h3> {{ _("Embed Components") }} </h3>
<p>
{{ _("You can add additional content to the lesson using a special syntax. The table below mentions
all types of dynamic content that you can add to the lessons and the syntax for the same.") }}
</p>
<ol>
<li>
<b> {{ _("YouTube Video") }} </b>
<p> To get the YouTube Video ID, follow the steps mentioned below. </p>
<ul class="px-4">
<li>
{{ _("Upload the video on youtube.") }}
</li>
<li>
{{ _("When you share a youtube video, it shows an option called Embed.") }}
{{ _("When you share a youtube video, it shows a URL") }}
</li>
<li>
{{ _("On clicking it, it provides an iframe. Copy the source (src) of the iframe and
paste it here.") }}
{{ _("Copy the last parameter of the URL and paste it here.") }}
</li>
</ul>
</td>
</tr>
<tr>
<td>
{{ _("Quiz") }}
</td>
<td>
{% raw %} {{ Quiz("lms_quiz_id") }} {% endraw %}
</td>
<td>
{% set quiz_link = "<a href='/quizzes'> Quiz List </a>" %}
{{ _("Copy and paste the syntax in the editor. Replace 'lms_quiz_id' with the ID of the Quiz. You can get the ID of the quiz from the {0}.").format(quiz_link) }}
</td>
</tr>
</table>
</div>
</li>
</ol>
<!-- <table class="table w-100">
<tr>
<th style="width: 20%;"> {{ _("Content Type") }} </th>
<th style="width: 40%;"> {{ _("Syntax") }} </th>
<th> {{ _("Description") }} </th>
</tr>
<tr>
<td>
{{ _("YouTube Video") }}
</td>
<td>
{% raw %} {{ YouTubeVideo('Video ID') }} {% endraw %}
</td>
<td>
<span>
{{ _("Copy and paste the syntax in the editor. Replace 'Video ID' with the embed source
that YouTube provides. To get the source, follow the steps mentioned below.") }}
</span>
<ul class="p-4">
<li>
{{ _("Upload the video on youtube.") }}
</li>
<li>
{{ _("When you share a youtube video, it shows an option called Embed.") }}
</li>
<li>
{{ _("On clicking it, it provides an iframe. Copy the source (src) of the iframe and
paste it here.") }}
</li>
</ul>
</td>
</tr>
<tr>
<td>
{{ _("Quiz") }}
</td>
<td>
{% raw %} {{ Quiz('Quiz ID') }} {% endraw %}
</td>
<td>
{% set quiz_link = "<a href='/quizzes'> Quiz List </a>" %}
{{ _("Copy and paste the syntax in the editor. Replace 'Quiz ID' with the Id of the Quiz.
You can get the Id of the quiz from the {0}.").format(quiz_link) }}
</td>
</tr>
</table> -->
</div>
{% endmacro %}
<!-- Discussions Component -->
{% macro Discussions() %}
{% set topics_count = frappe.db.count("Discussion Topic",
{"reference_doctype": "Course Lesson", "reference_docname": lesson.name}) %}
{% set is_instructor = frappe.session.user == course.instructor %}
{% set condition = is_instructor if is_instructor else membership %}
{% set doctype, docname = _("Course Lesson"), lesson.name %}
{% set title = "Questions" if topics_count else "" %}
{% set cta_title = "Ask a Question" %}
{% set button_name = _("Start Learning") %}
{% set redirect_to = "/courses/" + course.name %}
{% set empty_state_title = _("Have a doubt?") %}
{% set empty_state_subtitle = _("Post it here, our mentors will help you out.") %}
{% include "frappe/templates/discussions/discussions_section.html" %}
{% set topics_count = frappe.db.count("Discussion Topic", {
"reference_doctype": "Course Lesson",
"reference_docname": lesson.name
}) %}
{% set is_instructor = frappe.session.user == course.instructor %}
{% set condition = is_instructor if is_instructor else membership %}
{% set doctype, docname = _("Course Lesson"), lesson.name %}
{% set title = "Questions" if topics_count else "" %}
{% set cta_title = "Ask a Question" %}
{% set button_name = _("Start Learning") %}
{% set redirect_to = "/courses/" + course.name %}
{% set empty_state_title = _("Have a doubt?") %}
{% set empty_state_subtitle = _("Post it here, our mentors will help you out.") %}
{% include "frappe/templates/discussions/discussions_section.html" %}
{% endmacro %}
<!-- Scripts -->
{%- block script %}
{{ super() }}
<script type="text/javascript">
var page_context = {{ page_context | tojson }};
</script>
{{ include_script('controls.bundle.js') }}
{% for ext in page_extensions %}
{{ ext.render_footer() }}
{% endfor %}
{{ super() }}
<script type="text/javascript">
var page_context = {{ page_context | tojson }};
</script>
{{ include_script('controls.bundle.js') }}
{% for ext in page_extensions %}
{{ ext.render_footer() }}
{% endfor %}
{%- endblock %}

View File

@@ -66,7 +66,7 @@ frappe.ready(() => {
$(".btn-back").click((e) => {
window.location.href = window.location.href.split("?")[0];
})
});
$(document).on("click", ".copy-link", (e) => {
frappe.utils.copy_to_clipboard($(e.currentTarget).data("link"));
@@ -490,14 +490,22 @@ const save_lesson = (e) => {
method: "lms.lms.doctype.lms_course.lms_course.save_lesson",
args: {
"title": $("#title").text(),
"body": this.code_field_group.fields_dict["code_md"].last_value,
"body": this.code_field_group.fields_dict["code_md"].value,
"youtube": $("#youtube").text(),
"quiz_id": $("#quiz-id").text(),
"chapter": $("#title").data("chapter"),
"preview": $("#preview").prop("checked") ? 1 : 0,
"idx": $("#title").data("index"),
"lesson": lesson ? lesson : ""
},
callback: (data) => {
window.location.href = window.location.href.split("?")[0];
callback: (data) => {;
frappe.show_alert({
message: __("Saved"),
indicator: "green",
});
setTimeout(() => {
window.location.href = window.location.href.split("?")[0];
}, 1000);
}
});
};

View File

@@ -1,6 +1,6 @@
import frappe
from lms.www.utils import get_common_context, redirect_to_lesson
from lms.lms.utils import get_lesson_url, is_instructor, redirect_to_courses_list
from lms.lms.utils import get_lesson_url, has_course_moderator_role, is_instructor, redirect_to_courses_list
from frappe.utils import cstr, flt
def get_context(context):
@@ -23,11 +23,14 @@ def get_context(context):
redirect_to_lesson(context.course, index_)
context.lesson = get_current_lesson_details(lesson_number, context)
instructor = is_instructor(context.course.name)
context.show_lesson = context.membership or (context.lesson and context.lesson.include_in_preview) or instructor or has_course_moderator_role()
if not context.lesson:
context.lesson = frappe._dict()
if frappe.form_dict.get("edit"):
if not is_instructor(context.course.name):
if not instructor and not has_course_moderator_role():
redirect_to_courses_list()
context.lesson.edit_mode = True
else:

View File

@@ -52,11 +52,13 @@
<div class="d-flex justify-content-between option-{{ num }}">
<div contenteditable="true" data-placeholder="{{ _('Option') }}"
class="option-input">{% if option %}{{ option }}{% endif %}</div>
<div contenteditable="true" data-placeholder="{{ _('Explanation') }}"
<div contenteditable="true" data-placeholder="{{ _('Explain the option') }}"
class="option-input">{% if explanation %}{{ explanation }}{% endif %}</div>
<div class="option-checkbox">
<input type="checkbox" {% if question['is_correct_' + num] %} checked {% endif %}>
<label class="mb-0"> {{ _("Is Correct") }} </label>
<label class="mb-0">
<input type="checkbox" {% if question['is_correct_' + num] %} checked {% endif %}>
{{ _("Is Correct") }}
</label>
</div>
</div>
</div>
@@ -68,8 +70,17 @@
<div class="mt-4">
<button class="btn btn-secondary btn-sm btn-question"> {{ _("New Question") }} </button>
<button class="btn btn-primary btn-sm btn-save-question ml-2
{% if not quiz.name %} hide {% endif %}"> {{ _("Save Quiz") }} </button>
{% if quiz.name %}
<button class="btn btn-secondary btn-sm copy-quiz-id ml-2" data-name="'{{ quiz.name }}'">
{{ _("Copy Quiz ID") }}
</button>
{% endif %}
<button class="btn btn-primary btn-sm btn-save-question ml-2 {% if not quiz.name %} hide {% endif %}">
{{ _("Save Quiz") }}
</button>
</div>
</div>
{% endmacro %}

View File

@@ -1,21 +1,34 @@
frappe.ready(() => {
if(!$(".quiz-card").length) {
add_question();
}
$(".btn-question").click((e) => {
add_question(e);
add_question();
});
$(".btn-save-question").click((e) => {
save_question(e);
});
get_questions()
$(".copy-quiz-id").click((e) => {
frappe.utils.copy_to_clipboard($(e.currentTarget).data("name"));
});
get_questions();
});
const add_question = (e) => {
const add_question = () => {
if ($(".new-quiz-card").length) {
scroll_to_question_container();
return;
}
let add_after = $(".quiz-card").length ? $(".quiz-card:last") : $("#quiz-title");
let question_template = `<div class="quiz-card">
let question_template = `<div class="quiz-card new-quiz-card">
<div contenteditable="true" data-placeholder="${__("Question")}" class="question mb-4"></div>
</div>`;
$(question_template).insertAfter(add_after);
@@ -54,6 +67,7 @@ const save_question = (e) => {
if (!$("#quiz-title").text()) {
frappe.throw(__("Quiz Title is mandatory."));
}
frappe.call({
method: "lms.lms.doctype.lms_quiz.lms_quiz.save_quiz",
args: {
@@ -104,3 +118,11 @@ const get_questions = () => {
return questions;
};
const scroll_to_question_container = () => {
$([document.documentElement, document.body]).animate({
scrollTop: $(".new-quiz-card").offset().top
}, 1000);
$(".new-quiz-card").find(".question").focus();
}

View File

@@ -12,37 +12,55 @@
{% block content %}
<div class="common-page-style">
<div class="container">
<a class="btn btn-secondary btn-sm pull-right" href="/quizzes/new-quiz">
{{ _("Add Quiz") }}
</a>
<div class="course-home-headings">
{{ _("Quiz List") }}
</div>
{% if quiz_list | length %}
<a class="btn btn-secondary btn-sm pull-right" href="/quizzes/new-quiz"> {{ _("Add Quiz") }} </a>
<div class="course-home-headings"> {{ _("Quiz List") }} </div>
<div class="common-card-style">
<table class="table">
<tr style="background-color: var(--fg-hover-color); font-weight: bold">
<td style="width: 10%;"> {{ _("No.") }} </td>
<td style="width: 45%;"> {{ _("Title") }} </td>
<td> {{ _("ID") }} </td>
<td> </td>
</tr>
{% for quiz in quiz_list %}
<tr style="position: relative; color: var(--text-color);">
<tr class="quiz-row" data-name="{{ quiz.name }}">
<td> {{ loop.index }} </td>
<td>
<a class="button-links" href="/quizzes/{{ quiz.name }}">{{ quiz.title }}</a>
{{ quiz.title }}
</td>
<td>
<a class="button-links" href="/quizzes/{{ quiz.name }}">{{ quiz.name }}</a>
{{ quiz.name }}
</td>
<td>
<a class="btn btn-secondary btn-sm copy-quiz-id" data-name="'{{ quiz.name }}'">
{{ _("Copy Quiz ID") }}
</a>
</td>
</tr>
{% endfor %}
</table>
</div>
{% else %}
<div class="empty-state">
<img class="icon icon-xl" src="/assets/lms/icons/comment.svg">
<div class="empty-state-text">
<div class="empty-state-heading">{{ _("You have not created any quiz yet.") }}</div>
<div class="course-meta mb-6">{{ _("Create a quiz and add it to your course to engage users.") }}</div>
<a class="btn btn-secondary btn-sm"
href="{% if frappe.session.user == 'Guest' %} /login?redirect-to=/quizzes {% else %} /quizzes/new-quiz {% endif %}">
{{ _("Add Quiz") }} </a>
<div class="empty-state-heading">
{{ _("You have not created any quiz yet.") }}
</div>
<div class="course-meta ">
{{ _("Create a quiz and add it to your course to engage your users.") }}
</div>
</div>
</div>
{% endif %}
@@ -50,3 +68,22 @@
</div>
{% endblock %}
{% block script %}
<script>
frappe.ready(() => {
$(".copy-quiz-id").click((e) => {
e.preventDefault();
frappe.utils.copy_to_clipboard($(e.currentTarget).data("name"));
});
$(".quiz-row").click((e) => {
if (!$(e.target).hasClass("copy-quiz-id")) {
window.location.href = `/quizzes/${$(e.currentTarget).data('name')}`;
}
});
});
</script>
{% endblock %}

View File

@@ -5,7 +5,7 @@
<div class="common-page-style">
<div class="container">
<input class="search" id="search-user" placeholder="{{ _('Try a Name, Company, or Industry') }}">
<input class="search pull-right" id="search-user" placeholder="{{ _('Search') }}">
<div class="course-home-headings">{{ _("Community") }} </div>

View File

@@ -16,9 +16,9 @@
<a class="dark-links" href="/courses/{{ course.name }}">{{ course.title }}</a>
</div>
{% if custom_template %}
{{ custom_template }}
{{ custom_template }}
{% else %}
{% include "lms/templates/certificate.html" %}
{% include "lms/templates/certificate.html" %}
{% endif %}
<script src="/assets/lms/js/html2canvas.js"></script>

View File

@@ -19,8 +19,7 @@ def get_context(context):
context.course = frappe.db.get_value("LMS Course", course_name, ["title", "name", "image"], as_dict=True)
context.instructors = (", ").join([x.full_name for x in get_instructors(course_name)])
context.member = frappe.db.get_value("User", context.certificate.member,
["full_name"], as_dict=True)
context.member = frappe.db.get_value("User", context.certificate.member, ["full_name"], as_dict=True)
context.logo = frappe.db.get_single_value("Website Settings", "banner_image")
template_name = frappe.db.get_single_value("LMS Settings", "custom_certificate_template")

View File

@@ -6,7 +6,6 @@
{% block head_include %}
{% include "public/icons/symbol-defs.svg" %}
<link rel="stylesheet" href="/assets/frappe/css/font-awesome.css">
{% endblock %}
@@ -18,10 +17,11 @@
<div class="container">
<div class="course-body-container">
{{ CourseHeaderOverlay(course) }}
{{ CourseSettings(course) }}
{{ Description(course) }}
{{ Save(course) }}
{{ widgets.CourseOutline(course=course, membership=membership, is_user_interested=is_user_interested) }}
{% if not course.edit_mode %}
{% if not course.edit_mode and course.status == "Approved" and not frappe.utils.cint(course.upcoming) %}
{{ widgets.Reviews(course=course, membership=membership) }}
{% endif %}
</div>
@@ -114,7 +114,9 @@
</div>
<div class="course-image-attachment {% if not course.image %} hide {% endif %} ">
<a href="{{ course.image }}" id="image" target="_blank"> {{ course.image }} </a>
<a {% if course.image %} href="{{ course.image }}" {% endif %} id="image" target="_blank">
{{ course.image }}
</a>
<button class="btn btn-sm btn-default btn-clear ml-4"> {{ _("Clear") }} </button>
</div>
<a class="btn btn-default btn-sm btn-attach mt-1 {% if course.image %} hide {% endif %}"> {{ _("Attach Image") }} </a>
@@ -202,9 +204,32 @@
<!-- Description -->
{% macro Description(course) %}
<div class="course-description-section" {% if course.edit_mode %} style="min-height: 100px" {% endif %}
{% if course.edit_mode %} contenteditable="true" {% endif %} id="description"
data-placeholder="Description">{% if course.description %}{{ frappe.utils.md_to_html(course.description) }}{% endif %}</div>
{% if course.edit_mode %}
<div id="description" {% if course.description %} data-description="{{ course.description }}" {% endif %}></div>
{% else %}
<div class="course-description-section">
{{ frappe.utils.md_to_html(course.description) }}
</div>
{% endif %}
{% endmacro %}
<!-- Course Settings -->
{% macro CourseSettings(course) %}
{% if course.edit_mode and has_course_moderator_role() %}
<div class="mb-4">
<label for="published" class="mb-0">
<input type="checkbox" id="published" {% if course.published %} checked {% endif %}>
{{ _("Published") }}
</label>
<label for="upcoming" class="mb-0 ml-20">
<input type="checkbox" id="upcoming" {% if course.upcoming %} checked {% endif %}>
{{ _("Upcoming") }}
</label>
</div>
{% endif %}
{% endmacro %}
@@ -225,23 +250,6 @@
{% endmacro %}
{% macro CourseCreator(course) %}
<div class="course-home-headings"> {{ _("Course Creators") }} </div>
<div class="common-card-style course-creators-card">
{% set instructors = get_instructors(course.name) %}
{% for instructor in instructors %}
<div class="d-flex align-items-center">
{{ widgets.Avatar(member=instructor, avatar_class="avatar-medium") }}
<div class="ml-4">
<div class="course-creator-name"> {{ instructor.full_name }} </div>
<div class="course-meta"> {{ get_authored_courses(instructor.name) | length }} {{ _("Courses Created") }} </div>
</div>
</div>
{% endfor %}
</div>
{% endmacro %}
<!-- Related Courses Section -->
{% macro RelatedCourses(course) %}
{% if course.related_courses | length %}
@@ -285,7 +293,7 @@
membership.current_lesson else "1.1" if first_lesson_exists(course.name) else None %}
{% if show_start_learing_cta %}
<div class="btn btn-primary wide-button join-batch" data-course="{{ course.name | urlencode }}">
<div class="btn btn-primary wide-button join-batch mb-2" data-course="{{ course.name | urlencode }}">
{{ _("Start Learning") }}
<img class="ml-2" src="/assets/lms/icons/white-arrow.svg" />
</div>
@@ -301,7 +309,7 @@
{{ _("Checkout Course") }} <img class="ml-2" src="/assets/lms/icons/white-arrow.svg" />
</a>
{% elif course.upcoming and not is_user_interested %}
{% elif course.upcoming and not is_user_interested and not is_instructor %}
<div class="btn btn-secondary wide-button notify-me" data-course="{{course.name | urlencode}}">
{{ _("Notify me when available") }}
</div>
@@ -338,7 +346,7 @@
{% endif %}
{% endif %}
{% if is_instructor(course.name) %}
{% if is_instructor(course.name) or has_course_moderator_role() %}
<a class="btn btn-secondary wide-button" href="/courses/{{ course.name }}?edit=1"> {{ _("Edit Course") }} </a>
{% endif %}
{% endmacro %}
@@ -356,9 +364,9 @@
frappe.utils.format_time(certificate_request.start_time, "short")) }} </p>
{% endif %}
{% if course.status == "Under Review" %}
{% if course.status == "Under Review" and is_instructor(course.name) %}
<div class="mb-4">
{{ _("Your course is currently under review. Once the review is complete, the System Admins will publish it on the website.") }}
{{ _("This course is currently under review. Once the review is complete, the System Admins will publish it on the website.") }}
</div>
{% endif %}

View File

@@ -70,6 +70,10 @@ frappe.ready(() => {
remove_tag(e);
});
if ($("#description").length) {
make_editor();
}
});
@@ -206,7 +210,7 @@ const submit_for_review = (e) => {
}, 3);
setTimeout(() => {
window.location.reload();
}, 3000);
}, 1000);
}
}
});
@@ -329,6 +333,7 @@ const add_tag = (e) => {
const save_course = (e) => {
let tags = $('.course-card-pills').map((i, el) => $(el).text().trim()).get();
tags = tags.filter(word => word.trim().length > 0);
frappe.call({
method: "lms.lms.doctype.lms_course.lms_course.save_course",
args: {
@@ -337,8 +342,10 @@ const save_course = (e) => {
"short_introduction": $("#intro").text(),
"video_link": $("#video-link").text(),
"image": $("#image").attr("href"),
"description": $("#description").text(),
"course": $("#title").data("course") ? $("#title").data("course") : ""
"description": this.code_field_group.fields_dict["code_md"].value,
"course": $("#title").data("course") ? $("#title").data("course") : "",
"published": $("#published").prop("checked") ? 1 : 0,
"upcoming": $("#upcoming").prop("checked") ? 1 : 0
},
callback: (data) => {
frappe.show_alert({
@@ -356,3 +363,26 @@ const save_course = (e) => {
const remove_tag = (e) => {
$(e.currentTarget).closest(".course-card-pills").remove();
};
const make_editor = () => {
this.code_field_group = new frappe.ui.FieldGroup({
fields: [
{
fieldname: "code_md",
fieldtype: "Code",
options: "Markdown",
wrap: true,
max_lines: Infinity,
min_lines: 20,
default: $("#description").data("description"),
depends_on: 'eval:doc.type=="Markdown"',
}
],
body: $("#description").get(0),
});
this.code_field_group.make();
$("#description .form-section:last").removeClass("empty-section");
$("#description .frappe-control").removeClass("hide-control");
$("#description .form-column").addClass("p-0");
};

View File

@@ -1,6 +1,6 @@
import frappe
from lms.lms.doctype.lms_settings.lms_settings import check_profile_restriction
from lms.lms.utils import get_membership, is_instructor, is_certified, get_evaluation_details, redirect_to_courses_list
from lms.lms.utils import get_membership, has_course_moderator_role, is_instructor, is_certified, get_evaluation_details, redirect_to_courses_list
def get_context(context):
context.no_cache = 1
@@ -28,7 +28,7 @@ def set_course_context(context, course_name):
as_dict=True)
if frappe.form_dict.get("edit"):
if not is_instructor(course.name):
if not is_instructor(course.name) and not has_course_moderator_role():
redirect_to_courses_list()
course.edit_mode = True
@@ -73,4 +73,4 @@ def get_user_interest(course):
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) and course.status == "Approved"

View File

@@ -6,29 +6,33 @@
{% block content %}
<div class="common-page-style">
<div class="container">
{% if restriction.restrict %}
{% set profile_link = "<a href='/edit-profile'> profile </a>" %}
<div class="empty-state">
<div class="course-home-headings text-center mb-0" style="color: inherit;">{{ _("You haven't completed your profile.") }}</div>
<p class="small text-center">{{ _("Complete your {0} to access the courses.").format(profile_link) }}</p>
<div class="container">
{% if restriction.restrict %}
{% set profile_link = "<a href='/edit-profile'> profile </a>" %}
<div class="empty-state">
<div class="course-home-headings text-center mb-0" style="color: inherit;">
{{ _("You haven't completed your profile.") }}
</div>
<p class="small text-center">
{{ _("Complete your {0} to access the courses.").format(profile_link) }}
</p>
</div>
{% else %}
{% include "lms/templates/search_course/search_course.html" %}
<div class="course-list">
{% set courses = live_courses %}
{% set title = _("Live Courses ({0})").format(courses | length) %}
{% set classes = "live-courses" %}
{% include "lms/templates/course_list.html" %}
{% set courses = upcoming_courses %}
{% set title = _("Upcoming Courses ({0})").format(courses | length) %}
{% set classes = "upcoming-courses mt-10" %}
{% include "lms/templates/course_list.html" %}
</div>
{% endif %}
</div>
{% else %}
{% include "lms/templates/search_course/search_course.html" %}
<div class="course-list">
{% set courses = live_courses %}
{% set title = _("Live Courses ({0})").format(courses | length) %}
{% set classes = "live-courses" %}
{% include "lms/templates/course_list.html" %}
{% set courses = upcoming_courses %}
{% set title = _("Upcoming Courses ({0})").format(courses | length) %}
{% set classes = "upcoming-courses mt-10" %}
{% include "lms/templates/course_list.html" %}
</div>
{% endif %}
</div>
</div>
{% endblock %}

View File

@@ -1,28 +1,38 @@
{% extends "templates/base.html" %}
{% block title %}{{ _("Dashboard")}}
{% block title %}
{{ _("Dashboard")}}
{% endblock %}
{% block content %}
{% set portal_course_creation = frappe.db.get_single_value("LMS Settings", "portal_course_creation") %}
{% set show_creators_section = portal_course_creation == "Anyone" or has_course_instructor_role() %}
<div class="common-page-style dashboard">
<div class="container">
{% if show_creators_section %}
<a class="btn btn-secondary btn-md pull-right" id="create-course-link" href="/courses/new-course">
{{ _("Create a Course")}}
<a class="btn btn-secondary btn-sm course-creation-link" id="create-course-link" href="/courses/new-course">
{{ _("Create a Course") }}
</a>
{% endif %}
<ul class="nav" id="courses-tab">
<ul class="nav lms-nav" id="courses-tab">
<li class="nav-item">
<a class="nav-link active" data-toggle="tab" href="#courses-enrolled"> {{ _("Courses Enrolled") }} </a>
<a class="nav-link active" data-toggle="tab" href="#courses-enrolled">
{{ _("Courses Enrolled") }}
</a>
</li>
{% if show_creators_section %}
<li class="nav-item">
<a class="nav-link" data-toggle="tab" href="#courses-created">{{ _("Courses Created") }}
<a class="nav-link" data-toggle="tab" href="#courses-created">
{{ _("Courses Created") }}
</a>
</li>
{% endif %}
{% if show_review_section %}
<li class="nav-item">
<a class="nav-link" data-toggle="tab" href="#courses-under-review">
{{ _("Courses Under Review") }}
</a>
</li>
{% endif %}
@@ -38,16 +48,24 @@
<div class="tab-pane active" id="courses-enrolled" role="tabpanel" aria-labelledby="courses-enrolled">
{% include "lms/lms/web_template/courses_enrolled/courses_enrolled.html" %}
</div>
{% if show_creators_section %}
<div class="tab-pane fade" id="courses-created" role="tabpanel" aria-labelledby="courses-created">
{% include "lms/templates/courses_created.html" %}
</div>
{% endif %}
{% if show_review_section %}
<div class="tab-pane fade" id="courses-under-review" role="tabpanel" aria-labelledby="courses-under-review">
{% include "lms/templates/courses_under_review.html" %}
</div>
{% endif %}
<div class="tab-pane fade" id="notifications" role="tabpanel" aria-labelledby="notifications">
{% include "lms/templates/courses_created.html" %}
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,9 @@
import frappe
from lms.lms.utils import has_course_instructor_role, has_course_moderator_role
def get_context(context):
context.no_cache = 1
portal_course_creation = frappe.db.get_single_value("LMS Settings", "portal_course_creation")
context.show_creators_section = portal_course_creation == "Anyone" or has_course_instructor_role()
context.show_review_section = has_course_moderator_role()

View File

@@ -9,7 +9,7 @@
<div class="common-page-style">
<div class="container">
{% if allow_posting and jobs | length %}
{% if allow_posting %}
<a class="button is-primary pull-right" href="/job-opportunity?new=1">{{ _("Post a Job") }}</a>
{% endif %}
@@ -48,18 +48,11 @@
{% else %}
<div class="empty-state">
<div>
<img class="icon icon-xl" src="/assets/lms/icons/comment.svg">
</div>
<img class="icon icon-xl" src="/assets/lms/icons/comment.svg">
<div class="empty-state-text">
<div class="empty-state-heading">{{ _("No open jobs") }}</div>
<div class="course-meta">{{ _("There are no job openings at present.") }}</div>
</div>
<div>
{% if allow_posting %}
<a class="button is-secondary dark-links m-auto" href="/job-opportunity?new=1">{{ _("Post a Job") }}</a>
{% endif %}
</div>
</div>
{% endif %}
</div>

View File

@@ -3,342 +3,395 @@
<meta name="description" content="{{ member.full_name }}" />
{% endblock %}
{% block content %}
{% set read_only = member.name != frappe.session.user %}
{% set user = member.name %}
{% set courses_created = get_authored_courses(member.name, True) %}
{% set certificates = get_certificates(user) %}
<div class="common-page-style profile-page">
{{ ProfileBanner(member) }}
<div class="profile-page-body">
<div class="container">
{% set read_only = member.name != frappe.session.user %}
{{ About(member) }}
{{ EducationDetails(member) }}
{{ WorkDetails(member) }}
{{ Certification(member) }}
{{ Contact(member) }}
{{ Skills(member) }}
{{ CareerPreference(member) }}
{{ ProfileBanner(member) }}
<div class="profile-page-body">
<div class="container">
<ul class="nav lms-nav" id="courses-tab">
<li class="nav-item">
<a class="nav-link active" data-toggle="tab" href="#profile">
{{ _("Profile") }}
</a>
</li>
{% if courses_created | length %}
<li class="nav-item">
<a class="nav-link" data-toggle="tab" href="#courses-created">
{{ _("Courses Created") }}
</a>
</li>
{% endif %}
{% if certificates | length %}
<li class="nav-item">
<a class="nav-link" data-toggle="tab" href="#certificates">
{{ _("Certificates") }}
</a>
</li>
{% endif %}
{% if has_course_moderator_role() %}
<li class="nav-item">
<a class="nav-link" data-toggle="tab" href="#settings">
{{ _("Settings") }}
</a>
</li>
{% endif %}
</ul>
<div class="border-bottom mb-4"></div>
<div class="tab-content">
<div class="tab-pane active" id="profile" role="tabpanel" aria-labelledby="profile">
<div class="common-card-style column-card mt-5">
{{ About(member) }}
{{ EducationDetails(member) }}
{{ WorkDetails(member) }}
{{ ExternalCertification(member) }}
{{ Contact(member) }}
{{ Skills(member) }}
{{ CareerPreference(member) }}
{{ ProfileTabs(profile_tabs) }}
</div>
</div>
{% if courses_created | length %}
{% set only_published = True %}
<div class="tab-pane fade" id="courses-created" role="tabpanel" aria-labelledby="courses-created">
{% include "lms/templates/courses_created.html" %}
</div>
{% endif %}
{% if certificates | length %}
<div class="tab-pane fade" id="certificates" role="tabpanel" aria-labelledby="certificates">
{% include "lms/templates/certificates_section.html" %}
</div>
{% endif %}
<div class="tab-pane fade" id="settings" role="tabpanel" aria-labelledby="settings">
{{ RoleSettings(member) }}
</div>
</div>
</div>
</div>
</div>
<div class="container">
{{ CoursesCreated(member, read_only) }}
{{ CoursesMentored(member, read_only) }}
{{ ProfileTabs(profile_tabs) }}
</div>
</div>
{% endblock %}
<!-- Banner -->
{% macro ProfileBanner(member) %}
{% set cover_image = member.cover_image if member.cover_image else "/assets/lms/images/profile-banner.png" %}
{% set enrollment = get_course_membership(frappe.session.user, member_type="Student") | length %}
{% set enrollment = get_course_membership(member.name, member_type="Student") | length %}
{% set enrollment_suffix = _("Courses") if enrollment > 1 else _("Course") %}
<div class="container">
<div class="profile-banner" style="background-image: url({{ cover_image }})">
<div class="profile-avatar">
{{ widgets.Avatar(member=member, avatar_class="avatar-square") }}
</div>
</div>
<div class="profile-info">
<div class="profile-name-section">
<div class="profile-name"> {{ member.full_name }} </div>
{% if get_authored_courses(member.name) | length %}
<div class="creator-badge"> {{ _("Creator") }} </div>
{% endif %}
{% if member.looking_for_job %}
<div class="creator-badge"> {{ _("Open Network") }} </div>
{% endif %}
{% if frappe.session.user == member.email %}
<a class="button is-secondary ml-auto mt-1" href="/edit-profile?name={{ member.email }}"> {{ _("Edit Profile") }} </a>
{% endif %}
<div class="profile-banner" style="background-image: url({{ cover_image | urlencode }})">
<div class="profile-avatar">
{{ widgets.Avatar(member=member, avatar_class="avatar-square") }}
</div>
</div>
<div class="profile-meta">
{% if member.headline %}
<div class="course-meta mr-3"> {{ member.headline }} </div>
{% endif %}
<div class="profile-info">
<div class="profile-name-section">
<div class="profile-name" data-name="{{ member.name }}"> {{ member.full_name }} </div>
{% if enrollment %}
<div class="course-meta">
<img src="/assets/lms/icons/book_plain.svg">
{{ enrollment }} {{ enrollment_suffix }} {{ _("taken") }} </div>
{% endif %}
{% if courses_created | length %}
<div class="creator-badge"> {{ _("Creator") }} </div>
{% endif %}
{% if member.looking_for_job %}
<div class="creator-badge"> {{ _("Open Network") }} </div>
{% endif %}
{% if frappe.session.user == member.email %}
<div class="ml-auto mt-1">
<a class="btn btn-secondary btn-sm" href="/dashboard"> {{ _("Visit Dashboard") }} </a>
<a class="btn btn-secondary btn-sm ml-2" href="/edit-profile/{{ member.email }}/edit"> {{ _("Edit Profile") }} </a>
</div>
{% endif %}
</div>
<div class="profile-meta">
{% if member.headline %}
<div class="course-meta mr-3"> {{ member.headline }} </div>
{% endif %}
{% if enrollment %}
<div class="course-meta">
<img src="/assets/lms/icons/book_plain.svg">
{{ enrollment }} {{ enrollment_suffix }} {{ _("taken") }}
</div>
{% endif %}
</div>
</div>
</div>
</div>
{% endmacro %}
{% macro CoursesCreated(member, read_only) %}
{% set authored_courses = get_authored_courses(member.name) %}
{% if authored_courses | length %}
<div class="profile-courses">
<div class="course-home-headings"> {{ _("Courses Created") }} </div>
<div class="cards-parent">
{% for course in authored_courses %}
{{ widgets.CourseCard(course=course, read_only=read_only) }}
{% endfor %}
</div>
</div>
{% endif %}
{% endmacro %}
<!-- Courses Mentored -->
{% macro CoursesMentored(member, read_only) %}
{% if member.get_mentored_courses() | length %}
<div class="profile-courses">
<div class="course-home-headings"> {{ _("Courses Mentored") }} </div>
<div class="cards-parent">
{% for course in member.get_mentored_courses() %}
{{ widgets.CourseCard(course=course, read_only=read_only) }}
{% endfor %}
</div>
<div class="course-home-headings"> {{ _("Courses Mentored") }} </div>
<div class="cards-parent">
{% for course in member.get_mentored_courses() %}
{{ widgets.CourseCard(course=course, read_only=read_only) }}
{% endfor %}
</div>
</div>
{% endif %}
{% endmacro %}
{% macro CoursesEnrolled(member, read_only) %}
{% set enrolled = get_enrolled_courses() %}
{% if enrolled.completed | length %}
<div class="profile-courses">
<div class="course-home-headings"> {{ _("Courses Completed") }} </div>
<div class="cards-parent">
{% for course in enrolled.completed %}
{{ widgets.CourseCard(course=course, read_only=read_only) }}
{% endfor %}
</div>
</div>
{% endif %}
{% if enrolled.in_progress | length %}
<div class="profile-courses">
<div class="course-home-headings"> {{ _("Courses In Progress") }} </div>
<div class="cards-parent">
{% for course in enrolled.in_progress %}
{{ widgets.CourseCard(course=course, read_only=read_only) }}
{% endfor %}
</div>
</div>
{% endif %}
{% endmacro %}
<!-- Profile Tabs Extension -->
{% macro ProfileTabs(profile_tabs) %}
<div>
{% for tab in profile_tabs %}
{% set slug = title.lower().replace(" ", "-") %}
<div class="tab-content">
<div class="tab-pane fade py-4 show active" role="tabpanel" id="slug">
{{ tab.render() }}
{% for tab in profile_tabs %}
{% set slug = title.lower().replace(" ", "-") %}
<div class="tab-content">
<div class="tab-pane fade py-4 show active" role="tabpanel" id="slug">
{{ tab.render() }}
</div>
</div>
</div>
{% endfor %}
{% endfor %}
</div>
{% endmacro %}
{% macro About(member) %}
{% if member.bio %}
<div class="">
<div class="common-card-style profile-card">
<div class="course-home-headings"> {{ _("About") }} </div>
<div class="description">{{ member.bio }}</div>
</div>
</div>
{% endif %}
<!-- Role Settings -->
{% macro RoleSettings(member) %}
{% if has_course_moderator_role() %}
<div class="">
<div class="common-card-style column-card">
<div class="course-home-headings"> {{ _("Role Settings") }} </div>
<div>
<label class="role">
<input type="checkbox" id="instructor" data-role="Course Instructor"
{% if has_course_instructor_role(member.name) %} checked {% endif %}>
{{ _("Course Instructor") }}
</label>
<label class="role">
<input type="checkbox" id="moderator" data-role="Course Moderator"
{% if has_course_moderator_role(member.name) %} checked {% endif %}>
{{ _("Course Moderator") }}
</label>
</div>
</div>
</div>
{% endif %}
{% endmacro %}
<!-- About Section -->
{% macro About(member) %}
<div class="course-home-headings"> {{ _("About") }} </div>
<div class="description">
{% if member.bio %}
{{ member.bio }}
{% else %}
{{ _("Hey, my name is ") }} {{ member.full_name }}
{% endif %}
</div>
{% endmacro %}
<!-- Work Preference -->
{% macro WorkPreference(member) %}
<div class="education-details">
<div class="common-card-style profile-card">
<div class="course-home-headings"> {{ _("Work Preference") }} </div>
<div class="course-home-headings mt-10"> {{ _("Work Preference") }} </div>
<div> {{ member.attire }} </div>
<div> {{ member.collaboration }} </div>
<div> {{ member.role }} </div>
<div> {{ member.location_preference }} </div>
<div> {{ member.time }} </div>
<div> {{ member.company_type }} </div>
</div>
</div>
{% endmacro %}
<!-- Career Preference -->
{% macro CareerPreference(member) %}
{% if member.preferred_functions or member.preferred_industries or member.preferred_location or member.dream_companies %}
<div class="education-details">
<div class="common-card-style profile-card">
<div class="course-home-headings"> {{ _("Career Preference") }} </div>
{% if member.preferred_functions or member.preferred_industries or member.preferred_location or member.dream_companies %}
<div class="course-home-headings mt-10"> {{ _("Career Preference") }} </div>
<div class="profile-column-grid">
{% if member.preferred_functions | length %}
<div>
<b>{{ _("Preferred Functions:") }}</b>
{% for function in member.preferred_functions %}
<div class="description">{{ function.function }}</div>
{% endfor %}
</div>
{% endif %}
{% if member.preferred_industries | length %}
<div>
<b>{{ _("Preferred Industries:") }}</b>
{% for industry in member.preferred_industries %}
<div class="description">{{ industry.industry }}</div>
{% endfor %}
</div>
{% endif %}
{% if member.preferred_functions | length %}
<div>
<b>{{ _("Preferred Functions:") }}</b>
{% for function in member.preferred_functions %}
<div class="description">{{ function.function }}</div>
{% endfor %}
</div>
{% endif %}
{% if member.preferred_location %}
<div>
<b> {{ _("Preferred Locations:") }} </b>
<div class="description"> {{ member.preferred_location }} </div>
</div>
{% endif %}
{% if member.preferred_industries | length %}
<div>
<b>{{ _("Preferred Industries:") }}</b>
{% for industry in member.preferred_industries %}
<div class="description">{{ industry.industry }}</div>
{% endfor %}
</div>
{% endif %}
{% if member.preferred_location %}
<div>
<b> {{ _("Preferred Locations:") }} </b>
<div class="description"> {{ member.preferred_location }} </div>
</div>
{% endif %}
{% if member.dream_companies %}
<div>
<b> {{ _("Dream Companies:") }} </b>
<div class="description"> {{ member.dream_companies }} </div>
</div>
{% endif %}
{% if member.dream_companies %}
<div>
<b> {{ _("Dream Companies:") }} </b>
<div class="description"> {{ member.dream_companies }} </div>
</div>
{% endif %}
</div>
</div>
</div>
{% endif %}
{% endif %}
{% endmacro %}
<!-- Contact Section -->
{% macro Contact(member) %}
{% if member.linkedin or member.medium or member.github %}
<div class="education-details">
<div class="common-card-style profile-card">
<div class="course-home-headings"> {{ _("Contact") }} </div>
{% if member.linkedin or member.medium or member.github %}
<div class="course-home-headings mt-10"> {{ _("Contact") }} </div>
<div class="profile-column-grid">
{% if member.linkedin %}
{% set linkedin = member.linkedin[:-1] if member.linkedin[-1] == "/" else member.linkedin %}
<a class="button-links description" href="{{ member.linkedin }}">
{% if member.linkedin %}
{% set linkedin = member.linkedin[:-1] if member.linkedin[-1] == "/" else member.linkedin %}
<a class="button-links description" href="{{ member.linkedin }}">
<img src="/assets/lms/icons/linkedin.svg"> {{ linkedin.split("/")[-1] }}
</a>
</a>
{% endif %}
{% if member.medium %}
<a class="button-links description" href="{{ member.medium}}">
<img src="/assets/lms/icons/medium.svg"> {{ member.medium.split("/")[-1] }}
<img src="/assets/lms/icons/medium.svg"> {{ member.medium.split("/")[-1] }}
</a>
{% endif %}
{% if member.github %}
<a class="button-links description" href="{{ member.github }}">
<img src="/assets/lms/icons/github.svg"> {{ member.github.split("/")[-1] }}
<img src="/assets/lms/icons/github.svg"> {{ member.github.split("/")[-1] }}
</a>
{% endif %}
</div>
</div>
</div>
{% endif %}
{% endif %}
{% endmacro %}
<!-- Skills -->
{% macro Skills(member) %}
{% if member.skill | length %}
<div class="education-details">
<div class="common-card-style profile-card">
<div class="course-home-headings"> {{ _("Skills")}} </div>
{% if member.skill | length %}
<div class="course-home-headings mt-10"> {{ _("Skills")}} </div>
<div class="profile-column-grid">
{% for skill in member.skill %}
<div class="description"> {{ skill.skill_name }} </div>
{% endfor %}
{% for skill in member.skill %}
<div class="description"> {{ skill.skill_name }} </div>
{% endfor %}
</div>
</div>
</div>
{% endif %}
{% endif %}
{% endmacro %}
<!-- Education Details -->
{% macro EducationDetails(member) %}
{% if member.education %}
<div class="education-details">
<div class="common-card-style profile-card">
<div class="course-home-headings"> {{ _("Education") }} </div>
{% if member.education %}
<div class="course-home-headings mt-10"> {{ _("Education") }} </div>
<div class="profile-grid-card">
{% for edu in member.education %}
<div class="profile-card-row">
<div class="bold-title"> {{ edu.institution_name }} </div>
<div class="profile-item"> {{ edu.degree_type }} <span></span> {{ edu.major }}
{% if not member.hide_private %}
<!-- {% if edu.grade_type %} {{ edu.grade_type }} {% endif %} -->
{% if edu.grade %} <span></span> {{ edu.grade }} {% endif %}
{% endif %}
{% for edu in member.education %}
<div class="column-card-row">
<div class="bold-title"> {{ edu.institution_name }} </div>
<div class="profile-item"> {{ edu.degree_type }} <span></span> {{ edu.major }}
{% if not member.hide_private %}
<!-- {% if edu.grade_type %} {{ edu.grade_type }} {% endif %} -->
{% if edu.grade %} <span></span> {{ edu.grade }} {% endif %}
{% endif %}
</div>
<div class="description">
{% if edu.start_date %}
{{ frappe.utils.format_date(edu.start_date, "MMM YYYY") }} -
{% endif %}
{{ frappe.utils.format_date(edu.end_date, "MMM YYYY") }}
</div>
<div class="description"> {{ edu.location }} </div>
</div>
<div class="description">
{% if edu.start_date %}
{{ frappe.utils.format_date(edu.start_date, "MMM YYYY") }} -
{% endif %}
{{ frappe.utils.format_date(edu.end_date, "MMM YYYY") }} </div>
<div class="description"> {{ edu.location }} </div>
</div>
{% endfor %}
{% endfor %}
</div>
</div>
</div>
{% endif %}
{% endif %}
{% endmacro %}
<!-- Work Details -->
{% macro WorkDetails(member) %}
{% set work_details = member.work_experience + member.internship %}
{% if work_details | length %}
<div class="education-details">
<div class="common-card-style profile-card">
<div class="course-home-headings"> {{ _("Work Experience") }} </div>
<div class="profile-grid-card">
{% for work in work_details %}
<div class="">
<div class="bold-title"> {{ work.title }} </div>
<div class="profile-item"> {{ work.company }} </div>
<div class="description"> {{ frappe.utils.format_date(work.from_date, "MMM YYYY") }} -
{% if work.to_date %} {{ frappe.utils.format_date(work.to_date, "MMM YYYY") }} {% else %} Present {% endif %} </div>
<div class="description"> {{ work.location }} </div>
{% if work.description %} <div class="profile-item"> {{ work.description }} </div> {% endif %}
</div>
{% endfor %}
</div>
</div>
</div>
{% endif %}
{% endmacro %}
{% set work_details = member.work_experience + member.internship %}
{% macro Certification(member) %}
{% if member.certification %}
<div class="education-details">
<div class="common-card-style profile-card">
<div class="course-home-headings"> {{ _("Certification") }} </div>
{% if work_details | length %}
<div class="course-home-headings mt-10"> {{ _("Work Experience") }} </div>
<div class="profile-grid-card">
{% for cert in member.certification %}
<div class="">
<div class="bold-title"> {{ cert.certification_name }} </div>
<div class="profile-item"> {{ cert.organization }} </div>
<div class="description"> {{ frappe.utils.format_date(cert.issue_date, "MMM YYYY") }}
{% if cert.expiration_date %} - {{ frappe.utils.format_date(cert.expiration_date, "MMM YYYY") }} {% endif %} </div>
{% if cert.description %} <div class="profile-item"> {{ cert.description }} </div> {% endif %}
</div>
{% endfor %}
</div>
</div>
</div>
{% endif %}
{% for work in work_details %}
<div class="">
<div class="bold-title"> {{ work.title }} </div>
<div class="profile-item"> {{ work.company }} </div>
<div class="description">
{{ frappe.utils.format_date(work.from_date, "MMM YYYY") }} -
{% if work.to_date %} {{ frappe.utils.format_date(work.to_date, "MMM YYYY") }}
{% else %} Present {% endif %}
</div>
<div class="description"> {{ work.location }} </div>
{% if work.description %}
<div class="profile-item">
{{ work.description }}
</div>
{% endif %}
</div>
{% endfor %}
</div>
{% endif %}
{% endmacro %}
{% block script %}
<script>
frappe.ready(() => {
if ("{{ member.name }}" == frappe.session.user) {
setTimeout(() => {
var link_array = $('.nav-link').filter((i, elem) => $(elem).text().trim() === "My Profile");
link_array.length && $(link_array[0]).addClass("active");
}, 0)
}
if ($(".profile-column-one").children().length == 0) {
$(".profile-column-one").hide();
}
});
</script>
{% endblock %}
<!-- Certifications -->
{% macro ExternalCertification(member) %}
{% if member.certification %}
<div class="course-home-headings mt-10"> {{ _("External Certification") }} </div>
<div class="profile-grid-card">
{% for cert in member.certification %}
<div class="">
<div class="bold-title"> {{ cert.certification_name }} </div>
<div class="profile-item"> {{ cert.organization }} </div>
<div class="description">
{{ frappe.utils.format_date(cert.issue_date, "MMM YYYY") }}
{% if cert.expiration_date %}
- {{ frappe.utils.format_date(cert.expiration_date, "MMM YYYY") }}
{% endif %}
</div>
{% if cert.description %}
<div class="profile-item">
{{ cert.description }}
</div>
{% endif %}
</div>
{% endfor %}
</div>
{% endif %}
{% endmacro %}

View File

@@ -0,0 +1,42 @@
frappe.ready(() => {
make_profile_active_in_navbar();
$(".role").change((e) => {
save_role(e);
});
});
const make_profile_active_in_navbar = () => {
let member_name = $(".profile-name").data("name");
if (member_name == frappe.session.user) {
setTimeout(() => {
let link_array = $('.nav-link').filter((i, elem) => $(elem).text().trim() === "My Profile");
link_array.length && $(link_array[0]).addClass("active");
}, 0)
}
}
const save_role = (e) => {
let member_name = $(".profile-name").data("name");
let role = $(e.currentTarget).children("input");
frappe.call({
method: "lms.overrides.user.save_role",
args: {
"user": member_name,
"role": role.data("role"),
"value": role.prop("checked") ? 1 : 0
},
callback: (data) => {
if (data.message) {
frappe.show_alert({
message: __("Saved"),
indicator: "green",
});
}
}
})
}

View File

@@ -1,6 +1,6 @@
import frappe
from lms.page_renderers import get_profile_url_prefix
from urllib.parse import urlencode
def get_context(context):
context.no_cache = 1
@@ -12,13 +12,16 @@ def get_context(context):
if username:
frappe.local.flags.redirect_location = get_profile_url_prefix() + username
raise frappe.Redirect
try:
context.member = frappe.get_doc("User", {"username": username})
except:
context.template = "www/404.html"
return
context.profile_tabs = get_profile_tabs(context.member)
def get_profile_tabs(user):
"""Returns the enabled ProfileTab objects.

View File

@@ -9,7 +9,7 @@ def get_common_context(context):
batch_name = None
course = frappe.db.get_value("LMS Course",
frappe.form_dict["course"], ["name", "title", "video_link", "enable_certification"], as_dict=True)
frappe.form_dict["course"], ["name", "title", "video_link", "enable_certification", "status"], as_dict=True)
if not course:
context.template = "www/404.html"
return