fix: discussion, batch home page, new fields for batches

This commit is contained in:
pateljannat
2021-05-26 12:13:04 +05:30
31 changed files with 371 additions and 225 deletions

View File

@@ -1,6 +1,4 @@
{% extends "templates/base.html" %}
{% from "www/macros/common_macro.html" import InstructorsSection, MentorsSection %}
{% block title %}About{% endblock %}
{% block head_include %}
<meta name="description" content="Courses" />
@@ -14,8 +12,13 @@
{{ widgets.BatchTabs(course=course, batch=batch) }}
<div class="tab-content" id="about">
{{ CourseBasicDetail(course)}}
{{ InstructorsSection(course.get_instructor()) }}
{{ BatchDetails(batch)}}
<div class="d-flex align-items-center">
<div class="col-lg-4 col-md-12">
<div class="sidebar">
{{ widgets.InstructorSection(instructor=course.get_instructor()) }}
</div>
</div>
</div>
</div>
</div>
{% endblock %}
@@ -35,25 +38,3 @@
<h2>About the Course</h2>
<div>{{frappe.utils.md_to_html(course.description)}}</div>
{% endmacro %}
{% macro BatchDetails(batch) %}
<h2>About the Batch</h2>
<div class="batch">
<div class="batch-details">
<div>Session every {{batch.sessions_on}}</div>
<div>{{frappe.utils.format_time(batch.start_time, "short")}} -
{{frappe.utils.format_time(batch.end_time, "short")}}
</div>
<div>Starting {{frappe.utils.format_date(batch.start_date, "medium")}}</div>
<div class="course-type" style="color: #888; padding: 10px 0px;">mentors</div>
{% for m in batch.get_mentors() %}
<div>
{{ widgets.Avatar(member=m, avatar_class="avatar-medium" ) }}
<span class="instructor-title">{{m.full_name}}</span>
</div>
{% endfor %}
</div>
</div>
{% endmacro %}

View File

@@ -3,5 +3,3 @@ from . import utils
def get_context(context):
utils.get_common_context(context)
print("context", context)

View File

@@ -12,11 +12,11 @@
<div class="container">
{{ widgets.BatchTabs(course=course, batch=batch) }}
{{ widgets.BatchHeader(course_name=course.title, member_count=member_count)}}
<div class="messages">
<div class="message-section">
<div class="messages-container mt-5">
{{ widgets.BatchHeader(batch_name=batch.title, member_count=member_count)}}
<ol class="messages">
{{ Messages(messages) }}
</div>
</ol>
{{ TextArea() }}
</div>
</div>
@@ -24,25 +24,25 @@
{% macro Messages(messages) %}
{% for message in messages %}
<div class="discussion {% if message.is_author %} is-author {% endif %}">
<li class="discussion {% if message.is_author %} ours {% endif %}">
<div class="d-flex justify-content-between">
<div class="font-weight-bold">
{{ message.author_name }}
</div>
<div class="text-muted">
{{ frappe.utils.pretty_date(message.creation) }}
{{ frappe.utils.format_datetime(message.creation, "dd-mm-yyyy HH:mm") }}
</div>
</div>
<div class="mt-5">
{{ message.message }}
</div>
</div>
</li>
{% endfor %}
{% endmacro %}
{% macro TextArea() %}
<form class="msger-inputarea">
<form class="msger-inputarea mb-1">
<input type="text" class="msger-input" placeholder="Write your message...">
<button type="submit" class="msger-send-btn" data-batch="{{batch.name | urlencode }}">Send</button>
<button type="submit" class="btn btn-primary msger-send-btn" data-batch="{{batch.name | urlencode }}">Send</button>
</form>
{% endmacro %}

View File

@@ -11,7 +11,9 @@ frappe.ready(() => {
})
setTimeout(() => {
window.scrollTo(0, document.body.scrollHeight);
var message_element = document.getElementsByClassName("messages")[0]
message_element.scrollTo(0, message_element.scrollHeight);
document.getElementsByClassName("messages-container")[0].scrollIntoView({block: "center"})
}, 300);
$(".msger-send-btn").click((e) => {

View File

@@ -0,0 +1,57 @@
{% extends "templates/base.html" %}
{% block title %}About{% endblock %}
{% block head_include %}
<meta name="description" content="Courses" />
<meta name="keywords" content="" />
<link rel="stylesheet" href="/assets/frappe/css/font-awesome.css">
{% endblock %}
{% block content %}
<div class="container mt-5">
{{ widgets.BatchTabs(course=course, batch=batch) }}
<h1 class="mt-5">{{ batch.title }}</h1>
<div class="course-details">
{{ widgets.CourseOutline(course=course, batch=batch, show_link=True) }}
</div>
<div class="col-lg-4 col-md-12">
<h2>Batch Schedule</h2>
{{ BatchDetails(batch) }}
</div>
<h2>Batch Details</h2>
{{ frappe.utils.md_to_html(batch.description) }}
{{ ConnectWithBatch(batch) }}
</div>
{% endblock %}
{% macro BatchDetails(batch) %}
<div class="batch">
<div class="batch-details">
<div>Session every {{batch.sessions_on}}</div>
<div>{{frappe.utils.format_time(batch.start_time, "short")}} -
{{frappe.utils.format_time(batch.end_time, "short")}}
</div>
<div>Starting {{frappe.utils.format_date(batch.start_date, "medium")}}</div>
<div class="course-type" style="color: #888; padding: 10px 0px;">mentors</div>
{% for m in batch.get_mentors() %}
<div>
{{ widgets.Avatar(member=m, avatar_class="avatar-medium" ) }}
<span class="instructor-title">{{m.full_name}}</span>
</div>
{% endfor %}
</div>
</div>
{% endmacro %}
{% macro ConnectWithBatch(batch)%}
<h2>Connect with your Batch</h2>
<p>
Reach out on <a href="{{ batch.telegram_link }}">Telegram</a>.
</p>
<p>
Join the <a href="{{ batch.video_call_link }}">Online Class</a>.
</p>
{% endmacro %}

View File

@@ -0,0 +1,5 @@
import frappe
from . import utils
def get_context(context):
utils.get_common_context(context)

View File

@@ -86,49 +86,16 @@
{{ super() }}
{{ LiveCodeEditorJS() }}
<!-- <script type="text/javascript">
<script type="text/javascript">
$(function() {
var editorLookup = {};
var batch_name = "{{ batch.name }}";
var lesson_name = "{{ lesson.name }}";
$(".canvas-editor").each((i, e) => {
var data = $(e).data();
var editor = new LiveCodeEditor(e, {
runtime: "python-canvas",
base_url: "{{ livecode_url }}",
codemirror: true,
userdata: data,
autosave: function(editor, code) {
// can't autosave when user is Guest
if (frappe.session.user == "Guest") {
return;
}
var data = editor.options.userdata;
var code = editor.codemirror.doc.getValue();
// console.log("autosaving...")
frappe.call("community.lms.api.autosave_section", {
section: data.section,
code: code
}).then((r) => {
// TODO: verify
})
}
})
editorLookup[data.section] = editor;
})
$(".canvas-editor .reset").each((i, e) => {
$(e).on("click", function(event) {
var data = $(this).parents(".canvas-editor").data();
var section = data.section;
frappe.call("community.lms.api.get_section", {
name: section
}).then(r => {
var editor = editorLookup[data.section];
editor.codemirror.doc.setValue(r.message.contents);
})
})
frappe.call("community.lms.api.save_current_lesson", {
"batch_name": batch_name,
"lesson_name": lesson_name
})
})
</script> -->
</script>
{%- endblock %}

View File

@@ -10,28 +10,25 @@ def get_context(context):
lesson_number = f"{chapter_index}.{lesson_index}"
course_name = context.course.name
batch_name = context.batch.name
if not chapter_index or not lesson_index:
frappe.local.flags.redirect_location = f"/courses/{course_name}/{batch_name}/learn/1.1"
index_ = get_lesson_index(context.course, context.batch, frappe.session.user) or "1.1"
frappe.local.flags.redirect_location = context.batch.get_learn_url(index_)
raise frappe.Redirect
context.lesson = context.course.get_lesson(chapter_index, lesson_index)
context.lesson_index = lesson_index
context.chapter_index = chapter_index
print(context.lesson)
outline = context.course.get_outline()
prev_ = outline.get_prev(lesson_number)
next_ = outline.get_next(lesson_number)
context.prev_chap = get_chapter_title(course_name, prev_)
context.next_chap = get_chapter_title(course_name, next_)
context.next_url = get_learn_url(course_name, batch_name, next_)
context.prev_url = get_learn_url(course_name, batch_name, prev_)
context.next_url = context.batch.get_learn_url(next_)
context.prev_url = context.batch.get_learn_url(prev_)
def get_learn_url(course_name, batch_name, lesson_number):
if not lesson_number:
return
return f"/courses/{course_name}/{batch_name}/learn/{lesson_number}"
def get_chapter_title(course_name, lesson_number):
if not lesson_number:
@@ -40,3 +37,9 @@ def get_chapter_title(course_name, lesson_number):
lesson_index = lesson_number.split(".")[1]
chapter_name = frappe.db.get_value("Chapter", {"course": course_name, "index_": chapter_index}, "name")
return frappe.db.get_value("Lesson", {"chapter": chapter_name, "index_": lesson_index}, "title")
def get_lesson_index(course, batch, user):
lesson = batch.get_current_lesson(user)
return lesson and course.get_lesson_index(lesson)

View File

@@ -17,25 +17,31 @@
{% macro MembersList(members) %}
<div class="mt-5 col">
<div class="mt-5">
{% for member in members %}
<div class="row">
<div class="row mb-5">
<div>
{{ widgets.Avatar(member=member, avatar_class="avatar-large") }}
</div>
<div class="ml-5">
<a class="anchor_style" href="/{{member.username}}">
<h3>{{ member.full_name }}</h3>
</a>
{% if course.is_mentor(member.name) %}
<div class="badge badge-success">Mentor</div>
{% endif %}
{% if member.bio %}
<div class="mt-5">
<i>{{ member.bio }}</i>
<div class="col">
<div class="row ml-1">
<a class="anchor_style" href="/{{member.username}}">
<h3>{{ member.full_name }}</h3>
</a>
{% if course.is_mentor(member.name) %}
<div class="ml-2">
<div class="badge badge-success">Mentor</div>
</div>
{% endif %}
</div>
{% if member.bio %}
<i>{{member.bio}}</i>
{% endif %}
</div>
</div>
{% if loop.index != member_count %}
<hr>
{% endif %}
{% endfor %}
</div>
{% endmacro %}

View File

@@ -3,3 +3,4 @@ from . import utils
def get_context(context):
utils.get_common_context(context)
print(context.members[0].bio)

View File

@@ -32,8 +32,7 @@ class BatchReport:
def get_submissions(batch):
students = batch.get_students()
students_map = {s['email']: s for s in students}
students_map = {s.email: s for s in students}
names, values = nparams("s", students_map.keys())
sql = """

View File

@@ -13,7 +13,7 @@ def get_common_context(context):
return
batch = course.get_batch(batch_name)
if not batch:
if not batch or not batch.is_member(frappe.session.user):
frappe.local.flags.redirect_location = "/courses/" + course_name
raise frappe.Redirect