fix: class pages
This commit is contained in:
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@@ -1,3 +0,0 @@
|
|||||||
{
|
|
||||||
"python.formatting.provider": "black"
|
|
||||||
}
|
|
||||||
@@ -179,10 +179,6 @@ website_route_rules = [
|
|||||||
"from_route": "/classes/<classname>/students/<username>",
|
"from_route": "/classes/<classname>/students/<username>",
|
||||||
"to_route": "/classes/progress",
|
"to_route": "/classes/progress",
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"from_route": "/assignment-grading/<assignment>",
|
|
||||||
"to_route": "assignment_grading/assignment_grading",
|
|
||||||
},
|
|
||||||
{"from_route": "/assignments/<assignment>", "to_route": "assignments/assignment"},
|
{"from_route": "/assignments/<assignment>", "to_route": "assignments/assignment"},
|
||||||
{
|
{
|
||||||
"from_route": "/assignment-submission/<assignment>/<submission>",
|
"from_route": "/assignment-submission/<assignment>/<submission>",
|
||||||
|
|||||||
@@ -46,8 +46,7 @@ def upload_assignment(
|
|||||||
"member": frappe.session.user,
|
"member": frappe.session.user,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
print(doc.assignment)
|
|
||||||
print(comments)
|
|
||||||
doc.update(
|
doc.update(
|
||||||
{
|
{
|
||||||
"assignment_attachment": assignment_attachment,
|
"assignment_attachment": assignment_attachment,
|
||||||
|
|||||||
@@ -80,7 +80,6 @@ def switch_batch(course_name, email, batch_name):
|
|||||||
|
|
||||||
old_batch = frappe.get_doc("LMS Batch", membership.batch)
|
old_batch = frappe.get_doc("LMS Batch", membership.batch)
|
||||||
|
|
||||||
print("updating membership", membership.name)
|
|
||||||
membership.batch = batch_name
|
membership.batch = batch_name
|
||||||
membership.save()
|
membership.save()
|
||||||
|
|
||||||
|
|||||||
@@ -115,26 +115,11 @@ body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.image-preview {
|
.image-preview {
|
||||||
width: 100%;
|
width: 280px;
|
||||||
height: 100%;
|
height: 178px;
|
||||||
border-radius: var(--border-radius-md);
|
border-radius: var(--border-radius-md);
|
||||||
}
|
|
||||||
|
|
||||||
.file-source-preview {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
position: relative;
|
|
||||||
width: 100%;
|
|
||||||
height: 250px;
|
|
||||||
border: 1px solid var(--gray-300);
|
border: 1px solid var(--gray-300);
|
||||||
border-radius: var(--border-radius-md);
|
margin-top: 1rem;
|
||||||
}
|
|
||||||
|
|
||||||
.file-source-preview .btn-close {
|
|
||||||
position: absolute;
|
|
||||||
top: 5%;
|
|
||||||
right: 5%;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
textarea.field-input {
|
textarea.field-input {
|
||||||
|
|||||||
@@ -1,80 +0,0 @@
|
|||||||
{% extends "templates/base.html" %}
|
|
||||||
{% block title %}
|
|
||||||
{{ _("Assignments") }}
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<div class="common-page-style">
|
|
||||||
<div class="container">
|
|
||||||
<div class="common-card-style column-card medium">
|
|
||||||
<div class="course-home-headings"> {{ _("Assignment Grading") }} </div>
|
|
||||||
{{ AssignmentForm(assignment) }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
|
|
||||||
{% macro AssignmentForm(assignment) %}
|
|
||||||
{% set course_title = frappe.db.get_value("LMS Course", assignment.course, "title") %}
|
|
||||||
{% set lesson_title = frappe.db.get_value("Course Lesson", assignment.lesson, "title") %}
|
|
||||||
|
|
||||||
<form class="register-form">
|
|
||||||
|
|
||||||
<div class="form-padding">
|
|
||||||
<div class="form-row">
|
|
||||||
<div class="form-group col-md-6">
|
|
||||||
<label> {{ _("Member") }} </label>
|
|
||||||
<input type="text" class="form-control" value="{{ assignment.member_name }}" disabled readonly />
|
|
||||||
</div>
|
|
||||||
<div class="form-group col-md-6">
|
|
||||||
<label> {{ _("Course") }} </label>
|
|
||||||
<input type="text" class="form-control" value="{{ course_title }}" disabled readonly />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-row">
|
|
||||||
<div class="col-md-6">
|
|
||||||
<div class="form-group">
|
|
||||||
<label> {{ _("Lesson") }} </label>
|
|
||||||
<input type="text" class="form-control" value="{{ lesson_title }}" disabled readonly />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<label> {{ _("Result") }} </label>
|
|
||||||
<div class="control-input flex align-center form-control">
|
|
||||||
<select class="input-with-feedback form-control pl-0" id="result"
|
|
||||||
{% if not is_moderator %} disabled {% endif %} data-type="{{ assignment.status }}">
|
|
||||||
<option selected> {{ _("Not Graded") }} </option>
|
|
||||||
<option value="Pass"> {{ _("Pass") }} </option>
|
|
||||||
<option value="Fail"> {{ _("Fail") }} </option>
|
|
||||||
</select>
|
|
||||||
<div class="select-icon">
|
|
||||||
<svg class="icon icon-sm">
|
|
||||||
<use class="" href="#icon-select"></use>
|
|
||||||
</svg>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group col-md-6">
|
|
||||||
<label>{{ _("Comments") }}</label>
|
|
||||||
<textarea class="form-control" id="comments" {% if not is_moderator %} disabled readonly {% endif %}
|
|
||||||
>{% if assignment.comments %}{{ assignment.comments }}{% endif %}</textarea>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="text-right form-padding">
|
|
||||||
<a class="btn btn-secondary btn-sm" href="{{ assignment.assignment }}" target="_blank">
|
|
||||||
{{ _("Open Attachment") }}
|
|
||||||
</a>
|
|
||||||
<button class="btn btn-primary btn-sm ml-2" id="save-assignment" data-assignment="{{ assignment.name }}">
|
|
||||||
{{ _("Save") }}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
{% endmacro %}
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
frappe.ready(() => {
|
|
||||||
this.result;
|
|
||||||
let self = this;
|
|
||||||
|
|
||||||
set_result();
|
|
||||||
|
|
||||||
$("#save-assignment").click((e) => {
|
|
||||||
save_assignment(e);
|
|
||||||
});
|
|
||||||
|
|
||||||
$("#result").change((e) => {
|
|
||||||
$("#result option:selected").each(function () {
|
|
||||||
self.result = $(this).val();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
const set_result = () => {
|
|
||||||
let self = this;
|
|
||||||
let result = $("#result").data("type");
|
|
||||||
if (result) {
|
|
||||||
$("#result option").each((i, elem) => {
|
|
||||||
if ($(elem).val() == result) {
|
|
||||||
$(elem).attr("selected", true);
|
|
||||||
self.result = result;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const save_assignment = (e) => {
|
|
||||||
e.preventDefault();
|
|
||||||
if (!["Pass", "Fail"].includes(this.result))
|
|
||||||
frappe.throw({
|
|
||||||
title: __("Not Graded"),
|
|
||||||
message: __("Please grade the assignment."),
|
|
||||||
});
|
|
||||||
frappe.call({
|
|
||||||
method: "lms.lms.doctype.lms_assignment_submission.lms_assignment_submission.grade_assignment",
|
|
||||||
args: {
|
|
||||||
name: $(e.currentTarget).data("assignment"),
|
|
||||||
result: this.result,
|
|
||||||
comments: $("#comments").val(),
|
|
||||||
},
|
|
||||||
callback: (data) => {
|
|
||||||
frappe.show_alert({
|
|
||||||
message: __("Saved"),
|
|
||||||
indicator: "green",
|
|
||||||
});
|
|
||||||
setTimeout(() => {
|
|
||||||
window.history.go(-2);
|
|
||||||
}, 2000);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
};
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
import frappe
|
|
||||||
from lms.lms.utils import has_course_moderator_role
|
|
||||||
from frappe import _
|
|
||||||
|
|
||||||
|
|
||||||
def get_context(context):
|
|
||||||
context.no_cache = 1
|
|
||||||
assignment = frappe.form_dict["assignment"]
|
|
||||||
|
|
||||||
context.assignment = frappe.db.get_value(
|
|
||||||
"LMS Assignment Submission",
|
|
||||||
assignment,
|
|
||||||
[
|
|
||||||
"assignment",
|
|
||||||
"comments",
|
|
||||||
"status",
|
|
||||||
"name",
|
|
||||||
"member",
|
|
||||||
"member_name",
|
|
||||||
"course",
|
|
||||||
"lesson",
|
|
||||||
],
|
|
||||||
as_dict=True,
|
|
||||||
)
|
|
||||||
context.is_moderator = has_course_moderator_role()
|
|
||||||
|
|
||||||
if (
|
|
||||||
not has_course_moderator_role()
|
|
||||||
and not frappe.session.user == context.assignment.member
|
|
||||||
):
|
|
||||||
message = "You don't have the permissions to access this page."
|
|
||||||
if frappe.session.user == "Guest":
|
|
||||||
message = "Please login to access this page."
|
|
||||||
|
|
||||||
raise frappe.PermissionError(_(message))
|
|
||||||
@@ -68,22 +68,12 @@ def get_context(context):
|
|||||||
order_by="date",
|
order_by="date",
|
||||||
)
|
)
|
||||||
|
|
||||||
context.assessments = get_assessments(context.is_moderator, class_name)
|
context.assessments = get_assessments(class_name)
|
||||||
|
context.all_assignments = get_all_assignments(class_name)
|
||||||
|
context.all_quizzes = get_all_quizzes(class_name)
|
||||||
|
|
||||||
all_assignments = frappe.get_all(
|
|
||||||
"LMS Assignment", {"owner": frappe.session.user}, ["name", "title"]
|
|
||||||
)
|
|
||||||
for assignment in all_assignments:
|
|
||||||
assignment.checked = frappe.db.exists(
|
|
||||||
{
|
|
||||||
"doctype": "LMS Assessment",
|
|
||||||
"assessment_type": "LMS Assignment",
|
|
||||||
"assessment_name": assignment.name,
|
|
||||||
"parent": class_name,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
context.all_assignments = all_assignments
|
|
||||||
|
|
||||||
|
def get_all_quizzes(class_name):
|
||||||
all_quizzes = frappe.get_all(
|
all_quizzes = frappe.get_all(
|
||||||
"LMS Quiz", {"owner": frappe.session.user}, ["name", "title"]
|
"LMS Quiz", {"owner": frappe.session.user}, ["name", "title"]
|
||||||
)
|
)
|
||||||
@@ -96,4 +86,20 @@ def get_context(context):
|
|||||||
"parent": class_name,
|
"parent": class_name,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
context.all_quizzes = all_quizzes
|
return all_quizzes
|
||||||
|
|
||||||
|
|
||||||
|
def get_all_assignments(class_name):
|
||||||
|
all_assignments = frappe.get_all(
|
||||||
|
"LMS Assignment", {"owner": frappe.session.user}, ["name", "title"]
|
||||||
|
)
|
||||||
|
for assignment in all_assignments:
|
||||||
|
assignment.checked = frappe.db.exists(
|
||||||
|
{
|
||||||
|
"doctype": "LMS Assessment",
|
||||||
|
"assessment_type": "LMS Assignment",
|
||||||
|
"assessment_name": assignment.name,
|
||||||
|
"parent": class_name,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
return all_assignments
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ def get_context(context):
|
|||||||
|
|
||||||
past_classes, upcoming_classes = [], []
|
past_classes, upcoming_classes = [], []
|
||||||
for class_ in classes:
|
for class_ in classes:
|
||||||
print(class_.start_date)
|
|
||||||
if getdate(class_.start_date) < getdate():
|
if getdate(class_.start_date) < getdate():
|
||||||
past_classes.append(class_)
|
past_classes.append(class_)
|
||||||
else:
|
else:
|
||||||
@@ -39,5 +38,3 @@ def get_context(context):
|
|||||||
)
|
)
|
||||||
|
|
||||||
context.my_classes = my_classes_info
|
context.my_classes = my_classes_info
|
||||||
|
|
||||||
print(context.my_classes)
|
|
||||||
|
|||||||
@@ -34,11 +34,13 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{% if is_moderator %}
|
||||||
<div class="align-self-center">
|
<div class="align-self-center">
|
||||||
<a class="btn btn-primary btn-sm btn-evaluate" href=/evaluation/new?member={{student.name}}&date={{frappe.utils.getdate()}}&class={{class_info.name}}">
|
<a class="btn btn-primary btn-sm btn-evaluate" href=/evaluation/new?member={{student.name}}&date={{frappe.utils.getdate()}}&class={{class_info.name}}">
|
||||||
{{ _("Evaluate") }}
|
{{ _("Evaluate") }}
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -47,7 +49,8 @@
|
|||||||
|
|
||||||
|
|
||||||
{% macro Progress(class_info, student) %}
|
{% macro Progress(class_info, student) %}
|
||||||
<div>
|
{% if assessments | length %}
|
||||||
|
<article>
|
||||||
{% for assessment in assessments %}
|
{% for assessment in assessments %}
|
||||||
<div class="list-row level">
|
<div class="list-row level">
|
||||||
<a {% if is_moderator and assessment.submission or frappe.session.user == student.name %} class="clickable" href="{{ assessment.url }}" {% endif %}>
|
<a {% if is_moderator and assessment.submission or frappe.session.user == student.name %} class="clickable" href="{{ assessment.url }}" {% endif %}>
|
||||||
@@ -69,102 +72,8 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</article>
|
||||||
{% endmacro %}
|
{% else %}
|
||||||
|
<p class="text-muted mt-3"> {{ _("No Assessments") }} </p>
|
||||||
|
{% endif %}
|
||||||
{% macro Quiz(course, student) %}
|
{% endmacro %}
|
||||||
{% for quiz in course.quizzes %}
|
|
||||||
{% set filters = { "member": student.name, "course": course.course } %}
|
|
||||||
{% set has_submitted = frappe.db.exists("LMS Quiz Submission", filters) %}
|
|
||||||
{% set submission = frappe.db.get_value("LMS Quiz Submission", filters, ["score", "creation"], as_dict=True) %}
|
|
||||||
{% set total_questions = frappe.db.count("LMS Quiz Question", {"parent": quiz.name}) %}
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td class="vertically-center">
|
|
||||||
<svg class="icon icon-sm">
|
|
||||||
<use href="#icon-quiz"></use>
|
|
||||||
</svg>
|
|
||||||
{{ _("Quiz") }}
|
|
||||||
</td>
|
|
||||||
<td>{{ quiz.title }}</td>
|
|
||||||
{% if has_submitted %}
|
|
||||||
<td>{{ submission.score }}/{{ total_questions }}</td>
|
|
||||||
<td>{{ frappe.utils.format_date(submission.creation, "medium") }}</td>
|
|
||||||
{% else %}
|
|
||||||
<td>-</td>
|
|
||||||
<td>
|
|
||||||
<div class="indicator-pill red">
|
|
||||||
{{ _("Not Attempted") }}
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
{% endif %}
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
{% endmacro %}
|
|
||||||
|
|
||||||
|
|
||||||
{% macro Assignment(course, student, is_moderator) %}
|
|
||||||
{% for assignment in course.assignments %}
|
|
||||||
{% set filters = { "member": student.name, "course": course.course, "lesson": assignment.name } %}
|
|
||||||
{% set has_submitted = frappe.db.exists("LMS Assignment Submission", filters) %}
|
|
||||||
{% set submission = frappe.db.get_value("LMS Assignment Submission", filters, ["assignment", "creation", "status"], as_dict=True) %}
|
|
||||||
{% set status = submission.status %}
|
|
||||||
{% set color = "green" if status == "Pass" else "red" if status == "Fail" else "orange" %}
|
|
||||||
{% set can_see_details = has_submitted and (is_moderator or frappe.session.user == student.name) %}
|
|
||||||
|
|
||||||
<tr {% if can_see_details %} class="clickable-row" data-href="/assignments/{{ has_submitted }}" {% endif %}>
|
|
||||||
<td class="{% if can_see_details %} subheading {% endif %} vertically-center">
|
|
||||||
<svg class="icon icon-md">
|
|
||||||
<use href="#icon-file"></use>
|
|
||||||
</svg>
|
|
||||||
{{ _("Assignment") }}
|
|
||||||
</td>
|
|
||||||
|
|
||||||
<td>{{ assignment.title }}</td>
|
|
||||||
|
|
||||||
{% if has_submitted %}
|
|
||||||
<td>
|
|
||||||
<div class="indicator-pill {{ color }}">
|
|
||||||
{{ status }}
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
|
|
||||||
<td>{{ frappe.utils.format_date(submission.creation, "medium") }}</td>
|
|
||||||
|
|
||||||
{% else %}
|
|
||||||
<td>-</td>
|
|
||||||
|
|
||||||
<td>
|
|
||||||
<div class="indicator-pill red">
|
|
||||||
{{ _("Not Attempted") }}
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
{% endif %}
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
{% endmacro %}
|
|
||||||
|
|
||||||
|
|
||||||
{% macro Evaluation(course, student, is_moderator) %}
|
|
||||||
{% for evaluation in course.evaluations %}
|
|
||||||
{% set color = "green" if evaluation.status == "Pass" else "red" %}
|
|
||||||
{% set can_see_details = is_moderator or frappe.session.user == student.name %}
|
|
||||||
|
|
||||||
<tr {% if can_see_details %} class="clickable-row" data-href="/evaluation/{{evaluation.name}}" {% endif %}>
|
|
||||||
<td class="{% if can_see_details %} subheading {% endif %} vertically-center">
|
|
||||||
<svg class="icon icon-md">
|
|
||||||
<use href="#icon-quality"></use>
|
|
||||||
</svg>
|
|
||||||
{{ _("Evaluation") }}
|
|
||||||
</td>
|
|
||||||
<td> - </td>
|
|
||||||
<td>
|
|
||||||
<div class="indicator-pill {{ color }}">
|
|
||||||
{{ evaluation.status }}
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
<td>{{ frappe.utils.format_date(evaluation.creation, "medium") }}</td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
{% endmacro %}
|
|
||||||
@@ -21,6 +21,4 @@ def get_context(context):
|
|||||||
"LMS Class", class_name, ["name"], as_dict=True
|
"LMS Class", class_name, ["name"], as_dict=True
|
||||||
)
|
)
|
||||||
|
|
||||||
context.assessments = get_assessments(
|
context.assessments = get_assessments(class_name, context.student.name)
|
||||||
context.is_moderator, class_name, context.student.name
|
|
||||||
)
|
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ def get_current_lesson_details(lesson_number, context, is_edit=False):
|
|||||||
return lesson_info
|
return lesson_info
|
||||||
|
|
||||||
|
|
||||||
def get_assessments(is_moderator, class_name, member=None):
|
def get_assessments(class_name, member=None):
|
||||||
if not member:
|
if not member:
|
||||||
member = frappe.session.user
|
member = frappe.session.user
|
||||||
|
|
||||||
@@ -92,7 +92,6 @@ def get_assessments(is_moderator, class_name, member=None):
|
|||||||
)
|
)
|
||||||
|
|
||||||
assessment.edit_url = f"/assignments/{assessment.assessment_name}"
|
assessment.edit_url = f"/assignments/{assessment.assessment_name}"
|
||||||
assessment.grade_url = f"/assignment-grading/{existing_submission}"
|
|
||||||
submission_name = existing_submission if existing_submission else "new-submission"
|
submission_name = existing_submission if existing_submission else "new-submission"
|
||||||
assessment.url = (
|
assessment.url = (
|
||||||
f"/assignment-submission/{assessment.assessment_name}/{submission_name}"
|
f"/assignment-submission/{assessment.assessment_name}/{submission_name}"
|
||||||
@@ -103,5 +102,5 @@ def get_assessments(is_moderator, class_name, member=None):
|
|||||||
"LMS Quiz", assessment.assessment_name, "title"
|
"LMS Quiz", assessment.assessment_name, "title"
|
||||||
)
|
)
|
||||||
assessment.url = f"/quizzes/{assessment.assessment_name}"
|
assessment.url = f"/quizzes/{assessment.assessment_name}"
|
||||||
|
print(assessments)
|
||||||
return assessments
|
return assessments
|
||||||
|
|||||||
Reference in New Issue
Block a user