diff --git a/cms/djangoapps/cms_user_tasks/tasks.py b/cms/djangoapps/cms_user_tasks/tasks.py index 521d65746f6..e06c58b6f08 100644 --- a/cms/djangoapps/cms_user_tasks/tasks.py +++ b/cms/djangoapps/cms_user_tasks/tasks.py @@ -3,7 +3,7 @@ """ import json -from boto.exception import NoAuthHandlerFound +import botocore from celery import shared_task from celery.exceptions import MaxRetriesExceededError from celery.utils.log import get_task_logger @@ -52,7 +52,7 @@ def send_task_complete_email(self, task_name, task_state_text, dest_addr, detail try: mail.send_mail(subject, message, from_address, [dest_addr], fail_silently=False) LOGGER.info("Task complete email has been sent to User %s", dest_addr) - except NoAuthHandlerFound: + except botocore.exceptions.ClientError: LOGGER.info( 'Retrying sending email to user %s, attempt # %s of %s', dest_addr, diff --git a/cms/djangoapps/cms_user_tasks/tests.py b/cms/djangoapps/cms_user_tasks/tests.py index 77afca6a2c9..f50e5002fef 100644 --- a/cms/djangoapps/cms_user_tasks/tests.py +++ b/cms/djangoapps/cms_user_tasks/tests.py @@ -7,8 +7,8 @@ from unittest.mock import patch from uuid import uuid4 +import botocore import ddt -from boto.exception import NoAuthHandlerFound from django.conf import settings from django.core import mail from django.test import override_settings @@ -303,7 +303,9 @@ def test_email_retries(self): Make sure we can succeed on retries """ with mock.patch('django.core.mail.send_mail') as mock_exception: - mock_exception.side_effect = NoAuthHandlerFound() + mock_exception.side_effect = botocore.exceptions.ClientError( + {'error_response': 'error occurred'}, {'operation_name': 'test'} + ) with mock.patch('cms.djangoapps.cms_user_tasks.tasks.send_task_complete_email.retry') as mock_retry: user_task_stopped.send(sender=UserTaskStatus, status=self.status) @@ -315,7 +317,9 @@ def test_queue_email_failure(self): logger.addHandler(hdlr) with mock.patch('cms.djangoapps.cms_user_tasks.tasks.send_task_complete_email.delay') as mock_delay: - mock_delay.side_effect = NoAuthHandlerFound() + mock_delay.side_effect = botocore.exceptions.ClientError( + {'error_response': 'error occurred'}, {'operation_name': 'test'} + ) user_task_stopped.send(sender=UserTaskStatus, status=self.status) self.assertTrue(mock_delay.called) self.assertEqual(hdlr.messages['error'][0], 'Unable to queue send_task_complete_email') diff --git a/cms/djangoapps/contentstore/storage.py b/cms/djangoapps/contentstore/storage.py index f3a04fbd214..9719d052b89 100644 --- a/cms/djangoapps/contentstore/storage.py +++ b/cms/djangoapps/contentstore/storage.py @@ -5,11 +5,11 @@ from django.conf import settings from django.core.files.storage import get_storage_class -from storages.backends.s3boto import S3BotoStorage +from storages.backends.s3boto3 import S3Boto3Storage from storages.utils import setting -class ImportExportS3Storage(S3BotoStorage): # pylint: disable=abstract-method +class ImportExportS3Storage(S3Boto3Storage): # pylint: disable=abstract-method """ S3 backend for course import and export OLX files. """ diff --git a/cms/djangoapps/export_course_metadata/storage.py b/cms/djangoapps/export_course_metadata/storage.py index d010dd7bd2d..02a78e4a9c0 100644 --- a/cms/djangoapps/export_course_metadata/storage.py +++ b/cms/djangoapps/export_course_metadata/storage.py @@ -5,10 +5,10 @@ from django.conf import settings from django.core.files.storage import get_storage_class -from storages.backends.s3boto import S3BotoStorage +from storages.backends.s3boto3 import S3Boto3Storage -class CourseMetadataExportS3Storage(S3BotoStorage): # pylint: disable=abstract-method +class CourseMetadataExportS3Storage(S3Boto3Storage): # pylint: disable=abstract-method """ S3 backend for course metadata export """ diff --git a/cms/djangoapps/export_course_metadata/tasks.py b/cms/djangoapps/export_course_metadata/tasks.py index 2fb33cd0e84..63974efb0fd 100644 --- a/cms/djangoapps/export_course_metadata/tasks.py +++ b/cms/djangoapps/export_course_metadata/tasks.py @@ -29,5 +29,5 @@ def export_course_metadata_task(self, course_key_string): # pylint: disable=unu """ course_key = CourseKey.from_string(course_key_string) highlights = get_all_course_highlights(course_key) - highlights_content = ContentFile(json.dumps({'highlights': highlights})) + highlights_content = ContentFile(json.dumps({'highlights': highlights}).encode('utf-8')) course_metadata_export_storage.save(f'course_metadata_export/{course_key}.json', highlights_content) diff --git a/cms/djangoapps/export_course_metadata/test_signals.py b/cms/djangoapps/export_course_metadata/test_signals.py index 91417901443..5e71887f2b8 100644 --- a/cms/djangoapps/export_course_metadata/test_signals.py +++ b/cms/djangoapps/export_course_metadata/test_signals.py @@ -48,7 +48,7 @@ def test_happy_path(self, patched_content, patched_storage): SignalHandler.course_published.connect(export_course_metadata) SignalHandler.course_published.send(sender=None, course_key=self.course_key) patched_content.assert_called_once_with( - '{"highlights": [["week1highlight1", "week1highlight2"], ["week1highlight1", "week1highlight2"], [], []]}' + b'{"highlights": [["week1highlight1", "week1highlight2"], ["week1highlight1", "week1highlight2"], [], []]}' ) patched_storage.save.assert_called_once_with( f'course_metadata_export/{self.course_key}.json', patched_content.return_value