From d87fb81cf3037ed5a6795c78ed04262d6a5ea567 Mon Sep 17 00:00:00 2001 From: Jannat Patel Date: Thu, 23 Feb 2023 12:40:07 +0530 Subject: [PATCH 1/3] fix: class issues --- .../lms_certificate_evaluation.json | 11 ++- .../lms_certificate_request.json | 5 +- lms/lms/doctype/lms_class/lms_class.js | 11 ++- lms/lms/doctype/lms_class/lms_class.json | 2 +- lms/lms/doctype/lms_class/lms_class.py | 41 ++++++--- lms/lms/doctype/lms_course/lms_course.json | 3 +- .../doctype/lms_settings/lms_settings.json | 13 ++- lms/lms/web_form/evaluation/evaluation.js | 9 +- lms/lms/web_form/evaluation/evaluation.json | 92 +++++++++++-------- lms/public/css/style.css | 24 ++++- lms/www/classes/class.html | 22 +++-- lms/www/classes/class.py | 15 ++- lms/www/classes/progress.html | 6 +- lms/www/classes/progress.py | 2 +- 14 files changed, 173 insertions(+), 83 deletions(-) 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 0bd477d9..87960137 100644 --- a/lms/lms/doctype/lms_certificate_evaluation/lms_certificate_evaluation.json +++ b/lms/lms/doctype/lms_certificate_evaluation/lms_certificate_evaluation.json @@ -9,8 +9,9 @@ "member", "member_name", "column_break_5", - "course", "status", + "course", + "class", "section_break_6", "date", "start_time", @@ -93,11 +94,17 @@ { "fieldname": "column_break_10", "fieldtype": "Column Break" + }, + { + "fieldname": "class", + "fieldtype": "Link", + "label": "Class", + "options": "LMS Class" } ], "index_web_pages_for_search": 1, "links": [], - "modified": "2022-11-23 11:49:01.400292", + "modified": "2023-02-22 16:00:34.361934", "modified_by": "Administrator", "module": "LMS", "name": "LMS Certificate Evaluation", 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 f789c44a..f1756868 100644 --- a/lms/lms/doctype/lms_certificate_request/lms_certificate_request.json +++ b/lms/lms/doctype/lms_certificate_request/lms_certificate_request.json @@ -31,7 +31,7 @@ { "fieldname": "member", "fieldtype": "Link", - "in_list_view": 1, + "in_standard_filter": 1, "label": "Member", "options": "User", "reqd": 1 @@ -68,7 +68,6 @@ { "fieldname": "end_time", "fieldtype": "Time", - "in_list_view": 1, "label": "End Time", "reqd": 1 }, @@ -94,7 +93,7 @@ ], "index_web_pages_for_search": 1, "links": [], - "modified": "2023-02-17 09:26:13.776325", + "modified": "2023-02-23 09:47:46.480376", "modified_by": "Administrator", "module": "LMS", "name": "LMS Certificate Request", diff --git a/lms/lms/doctype/lms_class/lms_class.js b/lms/lms/doctype/lms_class/lms_class.js index 78508cbf..d3d3e2a2 100644 --- a/lms/lms/doctype/lms_class/lms_class.js +++ b/lms/lms/doctype/lms_class/lms_class.js @@ -2,6 +2,13 @@ // For license information, please see license.txt frappe.ui.form.on("LMS Class", { - // refresh: function(frm) { - // } + onload: function (frm) { + frm.set_query("student", "students", function (doc) { + return { + filters: { + ignore_user_type: 1, + }, + }; + }); + }, }); diff --git a/lms/lms/doctype/lms_class/lms_class.json b/lms/lms/doctype/lms_class/lms_class.json index 58854f88..79f1afc9 100644 --- a/lms/lms/doctype/lms_class/lms_class.json +++ b/lms/lms/doctype/lms_class/lms_class.json @@ -73,7 +73,7 @@ ], "index_web_pages_for_search": 1, "links": [], - "modified": "2022-11-25 10:37:24.250557", + "modified": "2023-02-22 15:58:02.557158", "modified_by": "Administrator", "module": "LMS", "name": "LMS Class", diff --git a/lms/lms/doctype/lms_class/lms_class.py b/lms/lms/doctype/lms_class/lms_class.py index 281bbe78..f417da97 100644 --- a/lms/lms/doctype/lms_class/lms_class.py +++ b/lms/lms/doctype/lms_class/lms_class.py @@ -9,19 +9,29 @@ from frappe.utils import cint class LMSClass(Document): def validate(self): - validate_membership(self) + self.validate_duplicate_students() + self.validate_membership() + def validate_duplicate_students(self): + students = [row.student for row in self.students] + duplicates = {student for student in students if students.count(student) > 1} + if len(duplicates): + frappe.throw( + _("Student {0} has already been added to this class.").format( + frappe.bold(next(iter(duplicates))) + ) + ) -def validate_membership(self): - for course in self.courses: - for student in self.students: - filters = { - "doctype": "LMS Batch Membership", - "member": student.student, - "course": course.course, - } - if not frappe.db.exists(filters): - frappe.get_doc(filters).save() + def validate_membership(self): + for course in self.courses: + for student in self.students: + filters = { + "doctype": "LMS Batch Membership", + "member": student.student, + "course": course.course, + } + if not frappe.db.exists(filters): + frappe.get_doc(filters).save() @frappe.whitelist() @@ -29,6 +39,15 @@ def add_student(email, class_name): if not frappe.db.exists("User", email): frappe.throw(_("There is no such user. Please create a user with this Email ID.")) + filters = { + "student": email, + "parent": class_name, + "parenttype": "LMS Class", + "parentfield": "students", + } + if frappe.db.exists("Class Student", filters): + frappe.throw(_(f"Student {frappe.bold(email)} has already been added to this class.")) + frappe.get_doc( { "doctype": "Class Student", diff --git a/lms/lms/doctype/lms_course/lms_course.json b/lms/lms/doctype/lms_course/lms_course.json index cb656a26..94629b28 100644 --- a/lms/lms/doctype/lms_course/lms_course.json +++ b/lms/lms/doctype/lms_course/lms_course.json @@ -261,7 +261,7 @@ } ], "make_attachments_public": 1, - "modified": "2023-02-16 10:11:17.557472", + "modified": "2023-02-23 09:45:54.826324", "modified_by": "Administrator", "module": "LMS", "name": "LMS Course", @@ -295,6 +295,7 @@ } ], "search_fields": "title", + "show_title_field_in_link": 1, "sort_field": "creation", "sort_order": "DESC", "states": [], diff --git a/lms/lms/doctype/lms_settings/lms_settings.json b/lms/lms/doctype/lms_settings/lms_settings.json index e2f7d108..7dbeed68 100644 --- a/lms/lms/doctype/lms_settings/lms_settings.json +++ b/lms/lms/doctype/lms_settings/lms_settings.json @@ -6,9 +6,10 @@ "engine": "InnoDB", "field_order": [ "default_home", - "is_onboarding_complete", - "column_break_zdel", "send_calendar_invite_for_evaluations", + "allow_student_progress", + "column_break_zdel", + "is_onboarding_complete", "force_profile_completion", "section_break_szgq", "search_placeholder", @@ -180,12 +181,18 @@ "fieldname": "mentor_request_tab", "fieldtype": "Tab Break", "label": "Mentor Request" + }, + { + "default": "0", + "fieldname": "allow_student_progress", + "fieldtype": "Check", + "label": "Allow students to see each others progress in class" } ], "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2023-02-15 17:13:11.802215", + "modified": "2023-02-23 10:39:38.912549", "modified_by": "Administrator", "module": "LMS", "name": "LMS Settings", diff --git a/lms/lms/web_form/evaluation/evaluation.js b/lms/lms/web_form/evaluation/evaluation.js index 958eb7a1..3b0372f4 100644 --- a/lms/lms/web_form/evaluation/evaluation.js +++ b/lms/lms/web_form/evaluation/evaluation.js @@ -1,7 +1,10 @@ frappe.ready(function () { frappe.web_form.after_save = () => { - setTimeout(() => { - window.history.back(); - }); + let data = frappe.web_form.get_values(); + if (data.class) { + setTimeout(() => { + window.location.href = `/classes/${data.class}`; + }, 2000); + } }; }); diff --git a/lms/lms/web_form/evaluation/evaluation.json b/lms/lms/web_form/evaluation/evaluation.json index 0da8031d..4955b833 100644 --- a/lms/lms/web_form/evaluation/evaluation.json +++ b/lms/lms/web_form/evaluation/evaluation.json @@ -10,7 +10,7 @@ "amount_based_on_field": 0, "apply_document_permissions": 0, "button_label": "Save", - "creation": "2022-11-23 11:59:33.533053", + "creation": "2023-02-24 11:59:33.533053", "doc_type": "LMS Certificate Evaluation", "docstatus": 0, "doctype": "Web Form", @@ -20,7 +20,7 @@ "list_columns": [], "login_required": 1, "max_attachment_size": 0, - "modified": "2022-11-25 17:05:30.851109", + "modified": "2022-02-26 17:05:30.851110", "modified_by": "Administrator", "module": "LMS", "name": "evaluation", @@ -29,8 +29,9 @@ "published": 1, "route": "evaluation", "show_attachments": 0, - "show_list": 0, + "show_list": 1, "show_sidebar": 0, + "success_message": "Evaluation has been submitted successfully.", "title": "Evaluation", "web_form_fields": [ { @@ -59,6 +60,31 @@ "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 + }, + { + "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": "date", @@ -95,31 +121,6 @@ "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", @@ -134,16 +135,29 @@ "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 - } + "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": "class", + "fieldtype": "Link", + "hidden": 0, + "label": "Class", + "max_length": 0, + "max_value": 0, + "options": "LMS Class", + "read_only": 1, + "reqd": 0, + "show_in_filter": 0 + } ] } diff --git a/lms/public/css/style.css b/lms/public/css/style.css index a331f7f5..a32648cc 100644 --- a/lms/public/css/style.css +++ b/lms/public/css/style.css @@ -463,6 +463,11 @@ input[type=checkbox] { margin-bottom: 1rem; } +.course-home-headings:hover { + color: var(--gray-900); + text-decoration: none; +} + .modal-headings { margin: 0; } @@ -1869,10 +1874,21 @@ select { } .table th { - color: var(--gray-900); - font-weight: 500; + font-weight: 400; + border: none; + font-size: var(--text-md); +} + +.table td { + border: none; +} + +.table tr:first-child, .table tr:last-child { + border-bottom: none; +} + +.table tr { border-bottom: 1px solid var(--gray-300); - border-top: none; } .lms-dropdown { @@ -1957,3 +1973,5 @@ select { color: var(--gray-900); font-weight: 500; } + + diff --git a/lms/www/classes/class.html b/lms/www/classes/class.html index fad13613..87a73f2d 100644 --- a/lms/www/classes/class.html +++ b/lms/www/classes/class.html @@ -30,15 +30,7 @@ {% macro ClassDetails(class_info) %}
-
- {{ class_info.title }} -
- {% if class_info.description %} -
- {{ class_info.description }} -
- {% endif %} -
+
{% if class_info.start_date %} {{ frappe.utils.format_date(class_info.start_date, "medium") }} - @@ -50,6 +42,15 @@ {% endif %}
+
+ {{ class_info.title }} +
+ {% if class_info.description %} +
+ {{ class_info.description }} +
+ {% endif %} + {% if class_info.custom_component %} {{ class_info.custom_component }} {% endif %} @@ -128,9 +129,10 @@ {% for student in class_students %} {% set last_active = frappe.db.get_value("User", student.student, "last_active") %} + {% set allow_progress = is_moderator or student.student == frappe.session.user or frappe.db.get_single_value("LMS Settings", "allow_student_progress") %} - + {{ student.student_name }} diff --git a/lms/www/classes/class.py b/lms/www/classes/class.py index dce859c3..b872685c 100644 --- a/lms/www/classes/class.py +++ b/lms/www/classes/class.py @@ -6,6 +6,8 @@ from frappe import _ def get_context(context): context.no_cache = 1 class_name = frappe.form_dict["classname"] + session_user = [] + remaining_students = [] context.class_info = frappe.db.get_value( "LMS Class", @@ -22,8 +24,19 @@ def get_context(context): "Class Course", {"parent": class_name}, pluck="course" ) - context.class_students = frappe.get_all( + class_students = frappe.get_all( "Class Student", {"parent": class_name}, ["student", "student_name", "username"] ) + for student in class_students: + if student.student == frappe.session.user: + session_user.append(student) + else: + remaining_students.append(student) + + if len(session_user): + context.class_students = session_user + remaining_students + else: + context.class_students = class_students + context.is_moderator = has_course_moderator_role() diff --git a/lms/www/classes/progress.html b/lms/www/classes/progress.html index 3eec51ef..07fc6b40 100644 --- a/lms/www/classes/progress.html +++ b/lms/www/classes/progress.html @@ -15,14 +15,14 @@ {{ frappe.utils.format_datetime(student.last_active, "medium") }} {% if is_moderator %} - + {{ _("Evaluate") }} {% endif %}
- +
{{ Progress(class_courses, student) }} diff --git a/lms/www/classes/progress.py b/lms/www/classes/progress.py index 383f2fb6..df03849e 100644 --- a/lms/www/classes/progress.py +++ b/lms/www/classes/progress.py @@ -13,7 +13,7 @@ def get_context(context): context.student = frappe.db.get_value( "User", {"username": student}, - ["first_name", "full_name", "name", "last_active"], + ["first_name", "full_name", "name", "last_active", "username"], as_dict=True, ) context.class_info = frappe.db.get_value( From 54827edd7e20f3e126a6d2f23676a12bbbbc7855 Mon Sep 17 00:00:00 2001 From: Jannat Patel Date: Thu, 23 Feb 2023 13:01:45 +0530 Subject: [PATCH 2/3] fix: modified timestamp --- lms/lms/doctype/lms_class/lms_class.json | 4 ++-- lms/lms/web_form/evaluation/evaluation.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lms/lms/doctype/lms_class/lms_class.json b/lms/lms/doctype/lms_class/lms_class.json index 79f1afc9..7f4c99cf 100644 --- a/lms/lms/doctype/lms_class/lms_class.json +++ b/lms/lms/doctype/lms_class/lms_class.json @@ -73,7 +73,7 @@ ], "index_web_pages_for_search": 1, "links": [], - "modified": "2023-02-22 15:58:02.557158", + "modified": "2022-11-25 10:37:24.250557", "modified_by": "Administrator", "module": "LMS", "name": "LMS Class", @@ -108,4 +108,4 @@ "sort_field": "modified", "sort_order": "DESC", "states": [] -} \ No newline at end of file +} diff --git a/lms/lms/web_form/evaluation/evaluation.json b/lms/lms/web_form/evaluation/evaluation.json index 4955b833..9a6c5e30 100644 --- a/lms/lms/web_form/evaluation/evaluation.json +++ b/lms/lms/web_form/evaluation/evaluation.json @@ -10,7 +10,7 @@ "amount_based_on_field": 0, "apply_document_permissions": 0, "button_label": "Save", - "creation": "2023-02-24 11:59:33.533053", + "creation": "2022-11-23 11:59:33.533053", "doc_type": "LMS Certificate Evaluation", "docstatus": 0, "doctype": "Web Form", @@ -20,7 +20,7 @@ "list_columns": [], "login_required": 1, "max_attachment_size": 0, - "modified": "2022-02-26 17:05:30.851110", + "modified": "2022-02-26 17:05:30.851122", "modified_by": "Administrator", "module": "LMS", "name": "evaluation", From 296a7e602378cbfa05bcbad7d87b6cb15a9e6ec7 Mon Sep 17 00:00:00 2001 From: Jannat Patel Date: Thu, 23 Feb 2023 13:04:47 +0530 Subject: [PATCH 3/3] fix: translation syntax --- lms/lms/doctype/lms_class/lms_class.py | 4 +- lms/lms/web_form/evaluation/evaluation.json | 53 ++++++++++----------- 2 files changed, 29 insertions(+), 28 deletions(-) diff --git a/lms/lms/doctype/lms_class/lms_class.py b/lms/lms/doctype/lms_class/lms_class.py index f417da97..4a91416d 100644 --- a/lms/lms/doctype/lms_class/lms_class.py +++ b/lms/lms/doctype/lms_class/lms_class.py @@ -46,7 +46,9 @@ def add_student(email, class_name): "parentfield": "students", } if frappe.db.exists("Class Student", filters): - frappe.throw(_(f"Student {frappe.bold(email)} has already been added to this class.")) + frappe.throw( + _("Student {0} has already been added to this class.").format(frappe.bold(email)) + ) frappe.get_doc( { diff --git a/lms/lms/web_form/evaluation/evaluation.json b/lms/lms/web_form/evaluation/evaluation.json index 9a6c5e30..0b84e9d3 100644 --- a/lms/lms/web_form/evaluation/evaluation.json +++ b/lms/lms/web_form/evaluation/evaluation.json @@ -20,7 +20,7 @@ "list_columns": [], "login_required": 1, "max_attachment_size": 0, - "modified": "2022-02-26 17:05:30.851122", + "modified": "2023-02-23 13:04:00.405266", "modified_by": "Administrator", "module": "LMS", "name": "evaluation", @@ -31,7 +31,6 @@ "show_attachments": 0, "show_list": 1, "show_sidebar": 0, - "success_message": "Evaluation has been submitted successfully.", "title": "Evaluation", "web_form_fields": [ { @@ -121,6 +120,18 @@ "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", @@ -135,29 +146,17 @@ "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": "class", - "fieldtype": "Link", - "hidden": 0, - "label": "Class", - "max_length": 0, - "max_value": 0, - "options": "LMS Class", - "read_only": 1, - "reqd": 0, - "show_in_filter": 0 - } + "allow_read_on_all_link_options": 0, + "fieldname": "class", + "fieldtype": "Link", + "hidden": 1, + "label": "Class", + "max_length": 0, + "max_value": 0, + "options": "LMS Class", + "read_only": 1, + "reqd": 0, + "show_in_filter": 0 + } ] -} +} \ No newline at end of file