fix: show upcoming evals in progress page
This commit is contained in:
@@ -4,6 +4,7 @@
|
|||||||
import frappe
|
import frappe
|
||||||
from frappe import _
|
from frappe import _
|
||||||
from frappe.model.document import Document
|
from frappe.model.document import Document
|
||||||
|
from lms.lms.utils import get_evaluator
|
||||||
|
|
||||||
|
|
||||||
class CourseEvaluator(Document):
|
class CourseEvaluator(Document):
|
||||||
@@ -37,17 +38,7 @@ class CourseEvaluator(Document):
|
|||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def get_schedule(course, date, class_name=None):
|
def get_schedule(course, date, class_name=None):
|
||||||
evaluator = None
|
evaluator = get_evaluator(course, class_name)
|
||||||
|
|
||||||
if class_name:
|
|
||||||
evaluator = frappe.db.get_value(
|
|
||||||
"Class Course",
|
|
||||||
{"parent": class_name, "course": course},
|
|
||||||
"evaluator",
|
|
||||||
)
|
|
||||||
|
|
||||||
if not evaluator:
|
|
||||||
evaluator = frappe.db.get_value("LMS Course", course, "evaluator")
|
|
||||||
|
|
||||||
all_slots = frappe.get_all(
|
all_slots = frappe.get_all(
|
||||||
"Evaluator Schedule",
|
"Evaluator Schedule",
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ from frappe import _
|
|||||||
from frappe.model.document import Document
|
from frappe.model.document import Document
|
||||||
from frappe.model.mapper import get_mapped_doc
|
from frappe.model.mapper import get_mapped_doc
|
||||||
from frappe.utils import format_date, format_time, getdate
|
from frappe.utils import format_date, format_time, getdate
|
||||||
|
from lms.lms.utils import get_evaluator
|
||||||
|
|
||||||
|
|
||||||
class LMSCertificateRequest(Document):
|
class LMSCertificateRequest(Document):
|
||||||
@@ -24,7 +25,7 @@ class LMSCertificateRequest(Document):
|
|||||||
)
|
)
|
||||||
|
|
||||||
for req in existing_requests:
|
for req in existing_requests:
|
||||||
if req.date == getdate(self.date) and getdate() <= getdate(self.date):
|
if req.date == getdate(self.date) or getdate() <= getdate(self.date):
|
||||||
course_title = frappe.db.get_value("LMS Course", req.course, "title")
|
course_title = frappe.db.get_value("LMS Course", req.course, "title")
|
||||||
frappe.throw(
|
frappe.throw(
|
||||||
_("You already have an evaluation on {0} at {1} for the course {2}.").format(
|
_("You already have an evaluation on {0} at {1} for the course {2}.").format(
|
||||||
@@ -78,7 +79,9 @@ class LMSCertificateRequest(Document):
|
|||||||
|
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def create_certificate_request(course, date, day, start_time, end_time):
|
def create_certificate_request(
|
||||||
|
course, date, day, start_time, end_time, class_name=None
|
||||||
|
):
|
||||||
is_member = frappe.db.exists(
|
is_member = frappe.db.exists(
|
||||||
{"doctype": "LMS Batch Membership", "course": course, "member": frappe.session.user}
|
{"doctype": "LMS Batch Membership", "course": course, "member": frappe.session.user}
|
||||||
)
|
)
|
||||||
@@ -90,6 +93,7 @@ def create_certificate_request(course, date, day, start_time, end_time):
|
|||||||
{
|
{
|
||||||
"doctype": "LMS Certificate Request",
|
"doctype": "LMS Certificate Request",
|
||||||
"course": course,
|
"course": course,
|
||||||
|
"evaluator": get_evaluator(course, class_name),
|
||||||
"member": frappe.session.user,
|
"member": frappe.session.user,
|
||||||
"date": date,
|
"date": date,
|
||||||
"day": day,
|
"day": day,
|
||||||
|
|||||||
@@ -753,3 +753,19 @@ def has_submitted_assessment(assessment, type, member=None):
|
|||||||
def has_graded_assessment(submission):
|
def has_graded_assessment(submission):
|
||||||
status = frappe.db.get_value("LMS Assignment Submission", submission, "status")
|
status = frappe.db.get_value("LMS Assignment Submission", submission, "status")
|
||||||
return False if status == "Not Graded" else True
|
return False if status == "Not Graded" else True
|
||||||
|
|
||||||
|
|
||||||
|
def get_evaluator(course, class_name=None):
|
||||||
|
evaluator = None
|
||||||
|
|
||||||
|
if class_name:
|
||||||
|
evaluator = frappe.db.get_value(
|
||||||
|
"Class Course",
|
||||||
|
{"parent": class_name, "course": course},
|
||||||
|
"evaluator",
|
||||||
|
)
|
||||||
|
|
||||||
|
if not evaluator:
|
||||||
|
evaluator = frappe.db.get_value("LMS Course", course, "evaluator")
|
||||||
|
|
||||||
|
return evaluator
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<div class="page-title">
|
<div class="page-title">
|
||||||
{{ _("{0}").format(student.full_name) }}
|
{{ _("{0}").format(student.full_name) }}
|
||||||
</div>
|
</div>
|
||||||
<div class="vertically-center small">
|
<div class="vertically-center">
|
||||||
<a class="dark-links" href="/classes">
|
<a class="dark-links" href="/classes">
|
||||||
{{ _("All Classes") }}
|
{{ _("All Classes") }}
|
||||||
</a>
|
</a>
|
||||||
@@ -58,61 +58,122 @@
|
|||||||
|
|
||||||
|
|
||||||
{% macro Progress(class_info, student) %}
|
{% macro Progress(class_info, student) %}
|
||||||
{% if assessments | length %}
|
{{ UpcomingEvals(upcoming_evals) }}
|
||||||
<article class="form-grid">
|
{{ Assessments(class_info, student) }}
|
||||||
<div class="grid-heading-row">
|
{% endmacro %}
|
||||||
|
|
||||||
|
{% macro UpcomingEvals(upcoming_evals) %}
|
||||||
|
<div class="mb-8">
|
||||||
|
<div class="bold-heading mb-2">
|
||||||
|
{{ _("Upcoming Evaluations") }}
|
||||||
|
</div>
|
||||||
|
{% if upcoming_evals | length %}
|
||||||
|
<article class="form-grid">
|
||||||
|
<div class="grid-heading-row">
|
||||||
|
<div class="grid-row">
|
||||||
|
<div class="data-row row">
|
||||||
|
<div class="col grid-static-col">
|
||||||
|
{{ _("Course") }}
|
||||||
|
</div>
|
||||||
|
<div class="col grid-static-col col-xs-2">
|
||||||
|
{{ _("Date") }}
|
||||||
|
</div>
|
||||||
|
<div class="col grid-static-col col-xs-2">
|
||||||
|
{{ _("Time") }}
|
||||||
|
</div>
|
||||||
|
<div class="col grid-static-col col-xs-2">
|
||||||
|
{{ _("Evaluator") }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% for eval in upcoming_evals %}
|
||||||
<div class="grid-row">
|
<div class="grid-row">
|
||||||
<div class="data-row row">
|
<div class="data-row row">
|
||||||
<div class="col grid-static-col">
|
<a class="col grid-static-col clickable" href="{{ eval.url }}">
|
||||||
{{ _("Assessment") }}
|
{{ eval.course_title }}
|
||||||
|
</a>
|
||||||
|
<div class="col grid-static-col col-xs-2">
|
||||||
|
{{ eval.date }}
|
||||||
</div>
|
</div>
|
||||||
<div class="col grid-static-col col-xs-2">
|
<div class="col grid-static-col col-xs-2">
|
||||||
{{ _("Type") }}
|
{{ eval.start_time }}
|
||||||
</div>
|
</div>
|
||||||
<div class="col grid-static-col col-xs-2">
|
<div class="col grid-static-col col-xs-2">
|
||||||
{{ _("Status/Score") }}
|
{{ eval.evaluator_name }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
{% endfor %}
|
||||||
{% for assessment in assessments %}
|
</article>
|
||||||
{% set has_access = is_moderator and assessment.submission or frappe.session.user == student.name %}
|
{% else %}
|
||||||
<div class="grid-row">
|
<p class="text-muted mt-3"> {{ _("No Upcoming Evaluations") }} </p>
|
||||||
<div class="data-row row">
|
{% endif %}
|
||||||
<a class="col grid-static-col {% if has_access %} clickable {% endif %}" {% if has_access %} href="{{ assessment.url }}" {% endif %}>
|
</div>
|
||||||
{{ assessment.title }}
|
{% endmacro %}
|
||||||
</a>
|
|
||||||
<div class="col grid-static-col col-xs-2">
|
|
||||||
{{ (assessment.assessment_type).split("LMS ")[1] }}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col grid-static-col col-xs-2 mb-2">
|
{% macro Assessments(class_info, student) %}
|
||||||
{% if assessment.submission %}
|
<div class="mb-8">
|
||||||
{% if assessment.assessment_type == "LMS Assignment" %}
|
<div class="bold-heading mb-2">
|
||||||
{% set status = assessment.submission.status %}
|
{{ _("Assessments") }}
|
||||||
{% set color = "green" if status == "Pass" else "red" if status == "Fail" else "orange" %}
|
</div>
|
||||||
<div class="indicator-pill {{ color }}">
|
{% if assessments | length %}
|
||||||
{{ status }}
|
<article class="form-grid">
|
||||||
</div>
|
<div class="grid-heading-row">
|
||||||
|
<div class="grid-row">
|
||||||
|
<div class="data-row row">
|
||||||
|
<div class="col grid-static-col">
|
||||||
|
{{ _("Assessment") }}
|
||||||
|
</div>
|
||||||
|
<div class="col grid-static-col col-xs-2">
|
||||||
|
{{ _("Type") }}
|
||||||
|
</div>
|
||||||
|
<div class="col grid-static-col col-xs-2">
|
||||||
|
{{ _("Status/Score") }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% for assessment in assessments %}
|
||||||
|
{% set has_access = is_moderator and assessment.submission or frappe.session.user == student.name %}
|
||||||
|
<div class="grid-row">
|
||||||
|
<div class="data-row row">
|
||||||
|
<a class="col grid-static-col {% if has_access %} clickable {% endif %}" {% if has_access %} href="{{ assessment.url }}" {% endif %}>
|
||||||
|
{{ assessment.title }}
|
||||||
|
</a>
|
||||||
|
<div class="col grid-static-col col-xs-2">
|
||||||
|
{{ (assessment.assessment_type).split("LMS ")[1] }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col grid-static-col col-xs-2 mb-2">
|
||||||
|
{% if assessment.submission %}
|
||||||
|
{% if assessment.assessment_type == "LMS Assignment" %}
|
||||||
|
{% set status = assessment.submission.status %}
|
||||||
|
{% set color = "green" if status == "Pass" else "red" if status == "Fail" else "orange" %}
|
||||||
|
<div class="indicator-pill {{ color }}">
|
||||||
|
{{ status }}
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
|
<div>
|
||||||
|
{{ assessment.submission.score }}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
{% else %}
|
{% else %}
|
||||||
<div>
|
<div class="indicator-pill red">
|
||||||
{{ assessment.submission.score }}
|
{{ _("Not Attempted") }}
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% else %}
|
</div>
|
||||||
<div class="indicator-pill red">
|
|
||||||
{{ _("Not Attempted") }}
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
{% endfor %}
|
||||||
{% endfor %}
|
</article>
|
||||||
</article>
|
{% else %}
|
||||||
{% else %}
|
<p class="text-muted mt-3"> {{ _("No Assessments") }} </p>
|
||||||
<p class="text-muted mt-3"> {{ _("No Assessments") }} </p>
|
{% endif %}
|
||||||
{% endif %}
|
</div>
|
||||||
|
|
||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
|
||||||
{%- block script %}
|
{%- block script %}
|
||||||
|
|||||||
@@ -35,9 +35,8 @@ const open_evaluation_form = (e) => {
|
|||||||
fieldname: "date",
|
fieldname: "date",
|
||||||
label: __("Date"),
|
label: __("Date"),
|
||||||
reqd: 1,
|
reqd: 1,
|
||||||
min_date: frappe.datetime.add_days(
|
min_date: new Date(
|
||||||
frappe.datetime.get_today(),
|
frappe.datetime.add_days(frappe.datetime.get_today(), 1)
|
||||||
1
|
|
||||||
),
|
),
|
||||||
change: () => {
|
change: () => {
|
||||||
get_slots();
|
get_slots();
|
||||||
@@ -69,7 +68,6 @@ const get_slots = () => {
|
|||||||
},
|
},
|
||||||
callback: (r) => {
|
callback: (r) => {
|
||||||
if (r.message) {
|
if (r.message) {
|
||||||
console.log(r.message);
|
|
||||||
display_slots(r.message);
|
display_slots(r.message);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -82,13 +80,12 @@ const display_slots = (slots) => {
|
|||||||
|
|
||||||
slots.forEach((slot) => {
|
slots.forEach((slot) => {
|
||||||
if (slot.day == day) {
|
if (slot.day == day) {
|
||||||
slot_html += `<div class="slot" data-day="${
|
slot_html += `<div class="btn btn-sm btn-default slot" data-day="${
|
||||||
slot.day
|
slot.day
|
||||||
}" data-start="${slot.start_time}" data-end="${slot.end_time}">
|
}"
|
||||||
${moment(slot.start_time, "hh:mm").format("hh:mm a")} - ${moment(
|
data-start="${slot.start_time}" data-end="${slot.end_time}">
|
||||||
slot.end_time,
|
${moment(slot.start_time, "hh:mm").format("hh:mm a")} -
|
||||||
"hh:mm"
|
${moment(slot.end_time, "hh:mm").format("hh:mm a")}
|
||||||
).format("hh:mm a")}
|
|
||||||
</div>`;
|
</div>`;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -123,13 +120,12 @@ const submit_evaluation_form = (values) => {
|
|||||||
day: this.current_slot.data("day"),
|
day: this.current_slot.data("day"),
|
||||||
},
|
},
|
||||||
callback: (r) => {
|
callback: (r) => {
|
||||||
if (r.message) {
|
frappe.msgprint({
|
||||||
frappe.msgprint({
|
title: __("Success"),
|
||||||
title: __("Success"),
|
message: __("Evaluation scheduled successfully"),
|
||||||
message: __("Evaluation scheduled successfully"),
|
});
|
||||||
});
|
this.eval_form.hide();
|
||||||
this.eval_form.hide();
|
window.location.reload();
|
||||||
}
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -26,3 +26,20 @@ def get_context(context):
|
|||||||
)
|
)
|
||||||
|
|
||||||
context.assessments = get_assessments(class_name, context.student.name)
|
context.assessments = get_assessments(class_name, context.student.name)
|
||||||
|
|
||||||
|
upcoming_evals = frappe.get_all(
|
||||||
|
"LMS certificate Request",
|
||||||
|
{
|
||||||
|
"member": context.student.name,
|
||||||
|
"course": ["in", context.courses],
|
||||||
|
"date": [">=", frappe.utils.nowdate()],
|
||||||
|
},
|
||||||
|
["date", "start_time", "course", "evaluator"],
|
||||||
|
order_by="date",
|
||||||
|
)
|
||||||
|
|
||||||
|
for evals in upcoming_evals:
|
||||||
|
evals.course_title = frappe.db.get_value("LMS Course", evals.course, "title")
|
||||||
|
evals.evaluator_name = frappe.db.get_value("User", evals.evaluator, "full_name")
|
||||||
|
|
||||||
|
context.upcoming_evals = upcoming_evals
|
||||||
|
|||||||
Reference in New Issue
Block a user