diff --git a/lms/djangoapps/instructor/views/api.py b/lms/djangoapps/instructor/views/api.py index a710398a0f..9b2cfda1fa 100644 --- a/lms/djangoapps/instructor/views/api.py +++ b/lms/djangoapps/instructor/views/api.py @@ -2742,22 +2742,35 @@ class ExportOra2DataView(DeveloperErrorViewMixin, APIView): return JsonResponse({"error": str(err)}, status=400) -@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_summary(request, course_id): +@method_decorator(transaction.non_atomic_requests, name='dispatch') +class ExportOra2SummaryView(DeveloperErrorViewMixin, APIView): """ - Pushes a Celery task which will aggregate a summary students' progress in ora2 tasks for a course into a .csv + Pushes a Celery task which will aggregate a summary of students' progress in ora2 tasks for a course into a .csv """ - course_key = CourseKey.from_string(course_id) - report_type = _('ORA summary') - task_api.submit_export_ora2_summary(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(ensure_csrf_cookie) + @method_decorator(cache_control(no_cache=True, no_store=True, must_revalidate=True)) + def post(self, request, course_id): + """ + Initiates a Celery task to generate an ORA summary report for the specified course. + + Args: + request: The HTTP request object + course_id: The string representation of the course key + + Returns: + Response: A JSON response with a status message indicating the report generation has started + """ + course_key = CourseKey.from_string(course_id) + report_type = _('ORA summary') + try: + task_api.submit_export_ora2_summary(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 diff --git a/lms/djangoapps/instructor/views/api_urls.py b/lms/djangoapps/instructor/views/api_urls.py index ed4cc95b8b..1415541893 100644 --- a/lms/djangoapps/instructor/views/api_urls.py +++ b/lms/djangoapps/instructor/views/api_urls.py @@ -67,7 +67,7 @@ urlpatterns = [ # Reports.. path('get_course_survey_results', api.GetCourseSurveyResults.as_view(), name='get_course_survey_results'), 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_summary', api.ExportOra2SummaryView.as_view(), name='export_ora2_summary'), path('export_ora2_submission_files', api.export_ora2_submission_files, name='export_ora2_submission_files'),