From 47783997c6cb87c5bdc2f555209e599ad4f55317 Mon Sep 17 00:00:00 2001 From: Jannat Patel Date: Fri, 6 Oct 2023 15:32:53 +0530 Subject: [PATCH] feat: assignment as text --- .../lms_assignment/lms_assignment.json | 30 ++++++++++--- .../lms_assignment_submission.json | 37 ++++++++++------ .../lms_assignment_submission.py | 11 +++-- lms/patches.txt | 2 +- lms/public/js/common_functions.js | 2 +- .../assignment_submission.html | 43 +++++++++++++++---- .../assignment_submission.js | 37 ++++++++++++++-- .../assignment_submission.py | 9 +++- lms/www/assignments/index.html | 32 ++++++++++++-- lms/www/assignments/index.py | 9 +++- 10 files changed, 172 insertions(+), 40 deletions(-) diff --git a/lms/lms/doctype/lms_assignment/lms_assignment.json b/lms/lms/doctype/lms_assignment/lms_assignment.json index 6cb778a1..654989d5 100644 --- a/lms/lms/doctype/lms_assignment/lms_assignment.json +++ b/lms/lms/doctype/lms_assignment/lms_assignment.json @@ -9,10 +9,12 @@ "engine": "InnoDB", "field_order": [ "title", + "grade_assignment", + "question", "column_break_hmwv", "type", - "section_break_lwvt", - "question" + "show_answer", + "answer" ], "fields": [ { @@ -26,7 +28,7 @@ "in_list_view": 1, "in_standard_filter": 1, "label": "Type", - "options": "Document\nPDF\nURL\nImage" + "options": "Document\nPDF\nURL\nImage\nText" }, { "fieldname": "title", @@ -40,13 +42,29 @@ "fieldtype": "Column Break" }, { - "fieldname": "section_break_lwvt", - "fieldtype": "Section Break" + "default": "0", + "depends_on": "eval:doc.type == \"Text\"", + "fieldname": "show_answer", + "fieldtype": "Check", + "label": "Show Answer" + }, + { + "depends_on": "show_answer", + "fieldname": "answer", + "fieldtype": "Text Editor", + "label": "Answer" + }, + { + "default": "1", + "depends_on": "eval:doc.type == \"Text\"", + "fieldname": "grade_assignment", + "fieldtype": "Check", + "label": "Grade Assignment" } ], "index_web_pages_for_search": 1, "links": [], - "modified": "2023-06-26 18:09:29.809564", + "modified": "2023-10-06 12:08:46.898950", "modified_by": "Administrator", "module": "LMS", "name": "LMS Assignment", diff --git a/lms/lms/doctype/lms_assignment_submission/lms_assignment_submission.json b/lms/lms/doctype/lms_assignment_submission/lms_assignment_submission.json index 1d68e33b..86c71c4d 100644 --- a/lms/lms/doctype/lms_assignment_submission/lms_assignment_submission.json +++ b/lms/lms/doctype/lms_assignment_submission/lms_assignment_submission.json @@ -9,29 +9,29 @@ "field_order": [ "assignment", "assignment_title", - "question", + "type", "column_break_3", "member", "member_name", - "type", + "section_break_dlzh", + "question", + "column_break_zvis", "assignment_attachment", "answer", "section_break_rqal", "status", + "evaluator", "column_break_esgd", "comments", "section_break_cwaw", "lesson", "course", - "column_break_ygdu", - "evaluator" + "column_break_ygdu" ], "fields": [ { "fieldname": "lesson", "fieldtype": "Link", - "in_list_view": 1, - "in_standard_filter": 1, "label": "Lesson", "options": "Course Lesson" }, @@ -78,7 +78,7 @@ "fieldname": "status", "fieldtype": "Select", "label": "Status", - "options": "Pass\nFail\nNot Graded" + "options": "Pass\nFail\nNot Graded\nNot Applicable" }, { "fieldname": "comments", @@ -94,7 +94,7 @@ "read_only": 1 }, { - "depends_on": "eval:doc.type != \"URL\";", + "depends_on": "eval:!([\"URL\", \"Text\"]).includes(doc.type);", "fieldname": "assignment_attachment", "fieldtype": "Attach", "label": "Assignment Attachment", @@ -104,8 +104,9 @@ "fetch_from": "assignment.type", "fieldname": "type", "fieldtype": "Select", + "in_list_view": 1, "label": "Type", - "options": "Document\nPDF\nURL\nImage" + "options": "Document\nPDF\nURL\nImage\nText" }, { "fetch_from": "assignment.question", @@ -137,17 +138,25 @@ "fieldtype": "Column Break" }, { - "depends_on": "eval:doc.type == \"URL\";", + "depends_on": "eval:([\"URL\", \"Text\"]).includes(doc.type);", "fieldname": "answer", - "fieldtype": "Long Text", + "fieldtype": "Text Editor", "label": "Answer", "mandatory_depends_on": "eval:doc.type == \"URL\";" + }, + { + "fieldname": "section_break_dlzh", + "fieldtype": "Section Break" + }, + { + "fieldname": "column_break_zvis", + "fieldtype": "Column Break" } ], "index_web_pages_for_search": 1, "links": [], "make_attachments_public": 1, - "modified": "2023-08-30 12:09:03.332820", + "modified": "2023-10-06 15:14:55.984714", "modified_by": "Administrator", "module": "LMS", "name": "LMS Assignment Submission", @@ -181,6 +190,10 @@ { "color": "Red", "title": "Fail" + }, + { + "color": "Blue", + "title": "Not Applicable" } ], "title_field": "assignment_title" diff --git a/lms/lms/doctype/lms_assignment_submission/lms_assignment_submission.py b/lms/lms/doctype/lms_assignment_submission/lms_assignment_submission.py index 1989f87c..4db88eeb 100644 --- a/lms/lms/doctype/lms_assignment_submission/lms_assignment_submission.py +++ b/lms/lms/doctype/lms_assignment_submission/lms_assignment_submission.py @@ -37,9 +37,12 @@ def upload_assignment( if frappe.session.user == "Guest": return - assignment_type = frappe.db.get_value("LMS Assignment", assignment, "type") + assignment_details = frappe.db.get_value( + "LMS Assignment", assignment, ["type", "grade_assignment"], as_dict=1 + ) + assignment_type = assignment_details.type - if assignment_type == "URL" and not answer: + if assignment_type in ["URL", "Text"] and not answer: frappe.throw(_("Please enter the URL for assignment submission.")) if assignment_type == "File" and not assignment_attachment: @@ -64,7 +67,9 @@ def upload_assignment( doc.update( { "assignment_attachment": assignment_attachment, - "status": status, + "status": "Not Applicable" + if assignment_type == "Text" and not assignment_details.grade_assignment + else status, "comments": comments, "answer": answer, } diff --git a/lms/patches.txt b/lms/patches.txt index 13926122..86e4a840 100644 --- a/lms/patches.txt +++ b/lms/patches.txt @@ -71,4 +71,4 @@ lms.patches.v1_0.publish_batches lms.patches.v1_0.publish_certificates lms.patches.v1_0.change_naming_for_batch_course #14-09-2023 execute:frappe.permissions.reset_perms("LMS Enrollment") -lms.patches.v1_0.create_student_role +lms.patches.v1_0.create_student_role \ No newline at end of file diff --git a/lms/public/js/common_functions.js b/lms/public/js/common_functions.js index d0f17265..e4cf8433 100644 --- a/lms/public/js/common_functions.js +++ b/lms/public/js/common_functions.js @@ -350,7 +350,7 @@ const open_batch_dialog = () => { fieldtype: "Attach Image", label: __("Meta Image"), fieldname: "meta_image", - default: batch_info && batch_info.image, + default: batch_info && batch_info.meta_image, }, { fieldtype: "Section Break", diff --git a/lms/www/assignment_submission/assignment_submission.html b/lms/www/assignment_submission/assignment_submission.html index 3a25ee2c..253a8004 100644 --- a/lms/www/assignment_submission/assignment_submission.html +++ b/lms/www/assignment_submission/assignment_submission.html @@ -21,7 +21,7 @@
{{ assignment.title }}
- {% if submission.status %} + {% if assignment.grade_assignment and submission.status %} {% set color = "green" if submission.status == "Pass" else "red" if submission.status == "Fail" else "orange" %}
{{ submission.status }} @@ -37,7 +37,7 @@
- + {% if not assignment.show_answer or (assignment.show_answer and not submission) %}
+ {% endif %} @@ -52,7 +53,7 @@ {% macro SubmissionForm(assignment) %}
- {% if submission.name %} + {% if assignment.grade_assignment and submission.name %}
{{ _("You've successfully submitted the assignment. Once the moderator grades your submission, you'll find the details here. Feel free to make edits to your submission if needed.") }}
@@ -73,7 +74,7 @@ {{ assignment.question }} - {% if assignment.type != "URL" %} + {% if assignment.type not in ["URL", "Text"] %}
{{ _("Submit")}} @@ -100,17 +101,41 @@
- {{ _("Submit")}} + {{ _("Submission")}}
- {{ _("Enter a URL") }} + {% if assignment.type == "URL" %} + {{ _("Enter a {0}").format(assignment.type) }} + {% else %} + {{ _("Enter your response") }} + {% endif %}
- + {% if assignment.type == "URL" %} + + {% else %} +
+ {% if submission.answer %} +
+ {{ submission.answer }} +
+ {% endif %} + {% endif %}
{% endif %} - {% if is_moderator %} + {% if assignment.show_answer and submission %} +
+
+ {{ _("Response by Instructor:") }} +
+
+ {{ assignment.answer }} +
+
+ {% endif %} + + {% if assignment.grade_assignment and is_moderator %}
{{ _("Status") }} diff --git a/lms/www/assignment_submission/assignment_submission.js b/lms/www/assignment_submission/assignment_submission.js index d5147554..f336abc3 100644 --- a/lms/www/assignment_submission/assignment_submission.js +++ b/lms/www/assignment_submission/assignment_submission.js @@ -1,4 +1,10 @@ frappe.ready(() => { + if ($(".assignment-text").length) { + frappe.require("controls.bundle.js", () => { + make_text_editor(); + }); + } + $(".btn-upload").click((e) => { upload_file(e); }); @@ -52,11 +58,19 @@ const save_assignment = (e) => { file = ""; if (data == "URL") { - answer = $("#assignment-url").val(); + answer = $(".assignment-answer").val(); if (!answer) { frappe.throw({ - title: __("No URL"), - message: __("Please enter a URL."), + title: __("No Submission"), + message: __("Please enter a response."), + }); + } + } else if (data == "Text") { + answer = this.text_editor.get_value("assignment_text"); + if (!answer) { + frappe.throw({ + title: __("No Submission"), + message: __("Please enter a response."), }); } } else { @@ -99,3 +113,20 @@ const clear_preview = (e) => { $("#assignment-preview a").attr("href", ""); $("#assignment-preview .btn-close").addClass("hide"); }; + +const make_text_editor = () => { + this.text_editor = new frappe.ui.FieldGroup({ + fields: [ + { + fieldname: "assignment_text", + fieldtype: "Text Editor", + default: $(".assignment-text-data").html(), + }, + ], + body: $(".assignment-text").get(0), + }); + this.text_editor.make(); + $(".assignment-text .form-section:last").removeClass("empty-section"); + $(".assignment-text .frappe-control").removeClass("hide-control"); + $(".assignment-text .form-column").addClass("p-0"); +}; diff --git a/lms/www/assignment_submission/assignment_submission.py b/lms/www/assignment_submission/assignment_submission.py index a026679e..93ecb2f7 100644 --- a/lms/www/assignment_submission/assignment_submission.py +++ b/lms/www/assignment_submission/assignment_submission.py @@ -14,7 +14,10 @@ def get_context(context): assignment = frappe.form_dict["assignment"] context.assignment = frappe.db.get_value( - "LMS Assignment", assignment, ["title", "name", "type", "question"], as_dict=1 + "LMS Assignment", + assignment, + ["title", "name", "type", "question", "show_answer", "answer", "grade_assignment"], + as_dict=1, ) if submission == "new-submission": @@ -34,6 +37,10 @@ def get_context(context): ], as_dict=True, ) + + if not context.submission: + raise frappe.PermissionError(_("Invalid Submission URL")) + if not context.is_moderator and frappe.session.user != context.submission.member: raise frappe.PermissionError(_("You don't have permission to access this page.")) diff --git a/lms/www/assignments/index.html b/lms/www/assignments/index.html index e04bc3f3..52374455 100644 --- a/lms/www/assignments/index.html +++ b/lms/www/assignments/index.html @@ -5,7 +5,7 @@ {% block content %}
-
+
{{ Header() }} {% if assignments | length %} {{ AssignmentList(assignments) }} @@ -32,7 +32,33 @@ {% macro AssignmentList(assignments) %}
-
    +
    +
    +
    +
    +
    + {{ _("Title") }} +
    +
    + {{ _("Type") }} +
    +
    +
    +
    + {% for assignment in assignments %} +
    +
    + + {{ assignment.title }} + +
    + {{ assignment.type }} +
    +
    +
    + {% endfor %} +
    +
{% endmacro %} diff --git a/lms/www/assignments/index.py b/lms/www/assignments/index.py index 528b92f8..f8d9e3a4 100644 --- a/lms/www/assignments/index.py +++ b/lms/www/assignments/index.py @@ -1,10 +1,17 @@ import frappe +from lms.lms.utils import has_course_moderator_role def get_context(context): context.no_cache = 1 + + filters = {"owner": frappe.session.user} + + if has_course_moderator_role(): + filters = {} + context.assignments = frappe.get_all( "LMS Assignment", - {"owner": frappe.session.user}, + filters, ["title", "name", "type", "question"], )