From f691ebd1463aef15f1086ce8120d7fc368838486 Mon Sep 17 00:00:00 2001 From: Jannat Patel Date: Wed, 23 Nov 2022 14:39:18 +0530 Subject: [PATCH 1/3] feat: class evaluation --- .../lms_certificate_evaluation.json | 20 ++- lms/lms/web_form/evaluation/__init__.py | 0 lms/lms/web_form/evaluation/evaluation.js | 7 + lms/lms/web_form/evaluation/evaluation.json | 149 ++++++++++++++++++ lms/lms/web_form/evaluation/evaluation.py | 12 ++ lms/www/classes/progress.html | 81 ++++++---- lms/www/classes/progress.py | 5 + 7 files changed, 238 insertions(+), 36 deletions(-) create mode 100644 lms/lms/web_form/evaluation/__init__.py create mode 100644 lms/lms/web_form/evaluation/evaluation.js create mode 100644 lms/lms/web_form/evaluation/evaluation.json create mode 100644 lms/lms/web_form/evaluation/evaluation.py diff --git a/lms/lms/doctype/lms_certificate_evaluation/lms_certificate_evaluation.json b/lms/lms/doctype/lms_certificate_evaluation/lms_certificate_evaluation.json index fb84783f..0bd477d9 100644 --- a/lms/lms/doctype/lms_certificate_evaluation/lms_certificate_evaluation.json +++ b/lms/lms/doctype/lms_certificate_evaluation/lms_certificate_evaluation.json @@ -6,15 +6,17 @@ "editable_grid": 1, "engine": "InnoDB", "field_order": [ - "course", "member", "member_name", + "column_break_5", + "course", + "status", + "section_break_6", "date", "start_time", "end_time", - "column_break_5", + "column_break_10", "rating", - "status", "summary" ], "fields": [ @@ -48,7 +50,7 @@ }, { "fieldname": "summary", - "fieldtype": "Text", + "fieldtype": "Small Text", "label": "Summary" }, { @@ -83,11 +85,19 @@ "label": "Status", "options": "Pass\nFail", "reqd": 1 + }, + { + "fieldname": "section_break_6", + "fieldtype": "Section Break" + }, + { + "fieldname": "column_break_10", + "fieldtype": "Column Break" } ], "index_web_pages_for_search": 1, "links": [], - "modified": "2022-04-28 10:24:09.832428", + "modified": "2022-11-23 11:49:01.400292", "modified_by": "Administrator", "module": "LMS", "name": "LMS Certificate Evaluation", diff --git a/lms/lms/web_form/evaluation/__init__.py b/lms/lms/web_form/evaluation/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lms/lms/web_form/evaluation/evaluation.js b/lms/lms/web_form/evaluation/evaluation.js new file mode 100644 index 00000000..d051682d --- /dev/null +++ b/lms/lms/web_form/evaluation/evaluation.js @@ -0,0 +1,7 @@ +frappe.ready(function() { + frappe.web_form.after_save = () => { + setTimeout(() => { + window.history.back(); + }); + }; +}) diff --git a/lms/lms/web_form/evaluation/evaluation.json b/lms/lms/web_form/evaluation/evaluation.json new file mode 100644 index 00000000..47d79dcd --- /dev/null +++ b/lms/lms/web_form/evaluation/evaluation.json @@ -0,0 +1,149 @@ +{ + "accept_payment": 0, + "allow_comments": 0, + "allow_delete": 0, + "allow_edit": 0, + "allow_incomplete": 0, + "allow_multiple": 0, + "allow_print": 0, + "amount": 0.0, + "amount_based_on_field": 0, + "apply_document_permissions": 0, + "button_label": "Save", + "creation": "2022-11-23 11:59:33.533053", + "doc_type": "LMS Certificate Evaluation", + "docstatus": 0, + "doctype": "Web Form", + "idx": 0, + "introduction_text": "", + "is_standard": 1, + "list_columns": [], + "login_required": 0, + "max_attachment_size": 0, + "modified": "2022-11-23 12:08:15.978899", + "modified_by": "Administrator", + "module": "LMS", + "name": "evaluation", + "owner": "Administrator", + "payment_button_label": "Buy Now", + "published": 1, + "route": "evaluation", + "show_attachments": 0, + "show_list": 0, + "show_sidebar": 0, + "title": "Evaluation", + "web_form_fields": [ + { + "allow_read_on_all_link_options": 0, + "fieldname": "member", + "fieldtype": "Link", + "hidden": 0, + "label": "Member", + "max_length": 0, + "max_value": 0, + "options": "User", + "read_only": 0, + "reqd": 1, + "show_in_filter": 0 + }, + { + "allow_read_on_all_link_options": 0, + "fieldname": "course", + "fieldtype": "Link", + "hidden": 0, + "label": "Course", + "max_length": 0, + "max_value": 0, + "options": "LMS Course", + "read_only": 0, + "reqd": 1, + "show_in_filter": 0 + }, + { + "allow_read_on_all_link_options": 0, + "fieldname": "date", + "fieldtype": "Date", + "hidden": 0, + "label": "Date", + "max_length": 0, + "max_value": 0, + "read_only": 0, + "reqd": 1, + "show_in_filter": 0 + }, + { + "allow_read_on_all_link_options": 0, + "fieldname": "start_time", + "fieldtype": "Time", + "hidden": 0, + "label": "Start Time", + "max_length": 0, + "max_value": 0, + "read_only": 0, + "reqd": 1, + "show_in_filter": 0 + }, + { + "allow_read_on_all_link_options": 0, + "fieldname": "end_time", + "fieldtype": "Time", + "hidden": 0, + "label": "End Time", + "max_length": 0, + "max_value": 0, + "read_only": 0, + "reqd": 0, + "show_in_filter": 0 + }, + { + "allow_read_on_all_link_options": 0, + "fieldname": "", + "fieldtype": "Column Break", + "hidden": 0, + "label": "", + "max_length": 0, + "max_value": 0, + "options": "", + "read_only": 0, + "reqd": 0, + "show_in_filter": 0 + }, + { + "allow_read_on_all_link_options": 0, + "fieldname": "rating", + "fieldtype": "Rating", + "hidden": 0, + "label": "Rating", + "max_length": 0, + "max_value": 0, + "read_only": 0, + "reqd": 1, + "show_in_filter": 0 + }, + { + "allow_read_on_all_link_options": 0, + "fieldname": "status", + "fieldtype": "Select", + "hidden": 0, + "label": "Status", + "max_length": 0, + "max_value": 0, + "options": "Pass\nFail", + "read_only": 0, + "reqd": 1, + "show_in_filter": 0 + }, + { + "allow_read_on_all_link_options": 0, + "fieldname": "summary", + "fieldtype": "Small Text", + "hidden": 0, + "label": "Summary", + "max_length": 0, + "max_value": 0, + "read_only": 0, + "reqd": 0, + "show_in_filter": 0 + } + ] +} diff --git a/lms/lms/web_form/evaluation/evaluation.py b/lms/lms/web_form/evaluation/evaluation.py new file mode 100644 index 00000000..c10b9cea --- /dev/null +++ b/lms/lms/web_form/evaluation/evaluation.py @@ -0,0 +1,12 @@ +import frappe +from frappe import _ +from lms.lms.utils import has_course_moderator_role + +def get_context(context): + + if not has_course_moderator_role(): + message = "Only Moderators have access to this page." + if frappe.session.user == "Guest": + message = "Please login to access this page." + + raise frappe.PermissionError(_(message)) diff --git a/lms/www/classes/progress.html b/lms/www/classes/progress.html index 80a0307a..b5a0c415 100644 --- a/lms/www/classes/progress.html +++ b/lms/www/classes/progress.html @@ -4,14 +4,24 @@ {% endblock %} +{% block head_include %} + {% include "public/icons/symbol-defs.svg" %} +{% endblock %} + + {% block content %}
{{ BreadCrumb(class_info, student) }}
-
- {{ frappe.utils.format_datetime(student.last_active, "medium") }} +
+ + {{ frappe.utils.format_datetime(student.last_active, "medium") }} + + + {{ _("Evaluate") }} +
{{ student.full_name }} @@ -49,12 +59,12 @@
- + @@ -70,23 +80,18 @@ {% set total_questions = frappe.db.count("LMS Quiz Question", {"parent": quiz.name}) %} - - + {% if has_submitted %} - - + + {% else %} - + - - + + {% if has_submitted %} - + {% else %} - + {% endfor %} + + {% for evaluation in course.evaluations %} + {% set color = "green" if evaluation.status == "Pass" else "red" %} + + + + + + + {% endfor %}
- {{ _("Activity") }} - {{ _("Type") }} + {{ _("Title") }} + {{ _("Score/Status") }}
- {{ quiz.title }} - + + + + {{ _("Quiz") }} {{ quiz.title }} - {{ submission.score }}/{{ total_questions }} - - {{ frappe.utils.format_date(submission.creation, "medium") }} - {{ submission.score }}/{{ total_questions }}{{ frappe.utils.format_date(submission.creation, "medium") }} - - - -
{{ _("Not Attempted") }} @@ -97,7 +102,6 @@ {% endfor %} {% for assignment in course.assignments %} - {% set filters = { "member": student.name, "course": course.course, "lesson": assignment.name } %} {% set has_submitted = frappe.db.exists("Lesson Assignment", filters) %} {% set submission = frappe.db.get_value("Lesson Assignment", filters, ["assignment", "creation", "status"], as_dict=True) %} @@ -105,12 +109,12 @@ {% set color = "green" if status == "Pass" else "red" if status == "Fail" else "orange" %}
- {{ assignment.title }} - - {{ _("Assignment") }} - + + + + {{ _("Assignment") }}{{ assignment.title }} {% if status == "Not Graded" %} @@ -121,13 +125,9 @@ {% endif %} - {{ frappe.utils.format_date(submission.creation, "medium") }} - {{ frappe.utils.format_date(submission.creation, "medium") }} - - - -
{{ _("Not Attempted") }} @@ -136,6 +136,25 @@ {% endif %}
+ + + + {{ _("Evaluation") }} + - +
+ {{ evaluation.status }} +
+
{{ frappe.utils.format_date(evaluation.creation, "medium") }}
{% else %} diff --git a/lms/www/classes/progress.py b/lms/www/classes/progress.py index eb701cf5..18e5ff7a 100644 --- a/lms/www/classes/progress.py +++ b/lms/www/classes/progress.py @@ -45,5 +45,10 @@ def get_context(context): {"course": course.course, "question": ["is", "set"]}, ["name", "title"], ) + course.evaluations = frappe.get_all( + "LMS Certificate Evaluation", + {"course": course.course, "member": context.student.name}, + ["rating", "status", "creation"] + ) context.class_courses = class_courses From 91e71091efdcf249924c5d62d4dee9d174e3eba7 Mon Sep 17 00:00:00 2001 From: Jannat Patel Date: Wed, 23 Nov 2022 15:12:57 +0530 Subject: [PATCH 2/3] fix: show evaluation in read only mode --- lms/lms/web_form/evaluation/evaluation.json | 14 +++++++------- lms/public/css/style.css | 4 ++++ lms/www/classes/progress.html | 8 ++++---- lms/www/classes/progress.js | 7 +++++++ lms/www/classes/progress.py | 2 +- 5 files changed, 23 insertions(+), 12 deletions(-) create mode 100644 lms/www/classes/progress.js diff --git a/lms/lms/web_form/evaluation/evaluation.json b/lms/lms/web_form/evaluation/evaluation.json index 47d79dcd..85123e71 100644 --- a/lms/lms/web_form/evaluation/evaluation.json +++ b/lms/lms/web_form/evaluation/evaluation.json @@ -4,7 +4,7 @@ "allow_delete": 0, "allow_edit": 0, "allow_incomplete": 0, - "allow_multiple": 0, + "allow_multiple": 1, "allow_print": 0, "amount": 0.0, "amount_based_on_field": 0, @@ -18,9 +18,9 @@ "introduction_text": "", "is_standard": 1, "list_columns": [], - "login_required": 0, + "login_required": 1, "max_attachment_size": 0, - "modified": "2022-11-23 12:08:15.978899", + "modified": "2022-11-23 14:57:47.700695", "modified_by": "Administrator", "module": "LMS", "name": "evaluation", @@ -29,12 +29,12 @@ "published": 1, "route": "evaluation", "show_attachments": 0, - "show_list": 0, + "show_list": 1, "show_sidebar": 0, "title": "Evaluation", "web_form_fields": [ { - "allow_read_on_all_link_options": 0, + "allow_read_on_all_link_options": 1, "fieldname": "member", "fieldtype": "Link", "hidden": 0, @@ -47,7 +47,7 @@ "show_in_filter": 0 }, { - "allow_read_on_all_link_options": 0, + "allow_read_on_all_link_options": 1, "fieldname": "course", "fieldtype": "Link", "hidden": 0, @@ -146,4 +146,4 @@ "show_in_filter": 0 } ] -} +} \ No newline at end of file diff --git a/lms/public/css/style.css b/lms/public/css/style.css index 1a70cfc4..23933d60 100644 --- a/lms/public/css/style.css +++ b/lms/public/css/style.css @@ -1876,3 +1876,7 @@ select { padding-right: 2.5rem; -webkit-print-color-adjust: exact; } + +.clickable-row { + cursor: pointer; +} diff --git a/lms/www/classes/progress.html b/lms/www/classes/progress.html index b5a0c415..70d69d79 100644 --- a/lms/www/classes/progress.html +++ b/lms/www/classes/progress.html @@ -80,7 +80,7 @@ {% set total_questions = frappe.db.count("LMS Quiz Question", {"parent": quiz.name}) %} - + @@ -109,7 +109,7 @@ {% set color = "green" if status == "Pass" else "red" if status == "Fail" else "orange" %} - + @@ -139,8 +139,8 @@ {% for evaluation in course.evaluations %} {% set color = "green" if evaluation.status == "Pass" else "red" %} - - + + diff --git a/lms/www/classes/progress.js b/lms/www/classes/progress.js new file mode 100644 index 00000000..e6a5dea3 --- /dev/null +++ b/lms/www/classes/progress.js @@ -0,0 +1,7 @@ +frappe.ready(() => { + + $(".clickable-row").click((e) => { + window.location.href = $(e.currentTarget).data("href"); + }); + +}) diff --git a/lms/www/classes/progress.py b/lms/www/classes/progress.py index 18e5ff7a..ec37ff3c 100644 --- a/lms/www/classes/progress.py +++ b/lms/www/classes/progress.py @@ -48,7 +48,7 @@ def get_context(context): course.evaluations = frappe.get_all( "LMS Certificate Evaluation", {"course": course.course, "member": context.student.name}, - ["rating", "status", "creation"] + ["rating", "status", "creation", "name"] ) context.class_courses = class_courses From 96849afcba5e752290aaaec00eb28888904bcbdf Mon Sep 17 00:00:00 2001 From: Jannat Patel Date: Wed, 23 Nov 2022 15:14:15 +0530 Subject: [PATCH 3/3] fix: formatting --- lms/lms/web_form/evaluation/evaluation.js | 4 ++-- lms/lms/web_form/evaluation/evaluation.py | 1 + lms/www/classes/progress.js | 4 +--- lms/www/classes/progress.py | 2 +- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/lms/lms/web_form/evaluation/evaluation.js b/lms/lms/web_form/evaluation/evaluation.js index d051682d..958eb7a1 100644 --- a/lms/lms/web_form/evaluation/evaluation.js +++ b/lms/lms/web_form/evaluation/evaluation.js @@ -1,7 +1,7 @@ -frappe.ready(function() { +frappe.ready(function () { frappe.web_form.after_save = () => { setTimeout(() => { window.history.back(); }); }; -}) +}); diff --git a/lms/lms/web_form/evaluation/evaluation.py b/lms/lms/web_form/evaluation/evaluation.py index c10b9cea..2298b1c2 100644 --- a/lms/lms/web_form/evaluation/evaluation.py +++ b/lms/lms/web_form/evaluation/evaluation.py @@ -2,6 +2,7 @@ import frappe from frappe import _ from lms.lms.utils import has_course_moderator_role + def get_context(context): if not has_course_moderator_role(): diff --git a/lms/www/classes/progress.js b/lms/www/classes/progress.js index e6a5dea3..6c136c9a 100644 --- a/lms/www/classes/progress.js +++ b/lms/www/classes/progress.js @@ -1,7 +1,5 @@ frappe.ready(() => { - $(".clickable-row").click((e) => { window.location.href = $(e.currentTarget).data("href"); }); - -}) +}); diff --git a/lms/www/classes/progress.py b/lms/www/classes/progress.py index ec37ff3c..306aea53 100644 --- a/lms/www/classes/progress.py +++ b/lms/www/classes/progress.py @@ -48,7 +48,7 @@ def get_context(context): course.evaluations = frappe.get_all( "LMS Certificate Evaluation", {"course": course.course, "member": context.student.name}, - ["rating", "status", "creation", "name"] + ["rating", "status", "creation", "name"], ) context.class_courses = class_courses