From 26aa6fca2e76e661f8b2ca707a493f0e478ebf8f Mon Sep 17 00:00:00 2001 From: Talha Date: Mon, 21 Apr 2025 15:20:17 +0500 Subject: [PATCH 1/2] feat: export ora2 data to DRF --- lms/djangoapps/instructor/views/api.py | 35 ++++++++++++++------- lms/djangoapps/instructor/views/api_urls.py | 2 +- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/lms/djangoapps/instructor/views/api.py b/lms/djangoapps/instructor/views/api.py index 9176d45eccbd..ecf7dcbdfd31 100644 --- a/lms/djangoapps/instructor/views/api.py +++ b/lms/djangoapps/instructor/views/api.py @@ -2705,22 +2705,33 @@ def list_financial_report_downloads(_request, course_id): return JsonResponse(response_payload) -@transaction.non_atomic_requests -@require_POST -@ensure_csrf_cookie -@cache_control(no_cache=True, no_store=True, must_revalidate=True) -@require_course_permission(permissions.CAN_RESEARCH) -@common_exceptions_400 -def export_ora2_data(request, course_id): +@method_decorator(transaction.non_atomic_requests, name='dispatch') +class ExportOra2DataView(DeveloperErrorViewMixin, APIView): """ Pushes a Celery task which will aggregate ora2 responses for a course into a .csv """ - course_key = CourseKey.from_string(course_id) - report_type = _('ORA data') - task_api.submit_export_ora2_data(request, course_key) - success_status = SUCCESS_MESSAGE_TEMPLATE.format(report_type=report_type) + permission_classes = (IsAuthenticated, permissions.InstructorPermission) + permission_name = permissions.CAN_RESEARCH - return JsonResponse({"status": success_status}) + @method_decorator(cache_control(no_cache=True, no_store=True, must_revalidate=True)) + @method_decorator(ensure_csrf_cookie) + def post(self, request, course_id): + """ + Initiates a task to export Open Response Assessment (ORA) data for a course. + + Args: + request: The HTTP request object + course_id: The ID of the course for which to export ORA data + + Returns: + Response: A JSON response containing the status message indicating the task has been initiated + """ + course_key = CourseKey.from_string(course_id) + report_type = _('ORA data') + task_api.submit_export_ora2_data(request, course_key) + success_status = SUCCESS_MESSAGE_TEMPLATE.format(report_type=report_type) + + return Response({"status": success_status}) @transaction.non_atomic_requests diff --git a/lms/djangoapps/instructor/views/api_urls.py b/lms/djangoapps/instructor/views/api_urls.py index 01bfbd5fab64..4f1b50edb20d 100644 --- a/lms/djangoapps/instructor/views/api_urls.py +++ b/lms/djangoapps/instructor/views/api_urls.py @@ -66,7 +66,7 @@ # Reports.. path('get_course_survey_results', api.GetCourseSurveyResults.as_view(), name='get_course_survey_results'), - path('export_ora2_data', api.export_ora2_data, name='export_ora2_data'), + path('export_ora2_data', api.ExportOra2DataView.as_view(), name='export_ora2_data'), path('export_ora2_summary', api.export_ora2_summary, name='export_ora2_summary'), path('export_ora2_submission_files', api.export_ora2_submission_files, From 5113c927f3a33c000ad3e3ab57c0c04bd3f47f93 Mon Sep 17 00:00:00 2001 From: Talha Date: Wed, 4 Jun 2025 16:26:05 +0500 Subject: [PATCH 2/2] fix: updated view to fix failing test --- lms/djangoapps/instructor/views/api.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lms/djangoapps/instructor/views/api.py b/lms/djangoapps/instructor/views/api.py index fe353d54a8bc..a710398a0fe7 100644 --- a/lms/djangoapps/instructor/views/api.py +++ b/lms/djangoapps/instructor/views/api.py @@ -2733,10 +2733,13 @@ def post(self, request, course_id): """ course_key = CourseKey.from_string(course_id) report_type = _('ORA data') - task_api.submit_export_ora2_data(request, course_key) - success_status = SUCCESS_MESSAGE_TEMPLATE.format(report_type=report_type) - return Response({"status": success_status}) + try: + task_api.submit_export_ora2_data(request, course_key) + success_status = SUCCESS_MESSAGE_TEMPLATE.format(report_type=report_type) + return Response({"status": success_status}) + except (AlreadyRunningError, QueueConnectionError, AttributeError) as err: + return JsonResponse({"error": str(err)}, status=400) @transaction.non_atomic_requests