diff --git a/lms/lms/doctype/lms_certificate_request/lms_certificate_request.json b/lms/lms/doctype/lms_certificate_request/lms_certificate_request.json index 275dd2bd..2de888cf 100644 --- a/lms/lms/doctype/lms_certificate_request/lms_certificate_request.json +++ b/lms/lms/doctype/lms_certificate_request/lms_certificate_request.json @@ -38,6 +38,7 @@ }, { "fetch_from": "course.evaluator", + "fetch_if_empty": 1, "fieldname": "evaluator", "fieldtype": "Link", "label": "Evaluator", @@ -93,7 +94,7 @@ ], "index_web_pages_for_search": 1, "links": [], - "modified": "2023-07-13 11:30:41.740461", + "modified": "2023-07-21 11:13:38.827783", "modified_by": "Administrator", "module": "LMS", "name": "LMS Certificate Request", @@ -123,6 +124,18 @@ "role": "Class Evaluator", "share": 1, "write": 1 + }, + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Moderator", + "share": 1, + "write": 1 } ], "sort_field": "modified", diff --git a/lms/lms/doctype/lms_certificate_request/lms_certificate_request.py b/lms/lms/doctype/lms_certificate_request/lms_certificate_request.py index f10da005..b890cc40 100644 --- a/lms/lms/doctype/lms_certificate_request/lms_certificate_request.py +++ b/lms/lms/doctype/lms_certificate_request/lms_certificate_request.py @@ -88,10 +88,9 @@ def create_certificate_request( if not is_member: return - - frappe.get_doc( + eval = frappe.new_doc("LMS Certificate Request") + eval.update( { - "doctype": "LMS Certificate Request", "course": course, "evaluator": get_evaluator(course, class_name), "member": frappe.session.user, @@ -100,7 +99,8 @@ def create_certificate_request( "start_time": start_time, "end_time": end_time, } - ).save(ignore_permissions=True) + ) + eval.save() @frappe.whitelist() diff --git a/lms/lms/utils.py b/lms/lms/utils.py index 17619038..efece300 100644 --- a/lms/lms/utils.py +++ b/lms/lms/utils.py @@ -1,6 +1,5 @@ import re import string - import frappe from frappe import _ from frappe.desk.doctype.dashboard_chart.dashboard_chart import get_result @@ -522,6 +521,14 @@ def has_course_moderator_role(member=None): ) +def has_course_evaluator_role(member=None): + return frappe.db.get_value( + "Has Role", + {"parent": member or frappe.session.user, "role": "Evaluator"}, + "name", + ) + + def get_courses_under_review(): return frappe.get_all( "LMS Course", diff --git a/lms/www/classes/class.html b/lms/www/classes/class.html index f566e229..c81d56a1 100644 --- a/lms/www/classes/class.html +++ b/lms/www/classes/class.html @@ -247,7 +247,7 @@ {% for student in class_students %} - {% set allow_progress = is_moderator or student.student == frappe.session.user %} + {% set allow_progress = is_moderator or student.student == frappe.session.user or is_evaluator %}
diff --git a/lms/www/classes/class.js b/lms/www/classes/class.js index 1830ee43..a8a45a9e 100644 --- a/lms/www/classes/class.js +++ b/lms/www/classes/class.js @@ -301,14 +301,6 @@ const show_course_modal = () => { fieldname: "course", reqd: 1, }, - { - fieldtype: "Link", - options: "Course Evaluator", - label: __("Evaluator"), - fieldname: "evaluator", - fetch_from: "course.evaluator", - reqd: 1, - }, ], primary_action_label: __("Add"), primary_action(values) { @@ -318,7 +310,7 @@ const show_course_modal = () => { }); course_modal.show(); setTimeout(() => { - $(".modal-body").css("min-height", "300px"); + $(".modal-body").css("min-height", "200px"); }, 1000); }; @@ -329,7 +321,6 @@ const add_course = (values) => { doc: { doctype: "Class Course", course: values.course, - evaluator: values.evaluator, parenttype: "LMS Class", parentfield: "courses", parent: $(".class-details").data("class"), @@ -383,6 +374,7 @@ const show_student_modal = () => { filters: { ignore_user_type: 1, }, + filter_description: " ", }, ], primary_action_label: __("Add"), @@ -457,13 +449,10 @@ const show_assessment_modal = (e) => { label: __("Assessment Type"), fieldname: "assessment_type", reqd: 1, - get_query: () => { - return { - filters: { - name: ["in", ["LMS Assignment", "LMS Quiz"]], - }, - }; + filters: { + name: ["in", ["LMS Assignment", "LMS Quiz"]], }, + filter_description: " ", }, { fieldtype: "Dynamic Link", diff --git a/lms/www/classes/class.py b/lms/www/classes/class.py index 59932854..74b4b5a3 100644 --- a/lms/www/classes/class.py +++ b/lms/www/classes/class.py @@ -4,6 +4,7 @@ from frappe.utils import getdate from lms.www.utils import get_assessments from lms.lms.utils import ( has_course_moderator_role, + has_course_evaluator_role, get_course_progress, has_submitted_assessment, has_graded_assessment, @@ -14,6 +15,7 @@ def get_context(context): context.no_cache = 1 class_name = frappe.form_dict["classname"] context.is_moderator = has_course_moderator_role() + context.is_evaluator = has_course_evaluator_role() context.class_info = frappe.db.get_value( "LMS Class", diff --git a/lms/www/classes/progress.html b/lms/www/classes/progress.html index fc26578a..94bc597c 100644 --- a/lms/www/classes/progress.html +++ b/lms/www/classes/progress.html @@ -68,46 +68,36 @@ {{ _("Upcoming Evaluations") }}
{% if upcoming_evals | length %} -
-
-
-
-
- {{ _("Course") }} -
-
- {{ _("Date") }} -
-
- {{ _("Time") }} -
-
- {{ _("Evaluator") }} -
-
-
-
+
{% for eval in upcoming_evals %} -
-
- - {{ eval.course_title }} - -
- {{ eval.date }} -
-
- {{ eval.start_time }} -
-
+
+
+ {{ eval.course_title }} +
+
+ + + + + {{ frappe.utils.format_date(eval.date, "medium") }} -  + + + {{ frappe.utils.format_time(eval.start_time, "hh:mm a") }} + +
+
+ + {{ _("Evaluator") }}: + + {{ eval.evaluator_name }} -
+
{% endfor %}
{% else %} -

{{ _("No Upcoming Evaluations") }}

+

{{ _("No Upcoming Evaluations") }}

{% endif %}
{% endmacro %} @@ -170,7 +160,7 @@ {% endfor %} {% else %} -

{{ _("No Assessments") }}

+

{{ _("No Assessments") }}

{% endif %} diff --git a/lms/www/classes/progress.js b/lms/www/classes/progress.js index 53f46cb6..25bb3047 100644 --- a/lms/www/classes/progress.js +++ b/lms/www/classes/progress.js @@ -22,13 +22,10 @@ const open_evaluation_form = (e) => { label: __("Course"), options: "LMS Course", reqd: 1, - get_query: () => { - return { - filters: { - name: ["in", courses], - }, - }; + filters: { + name: ["in", courses], }, + filter_description: " ", }, { fieldtype: "Date", @@ -118,14 +115,17 @@ const submit_evaluation_form = (values) => { start_time: this.current_slot.data("start"), end_time: this.current_slot.data("end"), day: this.current_slot.data("day"), + class_name: class_name, }, callback: (r) => { - frappe.msgprint({ - title: __("Success"), + frappe.show_alert({ message: __("Evaluation scheduled successfully"), + indicator: "green", }); this.eval_form.hide(); - window.location.reload(); + setTimeout(() => { + window.location.reload(); + }, 1000); }, }); }; diff --git a/lms/www/classes/progress.py b/lms/www/classes/progress.py index 8e5bd323..5803ed42 100644 --- a/lms/www/classes/progress.py +++ b/lms/www/classes/progress.py @@ -1,5 +1,5 @@ import frappe -from lms.lms.utils import has_course_moderator_role +from lms.lms.utils import has_course_moderator_role, has_course_evaluator_role from frappe import _ from lms.www.utils import get_assessments @@ -10,6 +10,7 @@ def get_context(context): student = frappe.form_dict["username"] class_name = frappe.form_dict["classname"] context.is_moderator = has_course_moderator_role() + context.is_evaluator = has_course_evaluator_role() context.student = frappe.db.get_value( "User", @@ -17,6 +18,13 @@ def get_context(context): ["first_name", "full_name", "name", "last_active", "username"], as_dict=True, ) + if ( + not context.is_moderator + and not context.is_evaluator + and not context.student.name == frappe.session.user + ): + raise frappe.PermissionError(_("You don't have permission to access this page.")) + context.class_info = frappe.db.get_value( "LMS Class", class_name, ["name"], as_dict=True )