From 42aaaec762a27b5e5b45cb0c0a1cab7c035126f8 Mon Sep 17 00:00:00 2001 From: Aditya Bhalsod Date: Thu, 27 Aug 2026 14:16:24 +0000 Subject: [PATCH] feat: return 200 when a transcript upload replaces an existing language upload_transcript returned 201 for both create and replace. The Studio videos-page transcript editor (openedx/frontend-app-authoring#) saves edits by re-uploading the SRT through this endpoint and needs to distinguish the two, so replacing an existing language's transcript now returns 200 while first-time uploads keep returning 201. This mirrors the membership check validate_transcript_upload_data already performs in this module, and adds a test covering the new response-code path. --- .../transcript_storage_handlers.py | 5 +++- .../views/tests/test_transcript_settings.py | 25 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/cms/djangoapps/contentstore/transcript_storage_handlers.py b/cms/djangoapps/contentstore/transcript_storage_handlers.py index 0c8dc37faa0e..20cc5e30ee81 100644 --- a/cms/djangoapps/contentstore/transcript_storage_handlers.py +++ b/cms/djangoapps/contentstore/transcript_storage_handlers.py @@ -184,6 +184,9 @@ def upload_transcript(request): new_language_code = request.POST['new_language_code'] transcript_file = request.FILES['file'] try: + # Determine whether this upload replaces an existing transcript + # (return 200) or creates a new one (return 201). + is_replace = new_language_code in get_available_transcript_languages(video_id=edx_video_id) # Convert SRT transcript into an SJSON format # and upload it to S3. sjson_subs = Transcript.convert( @@ -201,7 +204,7 @@ def upload_transcript(request): }, file_data=ContentFile(sjson_subs), ) - response = JsonResponse(status=201) + response = JsonResponse(status=200 if is_replace else 201) except (TranscriptsGenerationException, UnicodeDecodeError): LOGGER.error("Unable to update transcript on edX video %s for language %s", edx_video_id, new_language_code) response = JsonResponse( diff --git a/cms/djangoapps/contentstore/views/tests/test_transcript_settings.py b/cms/djangoapps/contentstore/views/tests/test_transcript_settings.py index 915c065ea731..da18536a5fc6 100644 --- a/cms/djangoapps/contentstore/views/tests/test_transcript_settings.py +++ b/cms/djangoapps/contentstore/views/tests/test_transcript_settings.py @@ -339,6 +339,31 @@ def test_transcript_upload_handler(self, mock_create_or_update_video_transcript) file_data=ANY, ) + @patch('cms.djangoapps.contentstore.transcript_storage_handlers.create_or_update_video_transcript') + @patch( + 'cms.djangoapps.contentstore.transcript_storage_handlers.get_available_transcript_languages', + Mock(return_value=['en']), + ) + def test_transcript_upload_handler_returns_200_on_replace(self, mock_create_or_update_video_transcript): + """ + Verify that uploading a transcript for a language that already has a + transcript returns 200 (replace) instead of 201 (create). + """ + transcript_file_stream = StringIO('0\n00:00:00,010 --> 00:00:00,100\nHello, edX greets you.\n\n') + response = self.client.post( + self.view_url, + { + 'edx_video_id': '123', + 'language_code': 'en', + 'new_language_code': 'en', + 'file': transcript_file_stream, + }, + format='multipart' + ) + + self.assertEqual(response.status_code, 200) # noqa: PT009 + mock_create_or_update_video_transcript.assert_called_once() + @ddt.data( ( {