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>",
|
||||
"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": "/assignment-submission/<assignment>/<submission>",
|
||||
|
||||
@@ -46,8 +46,7 @@ def upload_assignment(
|
||||
"member": frappe.session.user,
|
||||
}
|
||||
)
|
||||
print(doc.assignment)
|
||||
print(comments)
|
||||
|
||||
doc.update(
|
||||
{
|
||||
"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)
|
||||
|
||||
print("updating membership", membership.name)
|
||||
membership.batch = batch_name
|
||||
membership.save()
|
||||
|
||||
|
||||
@@ -115,26 +115,11 @@ body {
|
||||
}
|
||||
|
||||
.image-preview {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
width: 280px;
|
||||
height: 178px;
|
||||
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-radius: var(--border-radius-md);
|
||||
}
|
||||
|
||||
.file-source-preview .btn-close {
|
||||
position: absolute;
|
||||
top: 5%;
|
||||
right: 5%;
|
||||
margin-top: 1rem;
|
||||
}
|
||||
|
||||
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",
|
||||
)
|
||||
|
||||
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(
|
||||
"LMS Quiz", {"owner": frappe.session.user}, ["name", "title"]
|
||||
)
|
||||
@@ -96,4 +86,20 @@ def get_context(context):
|
||||
"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 = [], []
|
||||
for class_ in classes:
|
||||
print(class_.start_date)
|
||||
if getdate(class_.start_date) < getdate():
|
||||
past_classes.append(class_)
|
||||
else:
|
||||
@@ -39,5 +38,3 @@ def get_context(context):
|
||||
)
|
||||
|
||||
context.my_classes = my_classes_info
|
||||
|
||||
print(context.my_classes)
|
||||
|
||||
@@ -34,11 +34,13 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if is_moderator %}
|
||||
<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}}">
|
||||
{{ _("Evaluate") }}
|
||||
</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
@@ -47,7 +49,8 @@
|
||||
|
||||
|
||||
{% macro Progress(class_info, student) %}
|
||||
<div>
|
||||
{% if assessments | length %}
|
||||
<article>
|
||||
{% for assessment in assessments %}
|
||||
<div class="list-row level">
|
||||
<a {% if is_moderator and assessment.submission or frappe.session.user == student.name %} class="clickable" href="{{ assessment.url }}" {% endif %}>
|
||||
@@ -69,102 +72,8 @@
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endmacro %}
|
||||
|
||||
|
||||
{% macro Quiz(course, student) %}
|
||||
{% 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 %}
|
||||
</article>
|
||||
{% else %}
|
||||
<p class="text-muted mt-3"> {{ _("No Assessments") }} </p>
|
||||
{% endif %}
|
||||
{% endmacro %}
|
||||
@@ -21,6 +21,4 @@ def get_context(context):
|
||||
"LMS Class", class_name, ["name"], as_dict=True
|
||||
)
|
||||
|
||||
context.assessments = get_assessments(
|
||||
context.is_moderator, class_name, context.student.name
|
||||
)
|
||||
context.assessments = get_assessments(class_name, context.student.name)
|
||||
|
||||
@@ -59,7 +59,7 @@ def get_current_lesson_details(lesson_number, context, is_edit=False):
|
||||
return lesson_info
|
||||
|
||||
|
||||
def get_assessments(is_moderator, class_name, member=None):
|
||||
def get_assessments(class_name, member=None):
|
||||
if not member:
|
||||
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.grade_url = f"/assignment-grading/{existing_submission}"
|
||||
submission_name = existing_submission if existing_submission else "new-submission"
|
||||
assessment.url = (
|
||||
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"
|
||||
)
|
||||
assessment.url = f"/quizzes/{assessment.assessment_name}"
|
||||
|
||||
print(assessments)
|
||||
return assessments
|
||||
|
||||
Reference in New Issue
Block a user