From 449572b985bbed564599353525f790c4dcaa0849 Mon Sep 17 00:00:00 2001 From: Arslan Date: Wed, 6 Nov 2024 19:03:10 +0500 Subject: [PATCH] feat: add supporting code for Canvas Integraton --- lms/djangoapps/instructor/views/api.py | 4 ++++ lms/djangoapps/instructor_task/views.py | 7 +++++++ .../instructor_dashboard/instructor_dashboard.js | 3 +++ lms/static/js/instructor_dashboard/util.js | 15 ++++++++++++--- .../html-datatable.underscore | 16 ++++++++++++++++ .../instructor_dashboard_2.html | 2 +- 6 files changed, 43 insertions(+), 4 deletions(-) create mode 100644 lms/templates/instructor/instructor_dashboard_2/html-datatable.underscore diff --git a/lms/djangoapps/instructor/views/api.py b/lms/djangoapps/instructor/views/api.py index 2b1f28e4ceac..2b8332baa639 100644 --- a/lms/djangoapps/instructor/views/api.py +++ b/lms/djangoapps/instructor/views/api.py @@ -2428,6 +2428,7 @@ def _list_instructor_tasks(request, course_id, serialize_data=None): # The query_params attribute is utilized for GET requests, # where parameters are passed as query strings. + include_canvas = request.GET.get('include_canvas') is not None course_id = CourseKey.from_string(course_id) if serialize_data is not None: problem_location_str = strip_if_string(serialize_data.get('problem_location_str', False)) @@ -2456,6 +2457,9 @@ def _list_instructor_tasks(request, course_id, serialize_data=None): else: # Specifying for single problem's history tasks = task_api.get_instructor_task_history(course_id, module_state_key) + elif include_canvas: + from ol_openedx_canvas_integration.task_helpers import get_filtered_instructor_tasks + tasks = get_filtered_instructor_tasks(course_id, request.user) else: # If no problem or student, just get currently running tasks tasks = task_api.get_running_instructor_tasks(course_id) diff --git a/lms/djangoapps/instructor_task/views.py b/lms/djangoapps/instructor_task/views.py index 51e2812577fe..3da3657d465e 100644 --- a/lms/djangoapps/instructor_task/views.py +++ b/lms/djangoapps/instructor_task/views.py @@ -138,7 +138,9 @@ def get_task_completion_info(instructor_task): # lint-amnesty, pylint: disable= student = None problem_url = None + entrance_exam_url = None email_id = None + course_id = None try: task_input = json.loads(instructor_task.task_input) except ValueError: @@ -149,6 +151,7 @@ def get_task_completion_info(instructor_task): # lint-amnesty, pylint: disable= problem_url = task_input.get('problem_url') entrance_exam_url = task_input.get('entrance_exam_url') email_id = task_input.get('email_id') + course_id = task_input.get('course_key') if instructor_task.task_state == PROGRESS: # special message for providing progress updates: @@ -192,6 +195,10 @@ def get_task_completion_info(instructor_task): # lint-amnesty, pylint: disable= else: # num_succeeded < num_attempted # Translators: {action} is a past-tense verb that is localized separately. {succeeded} and {attempted} are counts. # lint-amnesty, pylint: disable=line-too-long msg_format = _("Problem {action} for {succeeded} of {attempted} students") + elif course_id is not None: + from ol_openedx_canvas_integration.utils import get_task_output_formatted_message + msg_format = get_task_output_formatted_message(task_output) + succeeded = True elif email_id is not None: # this reports on actions on bulk emails if num_attempted == 0: diff --git a/lms/static/js/instructor_dashboard/instructor_dashboard.js b/lms/static/js/instructor_dashboard/instructor_dashboard.js index f87e9db8e814..14f47fce6f36 100644 --- a/lms/static/js/instructor_dashboard/instructor_dashboard.js +++ b/lms/static/js/instructor_dashboard/instructor_dashboard.js @@ -176,6 +176,9 @@ such that the value can be defined later than this assignment (file load order). }, { constructor: window.InstructorDashboard.sections.ECommerce, $element: idashContent.find('.' + CSS_IDASH_SECTION + '#e-commerce') + }, { + constructor: window.InstructorDashboard.sections.CanvasIntegration, + $element: idashContent.find('.' + CSS_IDASH_SECTION + '#canvas_integration') }, { constructor: window.InstructorDashboard.sections.Membership, $element: idashContent.find('.' + CSS_IDASH_SECTION + '#membership') diff --git a/lms/static/js/instructor_dashboard/util.js b/lms/static/js/instructor_dashboard/util.js index 8e39f4d03e66..1c8d4e00c1e5 100644 --- a/lms/static/js/instructor_dashboard/util.js +++ b/lms/static/js/instructor_dashboard/util.js @@ -51,7 +51,8 @@ enableColumnReorder: false, autoHeight: true, rowHeight: 100, - forceFitColumns: true + forceFitColumns: true, + enableTextSelectionOnCells: true }; columns = [ { @@ -98,7 +99,14 @@ */ name: gettext('Submitted'), - minWidth: 120 + minWidth: 120, + formatter: function(row, cell, value) { + if (!value) { + return value + } + var fromNow = moment(value).fromNow() + return value.concat("
(", fromNow, ")") + } }, { id: 'duration_sec', field: 'duration_sec', @@ -492,7 +500,8 @@ enableCellNavigation: true, enableColumnReorder: false, rowHeight: 30, - forceFitColumns: true + forceFitColumns: true, + enableTextSelectionOnCells: true }; columns = [ { diff --git a/lms/templates/instructor/instructor_dashboard_2/html-datatable.underscore b/lms/templates/instructor/instructor_dashboard_2/html-datatable.underscore new file mode 100644 index 000000000000..89da91b17881 --- /dev/null +++ b/lms/templates/instructor/instructor_dashboard_2/html-datatable.underscore @@ -0,0 +1,16 @@ +

+

<%- title %>

+ + <%_.forEach(header, function (h) {%> + + <%})%> + + <%_.forEach(data, function (row) {%> + + <%_.forEach(row, function (value) {%> + + <%})%> + + <%})%> +
<%- h %>
<%- value %>
+

diff --git a/lms/templates/instructor/instructor_dashboard_2/instructor_dashboard_2.html b/lms/templates/instructor/instructor_dashboard_2/instructor_dashboard_2.html index 6fe80e7fdea0..0bb0b6054735 100644 --- a/lms/templates/instructor/instructor_dashboard_2/instructor_dashboard_2.html +++ b/lms/templates/instructor/instructor_dashboard_2/instructor_dashboard_2.html @@ -92,7 +92,7 @@ ## Include Underscore templates <%block name="header_extras"> -% for template_name in ["cohorts", "discussions", "enrollment-code-lookup-links", "cohort-editor", "cohort-group-header", "cohort-selector", "cohort-form", "notification", "cohort-state", "divided-discussions-inline", "divided-discussions-course-wide", "cohort-discussions-category", "cohort-discussions-subcategory", "certificate-allowlist", "certificate-allowlist-editor", "certificate-bulk-allowlist", "certificate-invalidation", "membership-list-widget"]: +% for template_name in ["cohorts", "discussions", "enrollment-code-lookup-links", "cohort-editor", "cohort-group-header", "cohort-selector", "cohort-form", "notification", "cohort-state", "divided-discussions-inline", "divided-discussions-course-wide", "cohort-discussions-category", "cohort-discussions-subcategory", "certificate-allowlist", "certificate-allowlist-editor", "certificate-bulk-allowlist", "certificate-invalidation", "membership-list-widget", "html-datatable"]: