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( ( {