diff --git a/openedx/core/djangoapps/ace_common/templatetags/ace.py b/openedx/core/djangoapps/ace_common/templatetags/ace.py
index 71deeb9a4ec8d97cd8fa112067f0ac9a85edcba7..287b8a432f37b9d8a92580912408092327c564a7 100644
--- a/openedx/core/djangoapps/ace_common/templatetags/ace.py
+++ b/openedx/core/djangoapps/ace_common/templatetags/ace.py
@@ -56,14 +56,14 @@ def _get_variables_from_context(context, tag_name):
 
     if request is None:
         raise template.VariableDoesNotExist(
-            'The {0} template tag requires a "request" to be present in the template context. Consider using '
-            '"emulate_http_request" if you are rendering the template in a celery task.'.format(tag_name)
+            u'The {0} template tag requires a "request" to be present in the template context. Consider using '
+            u'"emulate_http_request" if you are rendering the template in a celery task.'.format(tag_name)
         )
 
     message = context.get('message')
     if message is None:
         raise template.VariableDoesNotExist(
-            'The {0} template tag requires a "message" to be present in the template context.'.format(tag_name)
+            u'The {0} template tag requires a "message" to be present in the template context.'.format(tag_name)
         )
 
     return request.site, request.user, message
@@ -87,7 +87,7 @@ def google_analytics_tracking_pixel(context):
     image_url = _get_google_analytics_tracking_url(context)
     if image_url is not None:
         return mark_safe(
-            HTML('<img src="{0}" alt="" role="presentation" aria-hidden="true" />').format(HTML(image_url))
+            HTML(u'<img src="{0}" alt="" role="presentation" aria-hidden="true" />').format(HTML(image_url))
         )
     else:
         return ''
diff --git a/openedx/core/djangoapps/api_admin/admin.py b/openedx/core/djangoapps/api_admin/admin.py
index 63bdcf4b091a7995ff274e7debe546aa3eafa3a6..4d1822787bb90493a875f32bc91b173876858aa4 100644
--- a/openedx/core/djangoapps/api_admin/admin.py
+++ b/openedx/core/djangoapps/api_admin/admin.py
@@ -6,6 +6,7 @@ from django.urls import reverse
 from django.utils.translation import ugettext as _
 
 from openedx.core.djangoapps.api_admin.models import ApiAccessConfig, ApiAccessRequest
+from openedx.core.djangolib.markup import HTML, Text
 
 
 @admin.register(ApiAccessRequest)
@@ -30,10 +31,10 @@ class ApiAccessRequestAdmin(admin.ModelAdmin):
                 )
             },),
             ('Status', {
-                'description': _(
-                    'Once you have approved this request, go to {catalog_admin_url} to set up a catalog for this user.'
-                ).format(
-                    catalog_admin_url='<a href="{0}">{0}</a>'.format(reverse('api_admin:catalog-search'))
+                'description': Text(_(
+                    u'Once you have approved this request, go to {catalog_admin_url} to set up a catalog for this user.'
+                )).format(
+                    catalog_admin_url=HTML(u'<a href="{0}">{0}</a>').format(reverse('api_admin:catalog-search'))
                 ),
                 'fields': ('status',),
             }),
diff --git a/openedx/core/djangoapps/api_admin/forms.py b/openedx/core/djangoapps/api_admin/forms.py
index 97a45bf9516b609446da538c5330383ec575ae57..796dd009135c075e7120f28133939705de0e29a8 100644
--- a/openedx/core/djangoapps/api_admin/forms.py
+++ b/openedx/core/djangoapps/api_admin/forms.py
@@ -68,7 +68,7 @@ class ViewersField(forms.Field):
                 nonexistent_users.append(username)
         if nonexistent_users:
             raise forms.ValidationError(
-                _('The following users do not exist: {usernames}.').format(usernames=nonexistent_users)
+                _(u'The following users do not exist: {usernames}.').format(usernames=nonexistent_users)
             )
 
 
diff --git a/openedx/core/djangoapps/api_admin/models.py b/openedx/core/djangoapps/api_admin/models.py
index 08631f519eee43bd51d242b3e187929c6bb52285..8efa30796e1218a9fd1615cd5fb184c85428545a 100644
--- a/openedx/core/djangoapps/api_admin/models.py
+++ b/openedx/core/djangoapps/api_admin/models.py
@@ -106,13 +106,13 @@ class ApiAccessRequest(TimeStampedModel):
 
     def approve(self):
         """Approve this request."""
-        log.info('Approving API request from user [%s].', self.user.id)
+        log.info(u'Approving API request from user [%s].', self.user.id)
         self.status = self.APPROVED
         self.save()
 
     def deny(self):
         """Deny this request."""
-        log.info('Denying API request from user [%s].', self.user.id)
+        log.info(u'Denying API request from user [%s].', self.user.id)
         self.status = self.DENIED
         self.save()
 
@@ -161,14 +161,14 @@ def _send_new_pending_email(instance):
     message = render_to_string('api_admin/api_access_request_email_new_request.txt', context)
     try:
         send_mail(
-            _('API access request from {company}').format(company=instance.company_name),
+            _(u'API access request from {company}').format(company=instance.company_name),
             message,
             settings.API_ACCESS_FROM_EMAIL,
             [settings.API_ACCESS_MANAGER_EMAIL],
             fail_silently=False
         )
     except SMTPException:
-        log.exception('Error sending API user notification email for request [%s].', instance.id)
+        log.exception(u'Error sending API user notification email for request [%s].', instance.id)
 
 
 def _send_decision_email(instance):
@@ -204,7 +204,7 @@ def _send_decision_email(instance):
         )
         instance.contacted = True
     except SMTPException:
-        log.exception('Error sending API user notification email for request [%s].', instance.id)
+        log.exception(u'Error sending API user notification email for request [%s].', instance.id)
 
 
 class Catalog(models.Model):
diff --git a/openedx/core/djangoapps/api_admin/tests/test_forms.py b/openedx/core/djangoapps/api_admin/tests/test_forms.py
index 4c4ff65d8c51b4a781692c0eff70023bad66ba5e..f9a27ecf354b2a54876ebb5ea13f2bc8335fd37c 100644
--- a/openedx/core/djangoapps/api_admin/tests/test_forms.py
+++ b/openedx/core/djangoapps/api_admin/tests/test_forms.py
@@ -33,7 +33,7 @@ class ViewersWidgetTest(TestCase):
         """
         dummy_string_value = 'staff, verified'
         input_field_name = 'viewers'
-        expected_widget_html = '<input type="text" name="{input_field_name}" value="{serialized_value}" />'.format(
+        expected_widget_html = u'<input type="text" name="{input_field_name}" value="{serialized_value}" />'.format(
             input_field_name=input_field_name,
             serialized_value=dummy_string_value,
         )
diff --git a/openedx/core/djangoapps/api_admin/tests/test_models.py b/openedx/core/djangoapps/api_admin/tests/test_models.py
index 808c3bc877b3ec9fe500b804e84867d292eba24f..3a7b651f1a0ccc7d6719a1d8dbdd305a1443ca52 100644
--- a/openedx/core/djangoapps/api_admin/tests/test_models.py
+++ b/openedx/core/djangoapps/api_admin/tests/test_models.py
@@ -143,7 +143,7 @@ class ApiAccessRequestSignalTests(TestCase):
 
         # Verify that initial save logs email errors properly
         mock_model_log_exception.assert_called_once_with(
-            'Error sending API user notification email for request [%s].', self.api_access_request.id
+            u'Error sending API user notification email for request [%s].', self.api_access_request.id
         )
         # Verify object saved
         self.assertIsNotNone(self.api_access_request.id)
@@ -153,7 +153,7 @@ class ApiAccessRequestSignalTests(TestCase):
                 self.api_access_request.approve()
         # Verify that updating request status logs email errors properly
         mock_model_log_exception.assert_called_once_with(
-            'Error sending API user notification email for request [%s].', self.api_access_request.id
+            u'Error sending API user notification email for request [%s].', self.api_access_request.id
         )
         # Verify object saved
         self.assertEqual(self.api_access_request.status, ApiAccessRequest.APPROVED)
diff --git a/openedx/core/djangoapps/api_admin/widgets.py b/openedx/core/djangoapps/api_admin/widgets.py
index 0bef4dd37a3d42caf613d8a68953a9f987774d88..25e3392cc029c2cbe4788caa490d49dff5839aee 100644
--- a/openedx/core/djangoapps/api_admin/widgets.py
+++ b/openedx/core/djangoapps/api_admin/widgets.py
@@ -9,6 +9,7 @@ from django.utils.html import format_html
 from django.utils.translation import ugettext as _
 
 from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers
+from openedx.core.djangolib.markup import HTML, Text
 
 
 class TermsOfServiceCheckboxInput(CheckboxInput):
@@ -27,15 +28,15 @@ class TermsOfServiceCheckboxInput(CheckboxInput):
 
         # Translators: link_start and link_end are HTML tags for a link to the terms of service.
         # platform_name is the name of this Open edX installation.
-        label = _(
-            'I, and my organization, accept the {link_start}{platform_name} API Terms of Service{link_end}.'
-        ).format(
+        label = Text(_(
+            u'I, and my organization, accept the {link_start}{platform_name} API Terms of Service{link_end}.'
+        )).format(
             platform_name=configuration_helpers.get_value('PLATFORM_NAME', settings.PLATFORM_NAME),
-            link_start='<a href="{url}" target="_blank">'.format(url=reverse('api_admin:api-tos')),
-            link_end='</a>',
+            link_start=HTML(u'<a href="{url}" target="_blank">').format(url=reverse('api_admin:api-tos')),
+            link_end=HTML('</a>'),
         )
 
-        html = u'<input{{}} /> <label class="tos-checkbox-label" for="{id}">{label}</label>'.format(
+        html = HTML(u'<input{{}} /> <label class="tos-checkbox-label" for="{id}">{label}</label>').format(
             id=final_attrs['id'],
             label=label
         )
diff --git a/openedx/core/djangoapps/auth_exchange/forms.py b/openedx/core/djangoapps/auth_exchange/forms.py
index c39f9642a6215dc5986e87e24c22eeb798f06ce7..6c18e10a69a4db5edbd578a557266ae48ec1792f 100644
--- a/openedx/core/djangoapps/auth_exchange/forms.py
+++ b/openedx/core/djangoapps/auth_exchange/forms.py
@@ -36,7 +36,7 @@ class AccessTokenExchangeForm(ScopeMixin, OAuthForm):
             raise OAuthValidationError(
                 {
                     "error": "invalid_request",
-                    "error_description": "{} is required".format(field_name),
+                    "error_description": u"{} is required".format(field_name),
                 }
             )
         return field_val
@@ -62,7 +62,7 @@ class AccessTokenExchangeForm(ScopeMixin, OAuthForm):
             raise OAuthValidationError(
                 {
                     "error": "invalid_request",
-                    "error_description": "{} is not a supported provider".format(backend.name),
+                    "error_description": u"{} is not a supported provider".format(backend.name),
                 }
             )
 
@@ -75,7 +75,7 @@ class AccessTokenExchangeForm(ScopeMixin, OAuthForm):
             raise OAuthValidationError(
                 {
                     "error": "invalid_client",
-                    "error_description": "{} is not a valid client_id".format(client_id),
+                    "error_description": u"{} is not a valid client_id".format(client_id),
                 }
             )
         if client.client_type not in [provider.constants.PUBLIC, Application.CLIENT_PUBLIC]:
@@ -84,7 +84,7 @@ class AccessTokenExchangeForm(ScopeMixin, OAuthForm):
                     # invalid_client isn't really the right code, but this mirrors
                     # https://github.com/edx/django-oauth2-provider/blob/edx/provider/oauth2/forms.py#L331
                     "error": "invalid_client",
-                    "error_description": "{} is not a public client".format(client_id),
+                    "error_description": u"{} is not a public client".format(client_id),
                 }
             )
         self.cleaned_data["client"] = client
diff --git a/openedx/core/djangoapps/auth_exchange/tests/test_views.py b/openedx/core/djangoapps/auth_exchange/tests/test_views.py
index c757000d0b790213c64fff63648d4fdd3c59035f..8905d7951e5d398e2d313a4a93c59da7e7db891a 100644
--- a/openedx/core/djangoapps/auth_exchange/tests/test_views.py
+++ b/openedx/core/djangoapps/auth_exchange/tests/test_views.py
@@ -181,7 +181,7 @@ class TestLoginWithAccessTokenView(TestCase):
         Calls the login_with_access_token endpoint and verifies the response given the expected values.
         """
         url = reverse("login_with_access_token")
-        response = self.client.post(url, HTTP_AUTHORIZATION="Bearer {0}".format(access_token))
+        response = self.client.post(url, HTTP_AUTHORIZATION=b"Bearer {0}".format(access_token))
         self.assertEqual(response.status_code, expected_status_code)
         if expected_cookie_name:
             self.assertIn(expected_cookie_name, response.cookies)
diff --git a/openedx/core/djangoapps/auth_exchange/tests/utils.py b/openedx/core/djangoapps/auth_exchange/tests/utils.py
index 49f8d1643738364102bfc4f51839f518ee5d8592..db6fa91c1b35f9b1e5e701c609cee04444f26403 100644
--- a/openedx/core/djangoapps/auth_exchange/tests/utils.py
+++ b/openedx/core/djangoapps/auth_exchange/tests/utils.py
@@ -61,7 +61,7 @@ class AccessTokenExchangeTestMixin(ThirdPartyOAuthTestMixin):
         for field in ["access_token", "client_id"]:
             data = dict(self.data)
             del data[field]
-            self._assert_error(data, "invalid_request", "{} is required".format(field))
+            self._assert_error(data, "invalid_request", u"{} is required".format(field))
 
     def test_invalid_client(self):
         self.data["client_id"] = "nonexistent_client"
@@ -77,7 +77,7 @@ class AccessTokenExchangeTestMixin(ThirdPartyOAuthTestMixin):
         self._assert_error(
             self.data,
             "invalid_client",
-            "{}_confidential is not a public client".format(self.client_id),
+            u"{}_confidential is not a public client".format(self.client_id),
         )
 
     def test_inactive_user(self):
diff --git a/openedx/core/djangoapps/bookmarks/tasks.py b/openedx/core/djangoapps/bookmarks/tasks.py
index 172a5c07c183ea6e29489991f7a82201f33f96ff..1b07c4c8fb85c1ae93b050b008e537a2dae98ee6 100644
--- a/openedx/core/djangoapps/bookmarks/tasks.py
+++ b/openedx/core/djangoapps/bookmarks/tasks.py
@@ -152,7 +152,7 @@ def update_xblocks_cache(course_id):
     # Ideally we'd like to accept a CourseLocator; however, CourseLocator is not JSON-serializable (by default) so
     # Celery's delayed tasks fail to start. For this reason, callers should pass the course key as a Unicode string.
     if not isinstance(course_id, basestring):
-        raise ValueError('course_id must be a string. {} is not acceptable.'.format(type(course_id)))
+        raise ValueError(u'course_id must be a string. {} is not acceptable.'.format(type(course_id)))
 
     course_key = CourseKey.from_string(course_id)
     log.info(u'Starting XBlockCaches update for course_key: %s', course_id)
diff --git a/openedx/core/djangoapps/cache_toolbox/middleware.py b/openedx/core/djangoapps/cache_toolbox/middleware.py
index 1bdec1b45ce632a7503fdf30fbdb638297b8a881..e156ef2e7ed4c105fdf78403d149cb5c7bd063e2 100644
--- a/openedx/core/djangoapps/cache_toolbox/middleware.py
+++ b/openedx/core/djangoapps/cache_toolbox/middleware.py
@@ -107,7 +107,7 @@ class CacheBackedAuthenticationMiddleware(AuthenticationMiddleware):
             request.user = User.get_cached(session_user_id)
             if request.user.id != session_user_id:
                 log.error(
-                    "CacheBackedAuthenticationMiddleware cached user '%s' does not match requested user '%s'.",
+                    u"CacheBackedAuthenticationMiddleware cached user '%s' does not match requested user '%s'.",
                     request.user.id,
                     session_user_id,
                 )
diff --git a/openedx/core/djangoapps/catalog/management/commands/cache_programs.py b/openedx/core/djangoapps/catalog/management/commands/cache_programs.py
index 17ed81f2562fe8447341fe63dd6d88fb05174c93..9e83c03a353a2262c16172a410961747e9e54f3b 100644
--- a/openedx/core/djangoapps/catalog/management/commands/cache_programs.py
+++ b/openedx/core/djangoapps/catalog/management/commands/cache_programs.py
@@ -40,7 +40,7 @@ class Command(BaseCommand):
             user = User.objects.get(username=username)
         except User.DoesNotExist:
             logger.exception(
-                'Failed to create API client. Service user {username} does not exist.'.format(username=username)
+                u'Failed to create API client. Service user {username} does not exist.'.format(username=username)
             )
             raise
 
@@ -49,7 +49,7 @@ class Command(BaseCommand):
         for site in Site.objects.all():
             site_config = getattr(site, 'configuration', None)
             if site_config is None or not site_config.get_value('COURSE_CATALOG_API_URL'):
-                logger.info('Skipping site {domain}. No configuration.'.format(domain=site.domain))
+                logger.info(u'Skipping site {domain}. No configuration.'.format(domain=site.domain))
                 cache.set(SITE_PROGRAM_UUIDS_CACHE_KEY_TPL.format(domain=site.domain), [], None)
                 cache.set(SITE_PATHWAY_IDS_CACHE_KEY_TPL.format(domain=site.domain), [], None)
                 continue
@@ -67,26 +67,26 @@ class Command(BaseCommand):
             programs.update(new_programs)
             pathways.update(new_pathways)
 
-            logger.info('Caching UUIDs for {total} programs for site {site_name}.'.format(
+            logger.info(u'Caching UUIDs for {total} programs for site {site_name}.'.format(
                 total=len(uuids),
                 site_name=site.domain,
             ))
             cache.set(SITE_PROGRAM_UUIDS_CACHE_KEY_TPL.format(domain=site.domain), uuids, None)
 
             pathway_ids = new_pathways.keys()
-            logger.info('Caching ids for {total} pathways for site {site_name}.'.format(
+            logger.info(u'Caching ids for {total} pathways for site {site_name}.'.format(
                 total=len(pathway_ids),
                 site_name=site.domain,
             ))
             cache.set(SITE_PATHWAY_IDS_CACHE_KEY_TPL.format(domain=site.domain), pathway_ids, None)
 
         successful_programs = len(programs)
-        logger.info('Caching details for {successful_programs} programs.'.format(
+        logger.info(u'Caching details for {successful_programs} programs.'.format(
             successful_programs=successful_programs))
         cache.set_many(programs, None)
 
         successful_pathways = len(pathways)
-        logger.info('Caching details for {successful_pathways} pathways.'.format(
+        logger.info(u'Caching details for {successful_pathways} pathways.'.format(
             successful_pathways=successful_pathways))
         cache.set_many(pathways, None)
 
@@ -105,13 +105,13 @@ class Command(BaseCommand):
                 'uuids_only': 1,
             }
 
-            logger.info('Requesting program UUIDs for {domain}.'.format(domain=site.domain))
+            logger.info(u'Requesting program UUIDs for {domain}.'.format(domain=site.domain))
             uuids = client.programs.get(**querystring)
         except:  # pylint: disable=bare-except
-            logger.exception('Failed to retrieve program UUIDs for site: {domain}.'.format(domain=site.domain))
+            logger.exception(u'Failed to retrieve program UUIDs for site: {domain}.'.format(domain=site.domain))
             failure = True
 
-        logger.info('Received {total} UUIDs for site {domain}'.format(
+        logger.info(u'Received {total} UUIDs for site {domain}'.format(
             total=len(uuids),
             domain=site.domain
         ))
@@ -123,13 +123,13 @@ class Command(BaseCommand):
         for uuid in uuids:
             try:
                 cache_key = PROGRAM_CACHE_KEY_TPL.format(uuid=uuid)
-                logger.info('Requesting details for program {uuid}.'.format(uuid=uuid))
+                logger.info(u'Requesting details for program {uuid}.'.format(uuid=uuid))
                 program = client.programs(uuid).get(exclude_utm=1)
                 # pathways get added in process_pathways
                 program['pathway_ids'] = []
                 programs[cache_key] = program
             except:  # pylint: disable=bare-except
-                logger.exception('Failed to retrieve details for program {uuid}.'.format(uuid=uuid))
+                logger.exception(u'Failed to retrieve details for program {uuid}.'.format(uuid=uuid))
                 failure = True
                 continue
         return programs, failure
@@ -140,7 +140,7 @@ class Command(BaseCommand):
         """
         pathways = []
         failure = False
-        logger.info('Requesting pathways for {domain}.'.format(domain=site.domain))
+        logger.info(u'Requesting pathways for {domain}.'.format(domain=site.domain))
         try:
             next_page = 1
             while next_page:
@@ -150,11 +150,11 @@ class Command(BaseCommand):
 
         except:  # pylint: disable=bare-except
             logger.exception(
-                msg='Failed to retrieve pathways for site: {domain}.'.format(domain=site.domain),
+                msg=u'Failed to retrieve pathways for site: {domain}.'.format(domain=site.domain),
             )
             failure = True
 
-        logger.info('Received {total} pathways for site {domain}'.format(
+        logger.info(u'Received {total} pathways for site {domain}'.format(
             total=len(pathways),
             domain=site.domain
         ))
@@ -185,6 +185,6 @@ class Command(BaseCommand):
                 del pathway['programs']
                 pathway['program_uuids'] = uuids
             except:  # pylint: disable=bare-except
-                logger.exception('Failed to process pathways for {domain}'.format(domain=site.domain))
+                logger.exception(u'Failed to process pathways for {domain}'.format(domain=site.domain))
                 failure = True
         return processed_pathways, programs, failure
diff --git a/openedx/core/djangoapps/catalog/management/commands/create_catalog_integrations.py b/openedx/core/djangoapps/catalog/management/commands/create_catalog_integrations.py
index b4f23a9dd6bbca599314819e554494ecf7eb6676..f85b3e2ece5cbe16efc2bba66dd41abc383539c5 100644
--- a/openedx/core/djangoapps/catalog/management/commands/create_catalog_integrations.py
+++ b/openedx/core/djangoapps/catalog/management/commands/create_catalog_integrations.py
@@ -65,10 +65,10 @@ class Command(BaseCommand):
                 page_size=page_size
             )
         except Exception as err:
-            raise CommandError('Error creating CatalogIntegration: {}'.format(err))
+            raise CommandError(u'Error creating CatalogIntegration: {}'.format(err))
 
         self.stdout.write(self.style.SUCCESS(
-            'Successfully created CatalogIntegration enabled={} url={} service_username={}').format(
+            u'Successfully created CatalogIntegration enabled={} url={} service_username={}').format(
                 catalog_integration.enabled,
                 catalog_integration.internal_api_url,
                 catalog_integration.service_username
diff --git a/openedx/core/djangoapps/catalog/management/commands/sync_course_runs.py b/openedx/core/djangoapps/catalog/management/commands/sync_course_runs.py
index ea2540cabebba7b32fed9ddb26102987db5ab020..86ae6540a72c362e5cbe62b7c740b15a01f9acb4 100644
--- a/openedx/core/djangoapps/catalog/management/commands/sync_course_runs.py
+++ b/openedx/core/djangoapps/catalog/management/commands/sync_course_runs.py
@@ -42,7 +42,7 @@ class Command(BaseCommand):
                 num_runs_found_in_course_overview += 1
             except CourseOverview.DoesNotExist:
                 log.info(
-                    '[sync_course_runs] course overview record not found for course run: %s',
+                    u'[sync_course_runs] course overview record not found for course run: %s',
                     unicode(course_key),
                 )
                 continue
@@ -60,10 +60,10 @@ class Command(BaseCommand):
 
         log.info(
             '[sync_course_runs] '
-            'course runs found in catalog: %d, '
-            'course runs found in course overview: %d, '
-            'course runs not found in course overview: %d, '
-            'course overviews updated: %d',
+            u'course runs found in catalog: %d, '
+            u'course runs found in course overview: %d, '
+            u'course runs not found in course overview: %d, '
+            u'course overviews updated: %d',
             num_runs_found_in_catalog,
             num_runs_found_in_course_overview,
             num_runs_found_in_catalog - num_runs_found_in_course_overview,
diff --git a/openedx/core/djangoapps/catalog/management/commands/tests/test_sync_course_runs.py b/openedx/core/djangoapps/catalog/management/commands/tests/test_sync_course_runs.py
index a8fc43f3d64ef04704863c6c865e96c9a9eb1c6b..b8492bbbe2452fc3bdff0fdd60fb2254ce046b5a 100644
--- a/openedx/core/djangoapps/catalog/management/commands/tests/test_sync_course_runs.py
+++ b/openedx/core/djangoapps/catalog/management/commands/tests/test_sync_course_runs.py
@@ -74,7 +74,7 @@ class TestSyncCourseRunsCommand(ModuleStoreTestCase):
         call_command('sync_course_runs')
 
         mock_log_info.assert_any_call(
-            '[sync_course_runs] course overview record not found for course run: %s',
+            u'[sync_course_runs] course overview record not found for course run: %s',
             nonexistent_course_run['key'],
         )
         updated_marketing_url = CourseOverview.objects.get(id=self.course.id).marketing_url
@@ -88,8 +88,8 @@ class TestSyncCourseRunsCommand(ModuleStoreTestCase):
         def _assert_logs(num_updates):
             mock_log_info.assert_any_call('[sync_course_runs] Fetching course runs from catalog service.')
             mock_log_info.assert_any_call(
-                '[sync_course_runs] course runs found in catalog: %d, course runs found in course overview: %d,'
-                ' course runs not found in course overview: %d, course overviews updated: %d',
+                u'[sync_course_runs] course runs found in catalog: %d, course runs found in course overview: %d,'
+                u' course runs not found in course overview: %d, course overviews updated: %d',
                 3,
                 1,
                 2,
diff --git a/openedx/core/djangoapps/catalog/tests/test_utils.py b/openedx/core/djangoapps/catalog/tests/test_utils.py
index 5b809694e49af3fab05e1c92d165d17c5ef1f284..6122cef7bea79b0739988f592b7a4b90192dd13f 100644
--- a/openedx/core/djangoapps/catalog/tests/test_utils.py
+++ b/openedx/core/djangoapps/catalog/tests/test_utils.py
@@ -74,7 +74,7 @@ class TestGetPrograms(CacheIsolationTestCase):
         # empty list and log a warning.
         self.assertEqual(get_programs(self.site), [])
         mock_warning.assert_called_once_with(
-            'Failed to get program UUIDs from the cache for site {}.'.format(self.site.domain)
+            u'Failed to get program UUIDs from the cache for site {}.'.format(self.site.domain)
         )
         mock_warning.reset_mock()
 
@@ -95,7 +95,7 @@ class TestGetPrograms(CacheIsolationTestCase):
         )
         mock_info.assert_called_with('Failed to get details for 1 programs. Retrying.')
         mock_warning.assert_called_with(
-            'Failed to get details for program {uuid} from the cache.'.format(uuid=programs[2]['uuid'])
+            u'Failed to get details for program {uuid} from the cache.'.format(uuid=programs[2]['uuid'])
         )
         mock_warning.reset_mock()
 
@@ -169,7 +169,7 @@ class TestGetPrograms(CacheIsolationTestCase):
 
         self.assertEqual(get_programs(self.site, uuid=expected_uuid), None)
         mock_warning.assert_called_once_with(
-            'Failed to get details for program {uuid} from the cache.'.format(uuid=expected_uuid)
+            u'Failed to get details for program {uuid} from the cache.'.format(uuid=expected_uuid)
         )
         mock_warning.reset_mock()
 
@@ -226,7 +226,7 @@ class TestGetPathways(CacheIsolationTestCase):
         )
         mock_info.assert_called_with('Failed to get details for 1 pathways. Retrying.')
         mock_warning.assert_called_with(
-            'Failed to get details for credit pathway {id} from the cache.'.format(id=pathways[2]['id'])
+            u'Failed to get details for credit pathway {id} from the cache.'.format(id=pathways[2]['id'])
         )
         mock_warning.reset_mock()
 
@@ -300,7 +300,7 @@ class TestGetPathways(CacheIsolationTestCase):
 
         self.assertEqual(get_pathways(self.site, pathway_id=expected_id), None)
         mock_warning.assert_called_once_with(
-            'Failed to get details for credit pathway {id} from the cache.'.format(id=expected_id)
+            u'Failed to get details for credit pathway {id} from the cache.'.format(id=expected_id)
         )
         mock_warning.reset_mock()
 
@@ -433,7 +433,7 @@ class TestGetCourseRuns(CatalogIntegrationMixin, TestCase):
 
         data = get_course_runs()
         mock_log_error.any_call(
-            'Catalog service user with username [%s] does not exist. Course runs will not be retrieved.',
+            u'Catalog service user with username [%s] does not exist. Course runs will not be retrieved.',
             catalog_integration.service_username,
         )
         self.assertFalse(mock_get_edx_api_data.called)
diff --git a/openedx/core/djangoapps/catalog/utils.py b/openedx/core/djangoapps/catalog/utils.py
index 61e40ce4d08fc918dde31ff5a0706d118f1ed3e3..9fb74c0cf85cded56ddd16d0bfb05912d1ea6090 100644
--- a/openedx/core/djangoapps/catalog/utils.py
+++ b/openedx/core/djangoapps/catalog/utils.py
@@ -58,8 +58,8 @@ def check_catalog_integration_and_get_user(error_message_field):
             user = catalog_integration.get_service_user()
         except ObjectDoesNotExist:
             logger.error(
-                'Catalog service user with username [{username}] does not exist. '
-                '{field} will not be retrieved.'.format(
+                u'Catalog service user with username [{username}] does not exist. '
+                u'{field} will not be retrieved.'.format(
                     username=catalog_integration.service_username,
                     field=error_message_field,
                 )
@@ -68,7 +68,7 @@ def check_catalog_integration_and_get_user(error_message_field):
         return user, catalog_integration
     else:
         logger.error(
-            'Unable to retrieve details about {field} because Catalog Integration is not enabled'.format(
+            u'Unable to retrieve details about {field} because Catalog Integration is not enabled'.format(
                 field=error_message_field,
             )
         )
@@ -90,7 +90,7 @@ def get_programs(site, uuid=None):
         list of dict, representing programs.
         dict, if a specific program is requested.
     """
-    missing_details_msg_tpl = 'Failed to get details for program {uuid} from the cache.'
+    missing_details_msg_tpl = u'Failed to get details for program {uuid} from the cache.'
 
     if uuid:
         program = cache.get(PROGRAM_CACHE_KEY_TPL.format(uuid=uuid))
@@ -100,7 +100,7 @@ def get_programs(site, uuid=None):
         return program
     uuids = cache.get(SITE_PROGRAM_UUIDS_CACHE_KEY_TPL.format(domain=site.domain), [])
     if not uuids:
-        logger.warning('Failed to get program UUIDs from the cache for site {}.'.format(site.domain))
+        logger.warning(u'Failed to get program UUIDs from the cache for site {}.'.format(site.domain))
 
     programs = cache.get_many([PROGRAM_CACHE_KEY_TPL.format(uuid=uuid) for uuid in uuids])
     programs = list(programs.values())
@@ -116,7 +116,7 @@ def get_programs(site, uuid=None):
     missing_uuids = set(uuids) - set(program['uuid'] for program in programs)
     if missing_uuids:
         logger.info(
-            'Failed to get details for {count} programs. Retrying.'.format(count=len(missing_uuids))
+            u'Failed to get details for {count} programs. Retrying.'.format(count=len(missing_uuids))
         )
 
         retried_programs = cache.get_many([PROGRAM_CACHE_KEY_TPL.format(uuid=uuid) for uuid in missing_uuids])
@@ -171,7 +171,7 @@ def get_pathways(site, pathway_id=None):
         list of dict, representing pathways.
         dict, if a specific pathway is requested.
     """
-    missing_details_msg_tpl = 'Failed to get details for credit pathway {id} from the cache.'
+    missing_details_msg_tpl = u'Failed to get details for credit pathway {id} from the cache.'
 
     if pathway_id:
         pathway = cache.get(PATHWAY_CACHE_KEY_TPL.format(id=pathway_id))
@@ -197,7 +197,7 @@ def get_pathways(site, pathway_id=None):
     missing_ids = set(pathway_ids) - set(pathway['id'] for pathway in pathways)
     if missing_ids:
         logger.info(
-            'Failed to get details for {count} pathways. Retrying.'.format(count=len(missing_ids))
+            u'Failed to get details for {count} pathways. Retrying.'.format(count=len(missing_ids))
         )
 
         retried_pathways = cache.get_many(
@@ -240,8 +240,8 @@ def format_price(price, symbol='$', code='USD'):
     :return: A formatted price string, i.e. '$10 USD', '$10.52 USD'.
     """
     if int(price) == price:
-        return '{}{} {}'.format(symbol, int(price), code)
-    return '{}{:0.2f} {}'.format(symbol, price, code)
+        return u'{}{} {}'.format(symbol, int(price), code)
+    return u'{}{:0.2f} {}'.format(symbol, price, code)
 
 
 def get_localized_price_text(price, request):
@@ -506,7 +506,7 @@ def get_course_run_details(course_run_key, fields):
     """
     course_run_details = dict()
     user, catalog_integration = check_catalog_integration_and_get_user(
-        error_message_field='Data for course_run {}'.format(course_run_key)
+        error_message_field=u'Data for course_run {}'.format(course_run_key)
     )
     if user:
         api = create_catalog_api_client(user)
diff --git a/openedx/core/djangoapps/ccxcon/api.py b/openedx/core/djangoapps/ccxcon/api.py
index 43c40c6e80ffa565543bbc75cea0205803068fe4..a1cc05e9a365479190daaf4f26588c45688825af 100644
--- a/openedx/core/djangoapps/ccxcon/api.py
+++ b/openedx/core/djangoapps/ccxcon/api.py
@@ -90,17 +90,17 @@ def course_info_to_ccxcon(course_key):
     try:
         course = get_course_by_id(course_key)
     except Http404:
-        log.error('Master Course with key "%s" not found', unicode(course_key))
+        log.error(u'Master Course with key "%s" not found', unicode(course_key))
         return
     if not course.enable_ccx:
-        log.debug('ccx not enabled for course key "%s"', unicode(course_key))
+        log.debug(u'ccx not enabled for course key "%s"', unicode(course_key))
         return
     if not course.ccx_connector:
-        log.debug('ccx connector not defined for course key "%s"', unicode(course_key))
+        log.debug(u'ccx connector not defined for course key "%s"', unicode(course_key))
         return
     if not is_valid_url(course.ccx_connector):
         log.error(
-            'ccx connector URL "%s" for course key "%s" is not a valid URL.',
+            u'ccx connector URL "%s" for course key "%s" is not a valid URL.',
             course.ccx_connector, unicode(course_key)
         )
         return
@@ -108,7 +108,7 @@ def course_info_to_ccxcon(course_key):
     try:
         ccxcon = CCXCon.objects.get(url=course.ccx_connector)
     except CCXCon.DoesNotExist:
-        log.error('ccx connector Oauth credentials not configured for URL "%s".', course.ccx_connector)
+        log.error(u'ccx connector Oauth credentials not configured for URL "%s".', course.ccx_connector)
         return
 
     # get an oauth client with a valid token
@@ -147,11 +147,11 @@ def course_info_to_ccxcon(course_key):
     )
 
     if resp.status_code >= 500:
-        raise CCXConnServerError('Server returned error Status: %s, Content: %s', resp.status_code, resp.content)
+        raise CCXConnServerError(u'Server returned error Status: %s, Content: %s', resp.status_code, resp.content)
     if resp.status_code >= 400:
-        log.error("Error creating course on ccxcon. Status: %s, Content: %s", resp.status_code, resp.content)
+        log.error(u"Error creating course on ccxcon. Status: %s, Content: %s", resp.status_code, resp.content)
     # this API performs a POST request both for POST and PATCH, but the POST returns 201 and the PATCH returns 200
     elif resp.status_code != HTTP_200_OK and resp.status_code != HTTP_201_CREATED:
-        log.error('Server returned unexpected status code %s', resp.status_code)
+        log.error(u'Server returned unexpected status code %s', resp.status_code)
     else:
-        log.debug('Request successful. Status: %s, Content: %s', resp.status_code, resp.content)
+        log.debug(u'Request successful. Status: %s, Content: %s', resp.status_code, resp.content)
diff --git a/openedx/core/djangoapps/ccxcon/tasks.py b/openedx/core/djangoapps/ccxcon/tasks.py
index 6dc52829dbf147aaff90ca6eba3e036a63f35238..6822d6758420f6fea00d5f53d6741b3f08977dbc 100644
--- a/openedx/core/djangoapps/ccxcon/tasks.py
+++ b/openedx/core/djangoapps/ccxcon/tasks.py
@@ -25,9 +25,9 @@ def update_ccxcon(course_id, cur_retry=0):
     course_key = CourseKey.from_string(course_id)
     try:
         api.course_info_to_ccxcon(course_key)
-        log.info('Course update to CCXCon returned no errors. Course key: %s', course_id)
+        log.info(u'Course update to CCXCon returned no errors. Course key: %s', course_id)
     except (ConnectionError, HTTPError, RequestException, TooManyRedirects, api.CCXConnServerError) as exp:
-        log.error('Course update to CCXCon failed for course_id %s with error: %s', course_id, exp)
+        log.error(u'Course update to CCXCon failed for course_id %s with error: %s', course_id, exp)
         # in case the maximum amount of retries has not been reached,
         # insert another task delayed exponentially up to 5 retries
         if cur_retry < 5:
@@ -35,4 +35,4 @@ def update_ccxcon(course_id, cur_retry=0):
                 kwargs={'course_id': course_id, 'cur_retry': cur_retry + 1},
                 countdown=10 ** cur_retry  # number of seconds the task should be delayed
             )
-            log.info('Requeued celery task for course key %s ; retry # %s', course_id, cur_retry + 1)
+            log.info(u'Requeued celery task for course key %s ; retry # %s', course_id, cur_retry + 1)
diff --git a/openedx/core/djangoapps/content/block_structure/block_structure.py b/openedx/core/djangoapps/content/block_structure/block_structure.py
index 5d74fd20499a37d0ba8cd8a9758ba51b793d0ce7..43839c9718e045e2414f77ad5ee5757a3c411800 100644
--- a/openedx/core/djangoapps/content/block_structure/block_structure.py
+++ b/openedx/core/djangoapps/content/block_structure/block_structure.py
@@ -300,7 +300,7 @@ class FieldData(object):
         try:
             return self.fields[field_name]
         except KeyError:
-            raise AttributeError("Field {0} does not exist".format(field_name))
+            raise AttributeError(u"Field {0} does not exist".format(field_name))
 
     def __setattr__(self, field_name, field_value):
         if self._is_own_field(field_name):
@@ -747,7 +747,7 @@ class BlockStructureBlockData(BlockStructure):
         its current version number.
         """
         if transformer.WRITE_VERSION == 0:
-            raise TransformerException('Version attributes are not set on transformer {0}.', transformer.name())
+            raise TransformerException(u'Version attributes are not set on transformer {0}.', transformer.name())
         self.set_transformer_data(transformer, TRANSFORMER_VERSION_KEY, transformer.WRITE_VERSION)
 
     def _get_or_create_block(self, usage_key):
diff --git a/openedx/core/djangoapps/content/block_structure/exceptions.py b/openedx/core/djangoapps/content/block_structure/exceptions.py
index 8e78805530870b3503274b2d782e98ce6f134016..750ac7a8f0431dd574395b9056248fad8105383b 100644
--- a/openedx/core/djangoapps/content/block_structure/exceptions.py
+++ b/openedx/core/djangoapps/content/block_structure/exceptions.py
@@ -38,5 +38,5 @@ class BlockStructureNotFound(BlockStructureException):
     """
     def __init__(self, root_block_usage_key):
         super(BlockStructureNotFound, self).__init__(
-            'Block structure not found; data_usage_key: {}'.format(root_block_usage_key)
+            u'Block structure not found; data_usage_key: {}'.format(root_block_usage_key)
         )
diff --git a/openedx/core/djangoapps/content/block_structure/manager.py b/openedx/core/djangoapps/content/block_structure/manager.py
index 9ed40525cce2dfe3498b0a8bba14412d3ec70e91..4e2052e97bd46da36d08a0b37ec9580f7e8b245d 100644
--- a/openedx/core/djangoapps/content/block_structure/manager.py
+++ b/openedx/core/djangoapps/content/block_structure/manager.py
@@ -68,7 +68,7 @@ class BlockStructureManager(object):
             # as part of the transformation.
             if starting_block_usage_key not in block_structure:
                 raise UsageKeyNotInBlockStructure(
-                    "The requested usage_key '{0}' is not found in the block_structure with root '{1}'",
+                    u"The requested usage_key '{0}' is not found in the block_structure with root '{1}'",
                     unicode(starting_block_usage_key),
                     unicode(self.root_block_usage_key),
                 )
diff --git a/openedx/core/djangoapps/content/block_structure/store.py b/openedx/core/djangoapps/content/block_structure/store.py
index 959a2fb11cc9d7dc312b697745b1068170dd7af7..0ea0d1dcad817447937637bedda3499f78a0f3ee 100644
--- a/openedx/core/djangoapps/content/block_structure/store.py
+++ b/openedx/core/djangoapps/content/block_structure/store.py
@@ -109,7 +109,7 @@ class BlockStructureStore(object):
         bs_model = self._get_model(root_block_usage_key)
         self._cache.delete(self._encode_root_cache_key(bs_model))
         bs_model.delete()
-        logger.info("BlockStructure: Deleted from cache and store; %s.", bs_model)
+        logger.info(u"BlockStructure: Deleted from cache and store; %s.", bs_model)
 
     def is_up_to_date(self, root_block_usage_key, modulestore):
         """
@@ -158,7 +158,7 @@ class BlockStructureStore(object):
         """
         cache_key = self._encode_root_cache_key(bs_model)
         self._cache.set(cache_key, serialized_data, timeout=config.cache_timeout_in_seconds())
-        logger.info("BlockStructure: Added to cache; %s, size: %d", bs_model, len(serialized_data))
+        logger.info(u"BlockStructure: Added to cache; %s, size: %d", bs_model, len(serialized_data))
 
     def _get_from_cache(self, bs_model):
         """
@@ -171,7 +171,7 @@ class BlockStructureStore(object):
         serialized_data = self._cache.get(cache_key)
 
         if not serialized_data:
-            logger.info("BlockStructure: Not found in cache; %s.", bs_model)
+            logger.info(u"BlockStructure: Not found in cache; %s.", bs_model)
             raise BlockStructureNotFound(bs_model.data_usage_key)
         return serialized_data
 
diff --git a/openedx/core/djangoapps/content/block_structure/tasks.py b/openedx/core/djangoapps/content/block_structure/tasks.py
index c97d0bf700e6a9c01fef15e4f781e7aff417acb1..9c5e91ce8d4a1e9ec248423fe9d6eb90eeb133c3 100644
--- a/openedx/core/djangoapps/content/block_structure/tasks.py
+++ b/openedx/core/djangoapps/content/block_structure/tasks.py
@@ -102,18 +102,18 @@ def _call_and_retry_if_needed(self, api_method, **kwargs):
     except NO_RETRY_TASKS:
         # Known unrecoverable errors
         log.exception(
-            "BlockStructure: %s encountered unrecoverable error in course %s, task_id %s",
+            u"BlockStructure: %s encountered unrecoverable error in course %s, task_id %s",
             self.__name__,
             kwargs.get('course_id'),
             self.request.id,
         )
         raise
     except RETRY_TASKS as exc:
-        log.exception("%s encountered expected error, retrying.", self.__name__)
+        log.exception(u"%s encountered expected error, retrying.", self.__name__)
         raise self.retry(kwargs=kwargs, exc=exc)
     except Exception as exc:
         log.exception(
-            "BlockStructure: %s encountered unknown error in course %s, task_id %s. Retry #%d",
+            u"BlockStructure: %s encountered unknown error in course %s, task_id %s. Retry #%d",
             self.__name__,
             kwargs.get('course_id'),
             self.request.id,
diff --git a/openedx/core/djangoapps/content/block_structure/tests/helpers.py b/openedx/core/djangoapps/content/block_structure/tests/helpers.py
index 83e5b2d666f869c2d2c1b19382bf0df48cba1553..bd37e0c51e9c6a1183adb9f12caba12ea1c17669 100644
--- a/openedx/core/djangoapps/content/block_structure/tests/helpers.py
+++ b/openedx/core/djangoapps/content/block_structure/tests/helpers.py
@@ -303,7 +303,7 @@ class ChildrenMapTestMixin(object):
             self.assertEqual(
                 self.block_key_factory(block_key) in block_structure,
                 block_key not in missing_blocks,
-                'Expected presence in block_structure for block_key {} to match absence in missing_blocks.'.format(
+                u'Expected presence in block_structure for block_key {} to match absence in missing_blocks.'.format(
                     unicode(block_key)
                 ),
             )
diff --git a/openedx/core/djangoapps/content/block_structure/tests/test_store.py b/openedx/core/djangoapps/content/block_structure/tests/test_store.py
index 82feb4b6b7ed81a8b8611448ca306c9e19a473e0..52241cd414dfec9ea24fd3632a59273675e750ed 100644
--- a/openedx/core/djangoapps/content/block_structure/tests/test_store.py
+++ b/openedx/core/djangoapps/content/block_structure/tests/test_store.py
@@ -40,7 +40,7 @@ class TestBlockStructureStore(UsageKeyFactoryMixin, ChildrenMapTestMixin, CacheI
                 self.block_key_factory(0),
                 transformer,
                 key='test',
-                value='{} val'.format(transformer.name()),
+                value=u'{} val'.format(transformer.name()),
             )
 
     @ddt.data(True, False)
diff --git a/openedx/core/djangoapps/content/block_structure/transformers.py b/openedx/core/djangoapps/content/block_structure/transformers.py
index 7c5347c02ef24e35d32ef13288cd3f762d713eb6..aaaf740e7ef13848ea28cb52399dded8347a14b6 100644
--- a/openedx/core/djangoapps/content/block_structure/transformers.py
+++ b/openedx/core/djangoapps/content/block_structure/transformers.py
@@ -60,7 +60,7 @@ class BlockStructureTransformers(object):
         unregistered_transformers = TransformerRegistry.find_unregistered(transformers)
         if unregistered_transformers:
             raise TransformerException(
-                "The following requested transformers are not registered: {}".format(unregistered_transformers)
+                u"The following requested transformers are not registered: {}".format(unregistered_transformers)
             )
 
         for transformer in transformers:
@@ -100,7 +100,7 @@ class BlockStructureTransformers(object):
 
         if outdated_transformers:
             raise TransformerDataIncompatible(
-                "Collected Block Structure data for the following transformers is outdated: '%s'.",
+                u"Collected Block Structure data for the following transformers is outdated: '%s'.",
                 [(transformer.name(), transformer.READ_VERSION) for transformer in outdated_transformers],
             )
         return True
diff --git a/openedx/core/djangoapps/content/course_overviews/management/commands/simulate_publish.py b/openedx/core/djangoapps/content/course_overviews/management/commands/simulate_publish.py
index cd2dd76639dfc62aebb758a42bf64a0a84591a5f..048ec400eb09070b2cbd0202dcfffb7efe792fb5 100644
--- a/openedx/core/djangoapps/content/course_overviews/management/commands/simulate_publish.py
+++ b/openedx/core/djangoapps/content/course_overviews/management/commands/simulate_publish.py
@@ -162,7 +162,7 @@ class Command(BaseCommand):
             return self.print_show_receivers()
 
         log.info(
-            "simulate_publish starting, dry-run=%s, delay=%d seconds",
+            u"simulate_publish starting, dry-run=%s, delay=%d seconds",
             options['dry_run'],
             options['delay']
         )
@@ -172,8 +172,8 @@ class Command(BaseCommand):
                 log.info("Forcing simulate_publish to run in LMS process.")
             else:
                 log.fatal(
-                    "simulate_publish should be run as a CMS (Studio) " +
-                    "command, not %s (override with --force-lms).",
+                    u"simulate_publish should be run as a CMS (Studio) " +
+                    u"command, not %s (override with --force-lms).",  # pylint: disable=unicode-format-string
                     os.environ.get('SERVICE_VARIANT')
                 )
                 sys.exit(1)
@@ -193,7 +193,7 @@ class Command(BaseCommand):
         # actual work of emitting signals.
         for i, course_key in enumerate(course_keys, start=1):
             log.info(
-                "Emitting course_published signal (%d of %d) for course %s",
+                u"Emitting course_published signal (%d of %d) for course %s",
                 i, len(course_keys), course_key
             )
             if options['delay']:
@@ -214,19 +214,19 @@ class Command(BaseCommand):
         unknown_receiver_names = set(receiver_names) - all_receiver_names
         if unknown_receiver_names:
             log.fatal(
-                "The following receivers were specified but not recognized: %s",
-                ", ".join(sorted(unknown_receiver_names))
+                u"The following receivers were specified but not recognized: %s",
+                u", ".join(sorted(unknown_receiver_names))
             )
-            log.fatal("Known receivers: %s", ", ".join(sorted(all_receiver_names)))
+            log.fatal(u"Known receivers: %s", ", ".join(sorted(all_receiver_names)))
             sys.exit(1)
-        log.info("%d receivers specified: %s", len(receiver_names), ", ".join(receiver_names))
+        log.info(u"%d receivers specified: %s", len(receiver_names), ", ".join(receiver_names))
         receiver_names_set = set(receiver_names)
         for receiver_fn in get_receiver_fns():
             if receiver_fn == ccx_receiver_fn and not skip_ccx:
                 continue
             fn_name = name_from_fn(receiver_fn)
             if fn_name not in receiver_names_set:
-                log.info("Disconnecting %s", fn_name)
+                log.info(u"Disconnecting %s", fn_name)
                 self.course_published_signal.disconnect(receiver_fn)
 
     def get_course_keys(self, courses):
@@ -242,12 +242,12 @@ class Command(BaseCommand):
         # Use specific courses if specified, but fall back to all courses.
         course_keys = []
         if courses:
-            log.info("%d courses specified: %s", len(courses), ", ".join(courses))
+            log.info(u"%d courses specified: %s", len(courses), ", ".join(courses))
             for course_id in courses:
                 try:
                     course_keys.append(CourseKey.from_string(course_id))
                 except InvalidKeyError:
-                    log.fatal("%s is not a parseable CourseKey", course_id)
+                    log.fatal(u"%s is not a parseable CourseKey", course_id)
                     sys.exit(1)
         else:
             log.info("No courses specified, reading all courses from modulestore...")
@@ -255,7 +255,7 @@ class Command(BaseCommand):
                 (course.id for course in modulestore().get_course_summaries()),
                 key=unicode  # Different types of CourseKeys can't be compared without this.
             )
-            log.info("%d courses read from modulestore.", len(course_keys))
+            log.info(u"%d courses read from modulestore.", len(course_keys))
 
         return course_keys
 
@@ -284,7 +284,7 @@ class Command(BaseCommand):
         for course_key in course_keys[:COURSES_TO_SHOW]:
             print("   ", course_key)
         if len(course_keys) > COURSES_TO_SHOW:
-            print("    (+ {} more)".format(len(course_keys) - COURSES_TO_SHOW))
+            print(u"    (+ {} more)".format(len(course_keys) - COURSES_TO_SHOW))
 
 
 def get_receiver_names():
diff --git a/openedx/core/djangoapps/content/course_overviews/models.py b/openedx/core/djangoapps/content/course_overviews/models.py
index 6d1998c92f06a29d052b97fa0a22dd641d264d0e..e6f4382f646e8c453a7d29ff1266bd5c914e4904 100644
--- a/openedx/core/djangoapps/content/course_overviews/models.py
+++ b/openedx/core/djangoapps/content/course_overviews/models.py
@@ -147,10 +147,10 @@ class CourseOverview(TimeStampedModel):
 
         course_overview = cls.objects.filter(id=course.id)
         if course_overview.exists():
-            log.info('Updating course overview for %s.', unicode(course.id))
+            log.info(u'Updating course overview for %s.', unicode(course.id))
             course_overview = course_overview.first()
         else:
-            log.info('Creating course overview for %s.', unicode(course.id))
+            log.info(u'Creating course overview for %s.', unicode(course.id))
             course_overview = cls()
 
         course_overview.version = cls.VERSION
@@ -249,7 +249,7 @@ class CourseOverview(TimeStampedModel):
                     pass
                 except Exception:
                     log.exception(
-                        "CourseOverview for course %s failed!",
+                        u"CourseOverview for course %s failed!",
                         course_id,
                     )
                     raise
@@ -257,7 +257,7 @@ class CourseOverview(TimeStampedModel):
                 return course_overview
             elif course is not None:
                 raise IOError(
-                    "Error while loading course {} from the module store: {}",
+                    u"Error while loading course {} from the module store: {}",
                     unicode(course_id),
                     course.error_msg if isinstance(course, ErrorDescriptor) else unicode(course)
                 )
@@ -541,8 +541,8 @@ class CourseOverview(TimeStampedModel):
                 whether the requested CourseOverview objects should be
                 forcefully updated (i.e., re-synched with the modulestore).
         """
-        log.info('Generating course overview for %d courses.', len(course_keys))
-        log.debug('Generating course overview(s) for the following courses: %s', course_keys)
+        log.info(u'Generating course overview for %d courses.', len(course_keys))
+        log.debug(u'Generating course overview(s) for the following courses: %s', course_keys)
 
         action = CourseOverview.load_from_module_store if force_update else CourseOverview.get_from_id
 
@@ -551,7 +551,7 @@ class CourseOverview(TimeStampedModel):
                 action(course_key)
             except Exception as ex:  # pylint: disable=broad-except
                 log.exception(
-                    'An error occurred while generating course overview for %s: %s',
+                    u'An error occurred while generating course overview for %s: %s',
                     unicode(course_key),
                     text_type(ex),
                 )
@@ -818,7 +818,7 @@ class CourseOverviewImageSet(TimeStampedModel):
                 image_set.large_url = create_course_image_thumbnail(course, config.large)
             except Exception:  # pylint: disable=broad-except
                 log.exception(
-                    "Could not create thumbnail for course %s with image %s (small=%s), (large=%s)",
+                    u"Could not create thumbnail for course %s with image %s (small=%s), (large=%s)",
                     course.id,
                     course.course_image,
                     config.small,
diff --git a/openedx/core/djangoapps/content/course_overviews/signals.py b/openedx/core/djangoapps/content/course_overviews/signals.py
index 744adf779c3f979cddfeed7a41a46a4851d64253..f80d92a7774fc851b4f0bc1526f9369bb92f8cd4 100644
--- a/openedx/core/djangoapps/content/course_overviews/signals.py
+++ b/openedx/core/djangoapps/content/course_overviews/signals.py
@@ -63,7 +63,7 @@ def _log_start_date_change(previous_course_overview, updated_course_overview):
     new_start_str = 'None'
     if updated_course_overview.start is not None:
         new_start_str = updated_course_overview.start.isoformat()
-    LOG.info('Course start date changed: course={0} previous={1} new={2}'.format(
+    LOG.info(u'Course start date changed: course={0} previous={1} new={2}'.format(
         updated_course_overview.id,
         previous_start_str,
         new_start_str,
diff --git a/openedx/core/djangoapps/content/course_overviews/tests/test_course_overviews.py b/openedx/core/djangoapps/content/course_overviews/tests/test_course_overviews.py
index 4708b442a1ab4be5ccc946d01281a1467fa8c01c..20c738ceaa133a53619195882df807e3d1c5b93b 100644
--- a/openedx/core/djangoapps/content/course_overviews/tests/test_course_overviews.py
+++ b/openedx/core/djangoapps/content/course_overviews/tests/test_course_overviews.py
@@ -511,7 +511,7 @@ class CourseOverviewTestCase(CatalogIntegrationMixin, ModuleStoreTestCase, Cache
                     CourseOverview.get_all_courses(filter_=filter_)
                 },
                 expected_courses,
-                "testing CourseOverview.get_all_courses with filter_={}"
+                u"testing CourseOverview.get_all_courses with filter_={}"
                 .format(filter_),
             )
 
diff --git a/openedx/core/djangoapps/contentserver/middleware.py b/openedx/core/djangoapps/contentserver/middleware.py
index 7d3b8a50833e3213a73b9ce222e4c2f89cda4a9a..ed587049ce042c99d3bab0e78ce05a01ce47321c 100644
--- a/openedx/core/djangoapps/contentserver/middleware.py
+++ b/openedx/core/djangoapps/contentserver/middleware.py
@@ -30,7 +30,7 @@ from .models import CourseAssetCacheTtlConfig, CdnUserAgentsConfig
 # TODO: Soon as we have a reasonable way to serialize/deserialize AssetKeys, we need
 # to change this file so instead of using course_id_partial, we're just using asset keys
 
-HTTP_DATE_FORMAT = "%a, %d %b %Y %H:%M:%S GMT"
+HTTP_DATE_FORMAT = u"%a, %d %b %Y %H:%M:%S GMT"
 
 
 class StaticContentServer(object):
@@ -152,7 +152,7 @@ class StaticContentServer(object):
                         if 0 <= first <= last < content.length:
                             # If the byte range is satisfiable
                             response = HttpResponse(content.stream_data_in_range(first, last))
-                            response['Content-Range'] = 'bytes {first}-{last}/{length}'.format(
+                            response['Content-Range'] = b'bytes {first}-{last}/{length}'.format(
                                 first=first, last=last, length=content.length
                             )
                             response['Content-Length'] = str(last - first + 1)
@@ -207,7 +207,7 @@ class StaticContentServer(object):
                 newrelic.agent.add_custom_parameter('contentserver.cacheable', True)
 
             response['Expires'] = StaticContentServer.get_expiration_value(datetime.datetime.utcnow(), cache_ttl)
-            response['Cache-Control'] = "public, max-age={ttl}, s-maxage={ttl}".format(ttl=cache_ttl)
+            response['Cache-Control'] = b"public, max-age={ttl}, s-maxage={ttl}".format(ttl=cache_ttl)
         elif is_locked:
             if newrelic:
                 newrelic.agent.add_custom_parameter('contentserver.cacheable', False)
diff --git a/openedx/core/djangoapps/contentserver/test/test_contentserver.py b/openedx/core/djangoapps/contentserver/test/test_contentserver.py
index afe5cdcb8565dc86982b92c7fe45cbab57b13ec7..a2d16aac5d39c71c6b0ce8335998e0a86d4cb3b7 100644
--- a/openedx/core/djangoapps/contentserver/test/test_contentserver.py
+++ b/openedx/core/djangoapps/contentserver/test/test_contentserver.py
@@ -217,7 +217,7 @@ class ContentStoreToyCourseTest(SharedModuleStoreTestCase):
         self.assertEqual(resp.status_code, 206)  # HTTP_206_PARTIAL_CONTENT
         self.assertEqual(
             resp['Content-Range'],
-            'bytes {first}-{last}/{length}'.format(
+            b'bytes {first}-{last}/{length}'.format(
                 first=0, last=self.length_unlocked - 1,
                 length=self.length_unlocked
             )
@@ -236,7 +236,7 @@ class ContentStoreToyCourseTest(SharedModuleStoreTestCase):
             first=first_byte, last=last_byte))
 
         self.assertEqual(resp.status_code, 206)  # HTTP_206_PARTIAL_CONTENT
-        self.assertEqual(resp['Content-Range'], 'bytes {first}-{last}/{length}'.format(
+        self.assertEqual(resp['Content-Range'], b'bytes {first}-{last}/{length}'.format(
             first=first_byte, last=last_byte, length=self.length_unlocked))
         self.assertEqual(resp['Content-Length'], str(last_byte - first_byte + 1))
 
@@ -246,7 +246,7 @@ class ContentStoreToyCourseTest(SharedModuleStoreTestCase):
         """
         first_byte = self.length_unlocked / 4
         last_byte = self.length_unlocked / 2
-        resp = self.client.get(self.url_unlocked, HTTP_RANGE='bytes={first}-{last}, -100'.format(
+        resp = self.client.get(self.url_unlocked, HTTP_RANGE=b'bytes={first}-{last}, -100'.format(
             first=first_byte, last=last_byte))
 
         self.assertEqual(resp.status_code, 200)
diff --git a/openedx/core/djangoapps/cors_csrf/middleware.py b/openedx/core/djangoapps/cors_csrf/middleware.py
index 7478d542874a82df318378c123ddbcb95d355c72..805354e26dcd99cbe65df66d78e8adda2bb809e5 100644
--- a/openedx/core/djangoapps/cors_csrf/middleware.py
+++ b/openedx/core/djangoapps/cors_csrf/middleware.py
@@ -139,7 +139,7 @@ class CsrfCrossDomainCookieMiddleware(object):
                 secure=True
             )
             log.debug(
-                "Set cross-domain CSRF cookie '%s' for domain '%s'",
+                u"Set cross-domain CSRF cookie '%s' for domain '%s'",
                 settings.CROSS_DOMAIN_CSRF_COOKIE_NAME,
                 settings.CROSS_DOMAIN_CSRF_COOKIE_DOMAIN
             )
diff --git a/openedx/core/djangoapps/cors_csrf/models.py b/openedx/core/djangoapps/cors_csrf/models.py
index 02b66ac1afb37d03618569edc5aa127ef1e1a544..44194fb246c2247ac918a48e611aafe9a20932a7 100644
--- a/openedx/core/djangoapps/cors_csrf/models.py
+++ b/openedx/core/djangoapps/cors_csrf/models.py
@@ -14,7 +14,7 @@ class XDomainProxyConfiguration(ConfigurationModel):
     whitelist = models.fields.TextField(
         help_text=_(
             u"List of domains that are allowed to make cross-domain "
-            u"requests to this site.  Please list each domain on its own line."
+            "requests to this site.  Please list each domain on its own line."
         )
     )
 
diff --git a/openedx/core/djangoapps/cors_csrf/tests/test_middleware.py b/openedx/core/djangoapps/cors_csrf/tests/test_middleware.py
index 9c6480ba92c4601d5d291a7583d90176e82a5c60..294cd45b980a3a8b1995cb25c846b5b3ee96169c 100644
--- a/openedx/core/djangoapps/cors_csrf/tests/test_middleware.py
+++ b/openedx/core/djangoapps/cors_csrf/tests/test_middleware.py
@@ -263,7 +263,7 @@ class TestCsrfCrossDomainCookieMiddleware(TestCase):
             self.assertIn(self.COOKIE_NAME, response.cookies)
             cookie_header = str(response.cookies[self.COOKIE_NAME])
 
-            expected = 'Set-Cookie: {name}={value}; Domain={domain};'.format(
+            expected = b'Set-Cookie: {name}={value}; Domain={domain};'.format(
                 name=self.COOKIE_NAME,
                 value=self.COOKIE_VALUE,
                 domain=self.COOKIE_DOMAIN
diff --git a/openedx/core/djangoapps/course_groups/cohorts.py b/openedx/core/djangoapps/course_groups/cohorts.py
index 415a026eb985eecd7f008902f1652783f4098cd4..bc4e63064b3de1e8927efa0012edc38796e168fd 100644
--- a/openedx/core/djangoapps/course_groups/cohorts.py
+++ b/openedx/core/djangoapps/course_groups/cohorts.py
@@ -264,7 +264,7 @@ def get_cohort(user, course_key, assign=True, use_cached=False):
         # create the same row in one of the cohort model entries:
         # CourseCohort, CohortMembership.
         log.info(
-            "HANDLING_INTEGRITY_ERROR: IntegrityError encountered for course '%s' and user '%s': %s",
+            u"HANDLING_INTEGRITY_ERROR: IntegrityError encountered for course '%s' and user '%s': %s",
             course_key, user.id, unicode(integrity_error)
         )
         return get_cohort(user, course_key, assign, use_cached)
@@ -377,7 +377,7 @@ def add_cohort(course_key, name, assignment_type):
     Add a cohort to a course.  Raises ValueError if a cohort of the same name already
     exists.
     """
-    log.debug("Adding cohort %s to %s", name, course_key)
+    log.debug(u"Adding cohort %s to %s", name, course_key)
     if is_cohort_exists(course_key, name):
         raise ValueError(_("You cannot create two cohorts with the same name"))
 
@@ -426,7 +426,7 @@ def remove_user_from_cohort(cohort, username_or_email):
         membership.delete()
         COHORT_MEMBERSHIP_UPDATED.send(sender=None, user=user, course_key=course_key)
     except CohortMembership.DoesNotExist:
-        raise ValueError("User {} was not present in cohort {}".format(username_or_email, cohort))
+        raise ValueError(u"User {} was not present in cohort {}".format(username_or_email, cohort))
 
 
 def add_user_to_cohort(cohort, username_or_email_or_user):
diff --git a/openedx/core/djangoapps/course_groups/models.py b/openedx/core/djangoapps/course_groups/models.py
index 89cdf1986412921f2c227b05741c79c51342ecc9..7bb9a015b2e54f265cac912c00576e83da36ce29 100644
--- a/openedx/core/djangoapps/course_groups/models.py
+++ b/openedx/core/djangoapps/course_groups/models.py
@@ -107,7 +107,7 @@ class CohortMembership(models.Model):
                 membership.course_user_group.users.add(user)
                 previous_cohort = None
             elif membership.course_user_group == cohort:
-                raise ValueError("User {user_name} already present in cohort {cohort_name}".format(
+                raise ValueError(u"User {user_name} already present in cohort {cohort_name}".format(
                     user_name=user.username,
                     cohort_name=cohort.name))
             else:
@@ -122,8 +122,7 @@ class CohortMembership(models.Model):
     def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
         self.full_clean(validate_unique=False)
 
-        log.info("Saving CohortMembership for user '%s' in '%s'", self.user.id, self.course_id)
-
+        log.info(u"Saving CohortMembership for user '%s' in '%s'", self.user.id, self.course_id)
         return super(CohortMembership, self).save(force_insert=force_insert,
                                                   force_update=force_update,
                                                   using=using,
diff --git a/openedx/core/djangoapps/course_groups/partition_scheme.py b/openedx/core/djangoapps/course_groups/partition_scheme.py
index 76f09767550d4295a0c9e6ad0cffc4d07d115bfd..55965a3aeb7dacd0873377cba1c9d1cd37a2264d 100644
--- a/openedx/core/djangoapps/course_groups/partition_scheme.py
+++ b/openedx/core/djangoapps/course_groups/partition_scheme.py
@@ -61,7 +61,7 @@ class CohortPartitionScheme(object):
             # one it means the mapping is invalid.  the previous state of the
             # partition configuration may have been modified.
             log.warn(
-                "partition mismatch in CohortPartitionScheme: %r",
+                u"partition mismatch in CohortPartitionScheme: %r",
                 {
                     "requested_partition_id": user_partition.id,
                     "found_partition_id": partition_id,
@@ -79,7 +79,7 @@ class CohortPartitionScheme(object):
             # it means the mapping is invalid.  the previous state of the
             # partition configuration may have been modified.
             log.warn(
-                "group not found in CohortPartitionScheme: %r",
+                u"group not found in CohortPartitionScheme: %r",
                 {
                     "requested_partition_id": user_partition.id,
                     "requested_group_id": group_id,
diff --git a/openedx/core/djangoapps/course_groups/serializers.py b/openedx/core/djangoapps/course_groups/serializers.py
index 3867a776c558d4ab4b1c7280c8338f206fbfdeea..a21d367f0c8abf8017029e99f68218ebcb7ba79d 100644
--- a/openedx/core/djangoapps/course_groups/serializers.py
+++ b/openedx/core/djangoapps/course_groups/serializers.py
@@ -14,7 +14,7 @@ class CohortUsersAPISerializer(serializers.ModelSerializer):
 
     def get_full_name(self, model):
         """Return the full name of the user."""
-        return '{} {}'.format(model.first_name, model.last_name)
+        return u'{} {}'.format(model.first_name, model.last_name)
 
     class Meta:
         model = User
diff --git a/openedx/core/djangoapps/course_groups/tests/test_api_views.py b/openedx/core/djangoapps/course_groups/tests/test_api_views.py
index 1e8bf27a9b7068dabe2371d9a53ac7470d7d31af..d75441b45d5640a396137833e974f574b14fb38e 100644
--- a/openedx/core/djangoapps/course_groups/tests/test_api_views.py
+++ b/openedx/core/djangoapps/course_groups/tests/test_api_views.py
@@ -308,7 +308,7 @@ class TestCohortApi(SharedModuleStoreTestCase):
             expected_results = [{
                 'username': user.username,
                 'email': user.email,
-                'name': '{} {}'.format(user.first_name, user.last_name)
+                'name': u'{} {}'.format(user.first_name, user.last_name)
             } for user in users]
             assert results == expected_results
 
diff --git a/openedx/core/djangoapps/course_groups/tests/test_views.py b/openedx/core/djangoapps/course_groups/tests/test_views.py
index 0c3de5ab70fbeaf4c8920c70424a9733fe3be62f..f3b66d70db7cbb7f19005a4fcb4f6d80c87f7c07 100644
--- a/openedx/core/djangoapps/course_groups/tests/test_views.py
+++ b/openedx/core/djangoapps/course_groups/tests/test_views.py
@@ -1057,7 +1057,7 @@ class AddUsersToCohortTestCase(CohortViewsTestCase):
         """
         unknown = "unknown_user"
         response_dict = self.request_add_users_to_cohort(
-            " {} {}\t{}, \r\n{}".format(
+            u" {} {}\t{}, \r\n{}".format(
                 unknown,
                 self.cohort1_users[0].username,
                 self.cohort2_users[0].username,
@@ -1194,7 +1194,7 @@ class RemoveUserFromCohortTestCase(CohortViewsTestCase):
             username,
             response_dict,
             cohort,
-            expected_error_msg='No user \'{0}\''.format(username)
+            expected_error_msg=u'No user \'{0}\''.format(username)
         )
 
     def test_can_remove_user_not_in_cohort(self):
diff --git a/openedx/core/djangoapps/course_groups/views.py b/openedx/core/djangoapps/course_groups/views.py
index a28eb94b2cd83a5d33856ba8bae8c15de3edd6f6..18fbeb86e6e7a4f2bd8d0ed42e56f40168a800e4 100644
--- a/openedx/core/djangoapps/course_groups/views.py
+++ b/openedx/core/djangoapps/course_groups/views.py
@@ -270,7 +270,7 @@ def users_in_cohort(request, course_key_string, cohort_id):
 
     user_info = [{'username': u.username,
                   'email': u.email,
-                  'name': '{0} {1}'.format(u.first_name, u.last_name)}
+                  'name': u'{0} {1}'.format(u.first_name, u.last_name)}
                  for u in users]
 
     return json_http_response({'success': True,
@@ -307,7 +307,7 @@ def add_users_to_cohort(request, course_key_string, cohort_id):
     try:
         cohort = cohorts.get_cohort_by_id(course_key, cohort_id)
     except CourseUserGroup.DoesNotExist:
-        raise Http404("Cohort (ID {cohort_id}) not found for {course_key_string}".format(
+        raise Http404(u"Cohort (ID {cohort_id}) not found for {course_key_string}".format(
             cohort_id=cohort_id,
             course_key_string=course_key_string
         ))
@@ -378,7 +378,7 @@ def remove_user_from_cohort(request, course_key_string, cohort_id):
         api.remove_user_from_cohort(course_key, username)
     except User.DoesNotExist:
         log.debug('no user')
-        return json_http_response({'success': False, 'msg': "No user '{0}'".format(username)})
+        return json_http_response({'success': False, 'msg': u"No user '{0}'".format(username)})
 
     return json_http_response({'success': True})
 
@@ -667,7 +667,7 @@ class CohortUsers(DeveloperErrorViewMixin, APIPermissions):
         try:
             cohort = cohorts.get_cohort_by_id(course_key, cohort_id)
         except CourseUserGroup.DoesNotExist:
-            msg = 'Cohort (ID {cohort_id}) not found for {course_key_string}'.format(
+            msg = u'Cohort (ID {cohort_id}) not found for {course_key_string}'.format(
                 cohort_id=cohort_id,
                 course_key_string=course_key_string
             )
diff --git a/openedx/core/djangoapps/credentials/management/commands/notify_credentials.py b/openedx/core/djangoapps/credentials/management/commands/notify_credentials.py
index 086ba62aa0d3385643bd17930bfc1845e179c4ea..88a265c04f7fc1380e3f74557340023f1f96312c 100644
--- a/openedx/core/djangoapps/credentials/management/commands/notify_credentials.py
+++ b/openedx/core/djangoapps/credentials/management/commands/notify_credentials.py
@@ -163,7 +163,7 @@ class Command(BaseCommand):
             options = self.get_args_from_database()
 
         log.info(
-            "notify_credentials starting, dry-run=%s, site=%s, delay=%d seconds",
+            u"notify_credentials starting, dry-run=%s, site=%s, delay=%d seconds",
             options['dry_run'],
             options['site'],
             options['delay']
@@ -175,8 +175,7 @@ class Command(BaseCommand):
         try:
             site_config = SiteConfiguration.objects.get(site__domain=options['site']) if options['site'] else None
         except SiteConfiguration.DoesNotExist:
-            log.error('No site configuration found for site %s', options['site'])
-
+            log.error(u'No site configuration found for site %s', options['site'])
         if options['courses']:
             course_keys = self.get_course_keys(options['courses'])
             cert_filter_args['course_id__in'] = course_keys
@@ -214,11 +213,11 @@ class Command(BaseCommand):
         # First, do certs
         for i, cert in paged_query(certs, delay, page_size):
             if site_config and not site_config.has_org(cert.course_id.org):
-                log.info("Skipping credential changes %d for certificate %s", i, certstr(cert))
+                log.info(u"Skipping credential changes %d for certificate %s", i, certstr(cert))
                 continue
 
             log.info(
-                "Handling credential changes %d for certificate %s",
+                u"Handling credential changes %d for certificate %s",
                 i, certstr(cert),
             )
 
@@ -236,11 +235,11 @@ class Command(BaseCommand):
         # Then do grades
         for i, grade in paged_query(grades, delay, page_size):
             if site_config and not site_config.has_org(grade.course_id.org):
-                log.info("Skipping grade changes %d for grade %s", i, gradestr(grade))
+                log.info(u"Skipping grade changes %d for grade %s", i, gradestr(grade))
                 continue
 
             log.info(
-                "Handling grade changes %d for grade %s",
+                u"Handling grade changes %d for grade %s",
                 i, gradestr(grade),
             )
 
@@ -267,12 +266,12 @@ class Command(BaseCommand):
         """
         # Use specific courses if specified, but fall back to all courses.
         course_keys = []
-        log.info("%d courses specified: %s", len(courses), ", ".join(courses))
+        log.info(u"%d courses specified: %s", len(courses), ", ".join(courses))
         for course_id in courses:
             try:
                 course_keys.append(CourseKey.from_string(course_id))
             except InvalidKeyError:
-                log.fatal("%s is not a parseable CourseKey", course_id)
+                log.fatal(u"%s is not a parseable CourseKey", course_id)
                 sys.exit(1)
 
         return course_keys
@@ -286,10 +285,10 @@ class Command(BaseCommand):
         for cert in certs[:ITEMS_TO_SHOW]:
             print("   ", certstr(cert))
         if certs.count() > ITEMS_TO_SHOW:
-            print("    (+ {} more)".format(certs.count() - ITEMS_TO_SHOW))
+            print(u"    (+ {} more)".format(certs.count() - ITEMS_TO_SHOW))
 
         print(grades.count(), "Grades:")
         for grade in grades[:ITEMS_TO_SHOW]:
             print("   ", gradestr(grade))
         if grades.count() > ITEMS_TO_SHOW:
-            print("    (+ {} more)".format(grades.count() - ITEMS_TO_SHOW))
+            print(u"    (+ {} more)".format(grades.count() - ITEMS_TO_SHOW))
diff --git a/openedx/core/djangoapps/credentials/signals.py b/openedx/core/djangoapps/credentials/signals.py
index 95a2a455508105e1fb7d4d9f07626d7c39bf11d2..41924c28c3611800ba3504c74ea5c70d95415ac2 100644
--- a/openedx/core/djangoapps/credentials/signals.py
+++ b/openedx/core/djangoapps/credentials/signals.py
@@ -46,7 +46,7 @@ def send_grade_if_interesting(user, course_run_key, mode, status, letter_grade,
     """ Checks if grade is interesting to Credentials and schedules a Celery task if so. """
 
     if verbose:
-        msg = "Starting send_grade_if_interesting with params: "\
+        msg = u"Starting send_grade_if_interesting with params: "\
             "user [{username}], "\
             "course_run_key [{key}], "\
             "mode [{mode}], "\
@@ -74,7 +74,7 @@ def send_grade_if_interesting(user, course_run_key, mode, status, letter_grade,
     if not helpers.get_value_for_org(course_run_key.org, 'ENABLE_LEARNER_RECORDS', True):
         if verbose:
             log.info(
-                "Skipping send grade: ENABLE_LEARNER_RECORDS False for org [{org}]".format(
+                u"Skipping send grade: ENABLE_LEARNER_RECORDS False for org [{org}]".format(
                     org=course_run_key.org
                 )
             )
@@ -90,7 +90,7 @@ def send_grade_if_interesting(user, course_run_key, mode, status, letter_grade,
             # We only care about grades for which there is a certificate.
             if verbose:
                 log.info(
-                    "Skipping send grade: no cert for user [{username}] & course_id [{course_id}]".format(
+                    u"Skipping send grade: no cert for user [{username}] & course_id [{course_id}]".format(
                         username=getattr(user, 'username', None),
                         course_id=str(course_run_key)
                     )
@@ -103,7 +103,7 @@ def send_grade_if_interesting(user, course_run_key, mode, status, letter_grade,
     if mode not in INTERESTING_MODES or status not in INTERESTING_STATUSES:
         if verbose:
             log.info(
-                "Skipping send grade: mode/status uninteresting for mode [{mode}] & status [{status}]".format(
+                u"Skipping send grade: mode/status uninteresting for mode [{mode}] & status [{status}]".format(
                     mode=mode,
                     status=status
                 )
@@ -115,7 +115,7 @@ def send_grade_if_interesting(user, course_run_key, mode, status, letter_grade,
     if not is_course_run_in_a_program(course_run_key):
         if verbose:
             log.info(
-                "Skipping send grade: course run not in a program. [{course_id}]".format(course_id=str(course_run_key))
+                u"Skipping send grade: course run not in a program. [{course_id}]".format(course_id=str(course_run_key))
             )
         return
 
@@ -125,7 +125,7 @@ def send_grade_if_interesting(user, course_run_key, mode, status, letter_grade,
         if grade is None:
             if verbose:
                 log.info(
-                    "Skipping send grade: No grade found for user [{username}] & course_id [{course_id}]".format(
+                    u"Skipping send grade: No grade found for user [{username}] & course_id [{course_id}]".format(
                         username=getattr(user, 'username', None),
                         course_id=str(course_run_key)
                     )
diff --git a/openedx/core/djangoapps/credentials/tasks/v1/tasks.py b/openedx/core/djangoapps/credentials/tasks/v1/tasks.py
index 630aafc58821f40b38f2c41fd5fbc914633c2f54..ea11d0be505baf56251535b0c1582a8e82b12573 100644
--- a/openedx/core/djangoapps/credentials/tasks/v1/tasks.py
+++ b/openedx/core/djangoapps/credentials/tasks/v1/tasks.py
@@ -27,7 +27,7 @@ MAX_RETRIES = 11
 @task(bind=True, ignore_result=True, routing_key=ROUTING_KEY)
 def send_grade_to_credentials(self, username, course_run_key, verified, letter_grade, percent_grade):
     """ Celery task to notify the Credentials IDA of a grade change via POST. """
-    logger.info('Running task send_grade_to_credentials for username %s and course %s', username, course_run_key)
+    logger.info(u'Running task send_grade_to_credentials for username %s and course %s', username, course_run_key)
 
     countdown = 2 ** self.request.retries
     course_key = CourseKey.from_string(course_run_key)
@@ -46,8 +46,8 @@ def send_grade_to_credentials(self, username, course_run_key, verified, letter_g
             'verified': verified,
         })
 
-        logger.info('Sent grade for course %s to user %s', course_run_key, username)
+        logger.info(u'Sent grade for course %s to user %s', course_run_key, username)
 
     except Exception as exc:
-        logger.exception('Failed to send grade for course %s to user %s', course_run_key, username)
+        logger.exception(u'Failed to send grade for course %s to user %s', course_run_key, username)
         raise self.retry(exc=exc, countdown=countdown, max_retries=MAX_RETRIES)
diff --git a/openedx/core/djangoapps/credit/api/provider.py b/openedx/core/djangoapps/credit/api/provider.py
index 453163d2e30e65106507f2b30a15ea094b516098..c139cb99293fed8bc793062d3e051aadfdbdecb9 100644
--- a/openedx/core/djangoapps/credit/api/provider.py
+++ b/openedx/core/djangoapps/credit/api/provider.py
@@ -264,8 +264,8 @@ def create_credit_request(course_key, provider_id, username):
             final_grade = unicode(final_grade)
 
     except (CreditRequirementStatus.DoesNotExist, TypeError, KeyError):
-        msg = 'Could not retrieve final grade from the credit eligibility table for ' \
-              'user [{user_id}] in course [{course_key}].'.format(user_id=user.id, course_key=course_key)
+        msg = u'Could not retrieve final grade from the credit eligibility table for ' \
+              u'user [{user_id}] in course [{course_key}].'.format(user_id=user.id, course_key=course_key)
         log.exception(msg)
         raise UserIsNotEligible(msg)
 
diff --git a/openedx/core/djangoapps/credit/email_utils.py b/openedx/core/djangoapps/credit/email_utils.py
index fc5108d96ba14afb7b4c26972951c2624a2b5707..4c418774f7d7000aeb2058a94c9ea934c050fa81 100644
--- a/openedx/core/djangoapps/credit/email_utils.py
+++ b/openedx/core/djangoapps/credit/email_utils.py
@@ -24,6 +24,7 @@ from eventtracking import tracker
 from openedx.core.djangoapps.commerce.utils import ecommerce_api_client
 from openedx.core.djangoapps.credit.models import CreditConfig, CreditProvider
 from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers
+from openedx.core.djangolib.markup import HTML
 from xmodule.modulestore.django import modulestore
 
 log = logging.getLogger(__name__)
@@ -36,7 +37,7 @@ def send_credit_notifications(username, course_key):
     try:
         user = User.objects.get(username=username)
     except User.DoesNotExist:
-        log.error('No user with %s exist', username)
+        log.error(u'No user with %s exist', username)
         return
 
     course = modulestore().get_course(course_key, depth=0)
@@ -150,7 +151,7 @@ def with_inline_css(html_without_css):
         import pynliner
 
         # insert style tag in the html and run pyliner.
-        html_with_inline_css = pynliner.fromString('<style>' + css_content + '</style>' + html_without_css)
+        html_with_inline_css = pynliner.fromString(HTML('<style>{}</style>{}').format(css_content, html_without_css))
         return html_with_inline_css
 
     return html_without_css
@@ -167,7 +168,7 @@ def attach_image(img_dict, filename):
     if img_path:
         with open(img_path, 'rb') as img:
             msg_image = MIMEImage(img.read(), name=os.path.basename(img_path))
-            msg_image.add_header('Content-ID', '<{}>'.format(img_dict['cid']))
+            msg_image.add_header('Content-ID', b'<{}>'.format(img_dict['cid']))  # xss-lint: disable=python-wrap-html
             msg_image.add_header("Content-Disposition", "inline", filename=filename)
         return msg_image
 
@@ -223,11 +224,11 @@ def get_credit_provider_display_names(course_key):
         user = User.objects.get(username=settings.ECOMMERCE_SERVICE_WORKER_USERNAME)
         response = ecommerce_api_client(user).courses(course_id).get(include_products=1)
     except Exception:  # pylint: disable=broad-except
-        log.exception("Failed to receive data from the ecommerce course API for Course ID '%s'.", course_id)
+        log.exception(u"Failed to receive data from the ecommerce course API for Course ID '%s'.", course_id)
         return provider_names
 
     if not response:
-        log.info("No Course information found from ecommerce API for Course ID '%s'.", course_id)
+        log.info(u"No Course information found from ecommerce API for Course ID '%s'.", course_id)
         return provider_names
 
     provider_ids = []
@@ -265,14 +266,14 @@ def make_providers_strings(providers):
 
     elif len(providers) == 2:
         # Translators: The join of two university names (e.g., Harvard and MIT).
-        providers_string = _("{first_provider} and {second_provider}").format(
+        providers_string = _(u"{first_provider} and {second_provider}").format(
             first_provider=providers[0],
             second_provider=providers[1]
         )
     else:
         # Translators: The join of three or more university names. The first of these formatting strings
         # represents a comma-separated list of names (e.g., MIT, Harvard, Dartmouth).
-        providers_string = _("{first_providers}, and {last_provider}").format(
+        providers_string = _(u"{first_providers}, and {last_provider}").format(
             first_providers=u", ".join(providers[:-1]),
             last_provider=providers[-1]
         )
diff --git a/openedx/core/djangoapps/credit/services.py b/openedx/core/djangoapps/credit/services.py
index 57cc57d9f746ec71e0d1afeb426ffa11b12546d1..50e4a1d27ebc70916a1555357d5ae604ab33f841 100644
--- a/openedx/core/djangoapps/credit/services.py
+++ b/openedx/core/djangoapps/credit/services.py
@@ -133,10 +133,10 @@ class CreditService(object):
         # table. This will be to help debug any issues that might
         # arise in production
         log_msg = (
-            'set_credit_requirement_status was called with '
-            'user_id={user_id}, course_key_or_id={course_key_or_id} '
-            'req_namespace={req_namespace}, req_name={req_name}, '
-            'status={status}, reason={reason}'.format(
+            u'set_credit_requirement_status was called with '
+            u'user_id={user_id}, course_key_or_id={course_key_or_id} '
+            u'req_namespace={req_namespace}, req_name={req_name}, '
+            u'status={status}, reason={reason}'.format(
                 user_id=user_id,
                 course_key_or_id=course_key_or_id,
                 req_namespace=req_namespace,
@@ -189,9 +189,9 @@ class CreditService(object):
         # table. This will be to help debug any issues that might
         # arise in production
         log_msg = (
-            'remove_credit_requirement_status was called with '
-            'user_id={user_id}, course_key_or_id={course_key_or_id} '
-            'req_namespace={req_namespace}, req_name={req_name}, '.format(
+            u'remove_credit_requirement_status was called with '
+            u'user_id={user_id}, course_key_or_id={course_key_or_id} '
+            u'req_namespace={req_namespace}, req_name={req_name}, '.format(
                 user_id=user_id,
                 course_key_or_id=course_key_or_id,
                 req_namespace=req_namespace,
diff --git a/openedx/core/djangoapps/credit/tasks.py b/openedx/core/djangoapps/credit/tasks.py
index b4a050213f25ce3b20722999114476bacef6f52c..81682bccb0f62c00fc82e2dad3670e5430f3e978 100644
--- a/openedx/core/djangoapps/credit/tasks.py
+++ b/openedx/core/djangoapps/credit/tasks.py
@@ -36,10 +36,10 @@ def update_credit_course_requirements(course_id):
             requirements = _get_course_credit_requirements(course_key)
             set_credit_requirements(course_key, requirements)
     except (InvalidKeyError, ItemNotFoundError, InvalidCreditRequirements) as exc:
-        LOGGER.error('Error on adding the requirements for course %s - %s', course_id, unicode(exc))
+        LOGGER.error(u'Error on adding the requirements for course %s - %s', course_id, unicode(exc))
         raise update_credit_course_requirements.retry(args=[course_id], exc=exc)
     else:
-        LOGGER.info('Requirements added for course %s', course_id)
+        LOGGER.info(u'Requirements added for course %s', course_id)
 
 
 def _get_course_credit_requirements(course_key):
@@ -95,7 +95,7 @@ def _get_min_grade_requirement(course_key):
             }
         ]
     except AttributeError:
-        LOGGER.error("The course %s does not has minimum_grade_credit attribute", unicode(course.id))
+        LOGGER.error(u"The course %s does not has minimum_grade_credit attribute", unicode(course.id))
     else:
         return []
 
@@ -127,7 +127,7 @@ def _get_proctoring_requirements(course_key):
                 usage_key = UsageKey.from_string(exam['content_id'])
                 proctor_block = modulestore().get_item(usage_key)
             except (InvalidKeyError, ItemNotFoundError):
-                LOGGER.info("Invalid content_id '%s' for proctored block '%s'", exam['content_id'], exam['exam_name'])
+                LOGGER.info(u"Invalid content_id '%s' for proctored block '%s'", exam['content_id'], exam['exam_name'])
                 proctor_block = None
 
             if proctor_block:
@@ -142,7 +142,7 @@ def _get_proctoring_requirements(course_key):
 
     if requirements:
         log_msg = (
-            'Registering the following as \'proctored_exam\' credit requirements: {log_msg}'.format(
+            u'Registering the following as \'proctored_exam\' credit requirements: {log_msg}'.format(
                 log_msg=requirements
             )
         )
diff --git a/openedx/core/djangoapps/credit/tests/test_api.py b/openedx/core/djangoapps/credit/tests/test_api.py
index f712f3f2a5678179a91cde01aca36d86d5b9f9b5..77ef4454e693c6112faf87df03bc8a38f03ab38e 100644
--- a/openedx/core/djangoapps/credit/tests/test_api.py
+++ b/openedx/core/djangoapps/credit/tests/test_api.py
@@ -699,7 +699,7 @@ class CreditRequirementApiTests(CreditApiTestBase):
         # strip enclosing angle brackets from 'logo_image' cache 'Content-ID'
         image_id = email_image.get('Content-ID', '')[1:-1]
         self.assertIsNotNone(image_id)
-        self.assertIn(image_id, html_content_first)
+        self.assertIn(image_id, html_content_first.decode('utf-8'))
         self.assertIn(
             'credit from Hogwarts School of Witchcraft and Wizardry for',
             html_content_first
@@ -729,7 +729,7 @@ class CreditRequirementApiTests(CreditApiTestBase):
         # logo image is used
         email_payload_second = mail.outbox[1].attachments[0]._payload  # pylint: disable=protected-access
         html_content_second = email_payload_second[0]._payload[1]._payload  # pylint: disable=protected-access
-        self.assertIn(image_id, html_content_second)
+        self.assertIn(image_id, html_content_second.decode('utf-8'))
 
         # The user should remain eligible even if the requirement status is later changed
         api.set_credit_requirement_status(
@@ -1125,7 +1125,7 @@ class CreditProviderIntegrationApiTests(CreditApiTestBase):
         # Simulate users who registered accounts before the country field was introduced.
         # We need to manipulate the database directly because the country Django field
         # coerces None values to empty strings.
-        query = "UPDATE auth_userprofile SET country = NULL WHERE id = %s"
+        query = u"UPDATE auth_userprofile SET country = NULL WHERE id = %s"
         connection.cursor().execute(query, [str(self.user.profile.id)])
 
         # Request should include an empty country field
diff --git a/openedx/core/djangoapps/dark_lang/tests.py b/openedx/core/djangoapps/dark_lang/tests.py
index 17e361a9c496afd56254b031d0e162f7ef06b44a..9b5d562ac89fe558c72ebbf2bce5d0afcc4a0dcb 100644
--- a/openedx/core/djangoapps/dark_lang/tests.py
+++ b/openedx/core/djangoapps/dark_lang/tests.py
@@ -228,7 +228,7 @@ class DarkLangMiddlewareTests(CacheIsolationTestCase):
 
         self.assertAcceptEquals(
             'es-419;q=1.0',
-            self.process_middleware_request(accept='{};q=1.0, pt;q=0.5'.format(latin_america_code))
+            self.process_middleware_request(accept=b'{};q=1.0, pt;q=0.5'.format(latin_america_code))
         )
 
     def assert_session_lang_equals(self, value, session):
diff --git a/openedx/core/djangoapps/dark_lang/views.py b/openedx/core/djangoapps/dark_lang/views.py
index ae2c0a406c297fbb0215761c2618a44650c964e9..ffc968e517acc70eb79123f75a25d643adfce60c 100644
--- a/openedx/core/djangoapps/dark_lang/views.py
+++ b/openedx/core/djangoapps/dark_lang/views.py
@@ -94,7 +94,7 @@ class PreviewLanguageFragmentView(EdxFragmentView):
         set_user_preference(request.user, DARK_LANGUAGE_KEY, preview_language)
         PageLevelMessages.register_success_message(
             request,
-            _('Language set to {preview_language}').format(
+            _(u'Language set to {preview_language}').format(
                 preview_language=preview_language
             )
         )
diff --git a/openedx/core/djangoapps/debug/views.py b/openedx/core/djangoapps/debug/views.py
index bbd2dd753c1880cf8c22f7a28865409dda9d81a4..d0a4da96ed72b680325115387f32e135fc69ef5d 100644
--- a/openedx/core/djangoapps/debug/views.py
+++ b/openedx/core/djangoapps/debug/views.py
@@ -53,4 +53,4 @@ def show_reference_template(request, template):
 
         return render_to_response(template, context)
     except TemplateDoesNotExist:
-        return HttpResponseNotFound('Missing template {template}'.format(template=bleach.clean(template, strip=True)))
+        return HttpResponseNotFound(u'Missing template {template}'.format(template=bleach.clean(template, strip=True)))
diff --git a/openedx/core/djangoapps/embargo/forms.py b/openedx/core/djangoapps/embargo/forms.py
index 9ba0b71ef748787e9435384f96990b112b8d4280..6c4e8608e78c4350d474c57f7174e6e9dff80613 100644
--- a/openedx/core/djangoapps/embargo/forms.py
+++ b/openedx/core/djangoapps/embargo/forms.py
@@ -85,7 +85,7 @@ class IPFilterForm(forms.ModelForm):
             if not self._is_valid_ip(address):
                 error_addresses.append(address)
         if error_addresses:
-            msg = 'Invalid IP Address(es): {0}'.format(error_addresses)
+            msg = u'Invalid IP Address(es): {0}'.format(error_addresses)
             msg += ' Please fix the error(s) and try again.'
             raise forms.ValidationError(msg)
 
diff --git a/openedx/core/djangoapps/embargo/models.py b/openedx/core/djangoapps/embargo/models.py
index 15a620f3e120b17c053e29e7edb78ea261e437d4..365f0e0b48f04929d4293be31bf89f2e96a35812 100644
--- a/openedx/core/djangoapps/embargo/models.py
+++ b/openedx/core/djangoapps/embargo/models.py
@@ -147,7 +147,7 @@ class RestrictedCourse(models.Model):
         default=False,
         help_text=ugettext_lazy(
             u"Allow users who enrolled in an allowed country "
-            u"to access restricted courses from excluded countries."
+            "to access restricted courses from excluded countries."
         )
     )
 
@@ -525,7 +525,7 @@ class CountryAccessRule(models.Model):
         """Invalidate the cache. """
         cache_key = cls.CACHE_KEY.format(course_key=course_key)
         cache.delete(cache_key)
-        log.info("Invalidated country access list for course %s", course_key)
+        log.info(u"Invalidated country access list for course %s", course_key)
 
     class Meta(object):
         """a course can be added with either black or white list.  """
diff --git a/openedx/core/djangoapps/embargo/tests/test_api.py b/openedx/core/djangoapps/embargo/tests/test_api.py
index 9ddfa6759b7e05fe90a344caa896548684d05c29..11093519a06e3ff84d4361254783d6fe17d4cd7f 100644
--- a/openedx/core/djangoapps/embargo/tests/test_api.py
+++ b/openedx/core/djangoapps/embargo/tests/test_api.py
@@ -156,7 +156,7 @@ class EmbargoCheckAccessApiTests(ModuleStoreTestCase):
         # exception when the embargo middleware treated the value as a string.
         # In order to simulate this behavior, we can't simply set `profile.country = None`.
         # (because when we save it, it will set the database field to an empty string instead of NULL)
-        query = "UPDATE auth_userprofile SET country = NULL WHERE id = %s"
+        query = u"UPDATE auth_userprofile SET country = NULL WHERE id = %s"
         connection.cursor().execute(query, [str(self.user.profile.id)])
 
         # Verify that we can check the user's access without error
diff --git a/openedx/core/djangoapps/external_auth/djangostore.py b/openedx/core/djangoapps/external_auth/djangostore.py
index e69ce858068d5fd3fc3e67fa0b58f4feb173966e..3a10c343ea361c119cbe3ad495946d066d29c475 100644
--- a/openedx/core/djangoapps/external_auth/djangostore.py
+++ b/openedx/core/djangoapps/external_auth/djangostore.py
@@ -45,7 +45,7 @@ class DjangoOpenIDStore(OpenIDStore):
     def storeAssociation(self, server_url, assoc):
         key = get_url_key(server_url)
 
-        log.info('storeAssociation {0}'.format(key))
+        log.info(u'storeAssociation {0}'.format(key))
 
         associations = cache.get(key, {})
         associations[assoc.handle] = assoc
@@ -55,7 +55,7 @@ class DjangoOpenIDStore(OpenIDStore):
     def getAssociation(self, server_url, handle=None):
         key = get_url_key(server_url)
 
-        log.info('getAssociation {0}'.format(key))
+        log.info(u'getAssociation {0}'.format(key))
 
         associations = cache.get(key, {})
 
@@ -84,7 +84,7 @@ class DjangoOpenIDStore(OpenIDStore):
     def removeAssociation(self, server_url, handle):
         key = get_url_key(server_url)
 
-        log.info('removeAssociation {0}'.format(key))
+        log.info(u'removeAssociation {0}'.format(key))
 
         associations = cache.get(key, {})
 
@@ -105,7 +105,7 @@ class DjangoOpenIDStore(OpenIDStore):
     def useNonce(self, server_url, timestamp, salt):
         key = get_nonce_key(server_url, timestamp, salt)
 
-        log.info('useNonce {0}'.format(key))
+        log.info(u'useNonce {0}'.format(key))
 
         if abs(timestamp - time.time()) > nonce.SKEW:
             return False
diff --git a/openedx/core/djangoapps/external_auth/tests/test_openid_provider.py b/openedx/core/djangoapps/external_auth/tests/test_openid_provider.py
index 16c3c2bfd8964078c21ed666e1272325df4dd19a..14bcf3d3401ff1084d651bb7ac7daf5c970a06c8 100644
--- a/openedx/core/djangoapps/external_auth/tests/test_openid_provider.py
+++ b/openedx/core/djangoapps/external_auth/tests/test_openid_provider.py
@@ -100,7 +100,7 @@ class OpenIdProviderTest(TestCase):
             resp = self.client.post(url)
             code = 200
             self.assertEqual(resp.status_code, code,
-                             "got code {0} for url '{1}'. Expected code {2}"
+                             u"got code {0} for url '{1}'. Expected code {2}"
                              .format(resp.status_code, url, code))
 
     @skipUnless(settings.FEATURES.get('AUTH_USE_OPENID') and
@@ -129,7 +129,7 @@ class OpenIdProviderTest(TestCase):
             resp = self.client.post(url)
             code = 200
             self.assertEqual(resp.status_code, code,
-                             "got code {0} for url '{1}'. Expected code {2}"
+                             u"got code {0} for url '{1}'. Expected code {2}"
                              .format(resp.status_code, url, code))
             for expected_input in (
                     '<input name="openid.ns" type="hidden" value="http://specs.openid.net/auth/2.0" />',
@@ -216,7 +216,7 @@ class OpenIdProviderTest(TestCase):
 
         code = expected_code
         self.assertEqual(resp.status_code, code,
-                         "got code {0} for url '{1}'. Expected code {2}"
+                         u"got code {0} for url '{1}'. Expected code {2}"
                          .format(resp.status_code, url, code))
 
     @skipUnless(settings.FEATURES.get('AUTH_USE_OPENID') and
@@ -454,7 +454,7 @@ class OpenIdProviderLiveServerTest(LiveServerTestCase):
             resp = self.client.post(url)
             code = 200
             self.assertEqual(resp.status_code, code,
-                             "got code {0} for url '{1}'. Expected code {2}"
+                             u"got code {0} for url '{1}'. Expected code {2}"
                              .format(resp.status_code, url, code))
 
     @classmethod
diff --git a/openedx/core/djangoapps/external_auth/tests/test_shib.py b/openedx/core/djangoapps/external_auth/tests/test_shib.py
index ccf20ef976e1b39e11c66be6b45a8f6f0973747a..53072c8f284f6df222266cc8ac3dc6ce8875a774 100644
--- a/openedx/core/djangoapps/external_auth/tests/test_shib.py
+++ b/openedx/core/djangoapps/external_auth/tests/test_shib.py
@@ -222,7 +222,7 @@ class ShibSPTest(CacheIsolationTestCase):
         """
         inactive_user = UserFactory.create(email='inactive@stanford.edu')
         if not log_user_string:
-            log_user_string = "user.id: {}".format(inactive_user.id)
+            log_user_string = u"user.id: {}".format(inactive_user.id)
         inactive_user.is_active = False
         inactive_user.save()
         request = self.request_factory.get('/shib-login')
diff --git a/openedx/core/djangoapps/external_auth/tests/test_ssl.py b/openedx/core/djangoapps/external_auth/tests/test_ssl.py
index ea8dc31f88966c9e1eca9bd5ba63f34877622689..1885d7ee4f04083a364d724d2c968caa930cc556 100644
--- a/openedx/core/djangoapps/external_auth/tests/test_ssl.py
+++ b/openedx/core/djangoapps/external_auth/tests/test_ssl.py
@@ -45,7 +45,7 @@ class SSLClientTest(ModuleStoreTestCase):
     Tests SSL Authentication code sections of external_auth
     """
 
-    AUTH_DN = '/C=US/ST=Massachusetts/O=Massachusetts Institute of Technology/OU=Client CA v1/CN={0}/emailAddress={1}'
+    AUTH_DN = b'/C=US/ST=Massachusetts/O=Massachusetts Institute of Technology/OU=Client CA v1/CN={0}/emailAddress={1}'
     USER_NAME = 'test_user_ssl'
     USER_EMAIL = 'test_user_ssl@EDX.ORG'
     MOCK_URL = '/'
@@ -98,7 +98,7 @@ class SSLClientTest(ModuleStoreTestCase):
         try:
             ExternalAuthMap.objects.get(external_id=self.USER_EMAIL)
         except ExternalAuthMap.DoesNotExist, ex:
-            self.fail('User did not get properly added to external auth map, exception was {0}'.format(str(ex)))
+            self.fail(u'User did not get properly added to external auth map, exception was {0}'.format(str(ex)))
 
         with self.assertRaises(User.DoesNotExist):
             User.objects.get(email=self.USER_EMAIL)
@@ -117,7 +117,7 @@ class SSLClientTest(ModuleStoreTestCase):
         try:
             ExternalAuthMap.objects.get(external_id=self.USER_EMAIL)
         except ExternalAuthMap.DoesNotExist, ex:
-            self.fail('User did not get properly added to external auth map, exception was {0}'.format(str(ex)))
+            self.fail(u'User did not get properly added to external auth map, exception was {0}'.format(str(ex)))
 
         with self.assertRaises(User.DoesNotExist):
             User.objects.get(email=self.USER_EMAIL)
@@ -136,11 +136,11 @@ class SSLClientTest(ModuleStoreTestCase):
         try:
             ExternalAuthMap.objects.get(external_id=self.USER_EMAIL)
         except ExternalAuthMap.DoesNotExist, ex:
-            self.fail('User did not get properly added to external auth map, exception was {0}'.format(str(ex)))
+            self.fail(u'User did not get properly added to external auth map, exception was {0}'.format(str(ex)))
         try:
             User.objects.get(email=self.USER_EMAIL)
         except ExternalAuthMap.DoesNotExist, ex:
-            self.fail('User did not get properly added to internal users, exception was {0}'.format(str(ex)))
+            self.fail(u'User did not get properly added to internal users, exception was {0}'.format(str(ex)))
 
     @skip_unless_cms
     @override_settings(FEATURES=FEATURES_WITH_SSL_AUTH_IMMEDIATE_SIGNUP)
@@ -162,11 +162,11 @@ class SSLClientTest(ModuleStoreTestCase):
         try:
             ExternalAuthMap.objects.get(external_id=self.USER_EMAIL)
         except ExternalAuthMap.DoesNotExist, ex:
-            self.fail('User did not get properly added to external auth map, exception was {0}'.format(str(ex)))
+            self.fail(u'User did not get properly added to external auth map, exception was {0}'.format(str(ex)))
         try:
             User.objects.get(email=self.USER_EMAIL)
         except ExternalAuthMap.DoesNotExist, ex:
-            self.fail('User did not get properly added to internal users, exception was {0}'.format(str(ex)))
+            self.fail(u'User did not get properly added to internal users, exception was {0}'.format(str(ex)))
 
     @skip_unless_lms
     @override_settings(FEATURES=FEATURES_WITH_SSL_AUTH_IMMEDIATE_SIGNUP)
@@ -323,11 +323,11 @@ class SSLClientTest(ModuleStoreTestCase):
         try:
             ExternalAuthMap.objects.get(external_id=self.USER_EMAIL)
         except ExternalAuthMap.DoesNotExist, ex:
-            self.fail('User did not get properly added to external auth map, exception was {0}'.format(str(ex)))
+            self.fail(u'User did not get properly added to external auth map, exception was {0}'.format(str(ex)))
         try:
             User.objects.get(email=self.USER_EMAIL)
         except ExternalAuthMap.DoesNotExist, ex:
-            self.fail('User did not get properly added to internal users, exception was {0}'.format(str(ex)))
+            self.fail(u'User did not get properly added to internal users, exception was {0}'.format(str(ex)))
         self.assertEqual(1, len(ExternalAuthMap.objects.all()))
 
         self.assertTrue(self.mock.called)
diff --git a/openedx/core/djangoapps/external_auth/views.py b/openedx/core/djangoapps/external_auth/views.py
index 3f147f207e62171258dc4314ad11a6158c95c71d..53cff9de37293bd3602eb19938a70b1479a087fc 100644
--- a/openedx/core/djangoapps/external_auth/views.py
+++ b/openedx/core/djangoapps/external_auth/views.py
@@ -97,12 +97,12 @@ def openid_login_complete(request,
         oid_backend = openid_auth.OpenIDBackend()
         details = oid_backend._extract_user_details(openid_response)  # pylint: disable=protected-access
 
-        log.debug('openid success, details=%s', details)
+        log.debug(u'openid success, details=%s', details)
 
         url = getattr(settings, 'OPENID_SSO_SERVER_URL', None)
-        external_domain = "{0}{1}".format(OPENID_DOMAIN_PREFIX, url)
-        fullname = '%s %s' % (details.get('first_name', ''),
-                              details.get('last_name', ''))
+        external_domain = u"{0}{1}".format(OPENID_DOMAIN_PREFIX, url)
+        fullname = u'%s %s' % (details.get('first_name', ''),
+                               details.get('last_name', ''))
 
         return _external_login_or_signup(
             request,
@@ -174,9 +174,9 @@ def _external_login_or_signup(request,
                         # otherwise, there must have been an error, b/c we've already linked a user with these external
                         # creds
                         failure_msg = _(
-                            "You have already created an account using "
-                            "an external login like WebAuth or Shibboleth. "
-                            "Please contact {tech_support_email} for support."
+                            u"You have already created an account using "
+                            u"an external login like WebAuth or Shibboleth. "
+                            "Please contact {tech_support_email} for support."  # pylint: disable=unicode-format-string
                         ).format(
                             tech_support_email=get_value('email_from_address', settings.TECH_SUPPORT_EMAIL),
                         )
diff --git a/openedx/core/djangoapps/geoinfo/middleware.py b/openedx/core/djangoapps/geoinfo/middleware.py
index d256501777bc5e572c19de24b3befa23040a7f99..cf89c787e8f900c31589986d3c5c544f5937de80 100644
--- a/openedx/core/djangoapps/geoinfo/middleware.py
+++ b/openedx/core/djangoapps/geoinfo/middleware.py
@@ -43,4 +43,4 @@ class CountryMiddleware(object):
                 country_code = pygeoip.GeoIP(settings.GEOIP_PATH).country_code_by_addr(new_ip_address)
             request.session['country_code'] = country_code
             request.session['ip_address'] = new_ip_address
-            log.debug('Country code for IP: %s is set to %s', new_ip_address, country_code)
+            log.debug(u'Country code for IP: %s is set to %s', new_ip_address, country_code)
diff --git a/openedx/core/djangoapps/heartbeat/runchecks.py b/openedx/core/djangoapps/heartbeat/runchecks.py
index c6972fc4de7fb47a7858109db9388471fa572eb4..82d1e88d3445967d1edf7d2129a7be52eaa7d867 100644
--- a/openedx/core/djangoapps/heartbeat/runchecks.py
+++ b/openedx/core/djangoapps/heartbeat/runchecks.py
@@ -30,8 +30,7 @@ def runchecks(include_extended=False):
                 'message': message
             }
         except ImportError as e:
-            raise ImproperlyConfigured('Error importing module %s: "%s"' % (module, e))
+            raise ImproperlyConfigured(u'Error importing module %s: "%s"' % (module, e))
         except AttributeError:
-            raise ImproperlyConfigured('Module "%s" does not define a "%s" callable' % (module, attr))
-
+            raise ImproperlyConfigured(u'Module "%s" does not define a "%s" callable' % (module, attr))
     return response_dict
diff --git a/openedx/core/djangoapps/models/course_details.py b/openedx/core/djangoapps/models/course_details.py
index 7f3aa764651e7fb59eb2f4289c386e9eb44ebac4..3d3dae7d16023a532aaf004fdb740e768ecb87a4 100644
--- a/openedx/core/djangoapps/models/course_details.py
+++ b/openedx/core/djangoapps/models/course_details.py
@@ -8,6 +8,7 @@ from django.conf import settings
 
 from xmodule.fields import Date
 from xmodule.modulestore.exceptions import ItemNotFoundError
+from openedx.core.djangolib.markup import HTML
 from openedx.core.lib.courses import course_image_url
 from xmodule.modulestore.django import modulestore
 
@@ -80,7 +81,7 @@ class CourseDetails(object):
         Retrieve an attribute from a course's "about" info
         """
         if attribute not in ABOUT_ATTRIBUTES + ['video']:
-            raise ValueError("'{0}' is not a valid course about attribute.".format(attribute))
+            raise ValueError(u"'{0}' is not a valid course about attribute.".format(attribute))
 
         usage_key = course_key.make_usage_key('about', attribute)
         try:
@@ -332,8 +333,7 @@ class CourseDetails(object):
         result = None
         if video_key:
             result = (
-                '<iframe title="YouTube Video" width="560" height="315" src="//www.youtube.com/embed/' +
-                video_key +
-                '?rel=0" frameborder="0" allowfullscreen=""></iframe>'
+                HTML(u'<iframe title="YouTube Video" width="560" height="315" src="//www.youtube.com/embed/{}?rel=0" '
+                     'frameborder="0" allowfullscreen=""></iframe>').format(video_key)
             )
         return result
diff --git a/openedx/core/djangoapps/oauth_dispatch/management/commands/tests/test_clear_expired_tokens.py b/openedx/core/djangoapps/oauth_dispatch/management/commands/tests/test_clear_expired_tokens.py
index cdd907389d9b82b0cb1821c9592f4ad40cbe9b4a..db71e2f3254580be9106a3e81d5552bfc7416b7a 100644
--- a/openedx/core/djangoapps/oauth_dispatch/management/commands/tests/test_clear_expired_tokens.py
+++ b/openedx/core/djangoapps/oauth_dispatch/management/commands/tests/test_clear_expired_tokens.py
@@ -61,12 +61,12 @@ class EdxClearExpiredTokensTests(TestCase):
                 (
                     LOGGER_NAME,
                     'INFO',
-                    'Cleaning {} rows from {} table'.format(0, RefreshToken.__name__)
+                    u'Cleaning {} rows from {} table'.format(0, RefreshToken.__name__)
                 ),
                 (
                     LOGGER_NAME,
                     'INFO',
-                    'Cleaning {} rows from {} table'.format(0, AccessToken.__name__),
+                    u'Cleaning {} rows from {} table'.format(0, AccessToken.__name__),
                 ),
                 (
                     LOGGER_NAME,
diff --git a/openedx/core/djangoapps/oauth_dispatch/tests/test_views.py b/openedx/core/djangoapps/oauth_dispatch/tests/test_views.py
index aae611079c7237283a545efab4daba63e9cae619..1cf00d9f1d3733e8525f5d3117de5a4cdcb00a61 100644
--- a/openedx/core/djangoapps/oauth_dispatch/tests/test_views.py
+++ b/openedx/core/djangoapps/oauth_dispatch/tests/test_views.py
@@ -62,7 +62,7 @@ class AccessTokenLoginMixin(object):
 
         return self.client.post(
             self.login_with_access_token_url,
-            HTTP_AUTHORIZATION="Bearer {0}".format(access_token if access_token else self.access_token)
+            HTTP_AUTHORIZATION=b"Bearer {0}".format(access_token if access_token else self.access_token)
         )
 
     def _assert_access_token_is_valid(self, access_token=None):
@@ -464,7 +464,7 @@ class TestAuthorizationView(_DispatchingViewTestCase):
         # is the application name specified?
         self.assertContains(
             response,
-            "Authorize {name}".format(name=self.dot_app.name)
+            u"Authorize {name}".format(name=self.dot_app.name)
         )
 
         # are the cancel and allow buttons on the page?
diff --git a/openedx/core/djangoapps/password_policy/apps.py b/openedx/core/djangoapps/password_policy/apps.py
index 025c04ddb7401f80c1b5c5cc7dfb089220f9b315..9905cf3abffea1fe963e54bebd206be592659772 100644
--- a/openedx/core/djangoapps/password_policy/apps.py
+++ b/openedx/core/djangoapps/password_policy/apps.py
@@ -56,5 +56,5 @@ class PasswordPolicyConfig(AppConfig):
             if isinstance(deadline, six.string_types):
                 config[setting] = parse_date(deadline)
         except (ValueError, OverflowError):
-            log.exception("Could not parse %s password policy rollout value of '%s'.", setting, deadline)
+            log.exception(u"Could not parse %s password policy rollout value of '%s'.", setting, deadline)
             config[setting] = None
diff --git a/openedx/core/djangoapps/password_policy/compliance.py b/openedx/core/djangoapps/password_policy/compliance.py
index 27e3e1d5b71aa8f181fceeddbd46b8c60b34b52c..742ba79ae8ba6f13d5b591d43aa7e70d1dd67e53 100644
--- a/openedx/core/djangoapps/password_policy/compliance.py
+++ b/openedx/core/djangoapps/password_policy/compliance.py
@@ -72,7 +72,7 @@ def enforce_compliance_on_login(user, password):
     if now >= deadline:
         raise NonCompliantPasswordException(
             HTML(_(
-                '{strong_tag_open}We recently changed our password requirements{strong_tag_close}{break_line_tag}'
+                u'{strong_tag_open}We recently changed our password requirements{strong_tag_close}{break_line_tag}'
                 'Your current password does not meet the new security requirements. We just sent a password-reset '
                 'message to the email address associated with this account. Thank you for helping us keep your data '
                 'safe.'
@@ -85,17 +85,17 @@ def enforce_compliance_on_login(user, password):
     else:
         raise NonCompliantPasswordWarning(
             HTML(_(
-                '{strong_tag_open}Required Action: Please update your password{strong_tag_close}{break_line_tag}'
-                'As of {deadline}, {platform_name} will require all learners to have complex passwords. Your current '
-                'password does not meet these requirements. To reset your password, go to to '
-                '{anchor_tag_open}Account Settings{anchor_tag_close}.'
+                u'{strong_tag_open}Required Action: Please update your password{strong_tag_close}{break_line_tag}'
+                u'As of {deadline}, {platform_name} will require all learners to have complex passwords. Your current '
+                u'password does not meet these requirements. To reset your password, go to to '
+                u'{anchor_tag_open}Account Settings{anchor_tag_close}.'
             )).format(
                 strong_tag_open=HTML('<strong>'),
                 strong_tag_close=HTML('</strong>'),
                 break_line_tag=HTML('<br/>'),
                 platform_name=settings.PLATFORM_NAME,
                 deadline=strftime_localized(deadline, DEFAULT_SHORT_DATE_FORMAT),
-                anchor_tag_open=HTML('<a href="{account_settings_url}">').format(
+                anchor_tag_open=HTML(u'<a href="{account_settings_url}">').format(
                     account_settings_url=settings.LMS_ROOT_URL + "/account/settings"
                 ),
                 anchor_tag_close=HTML('</a>')
diff --git a/openedx/core/djangoapps/profile_images/urls.py b/openedx/core/djangoapps/profile_images/urls.py
index 3270c57b130b89ef6ee3e7272a419dc94f42c97e..06e6d0529f61ad518e59587a6059f901a4c52da5 100644
--- a/openedx/core/djangoapps/profile_images/urls.py
+++ b/openedx/core/djangoapps/profile_images/urls.py
@@ -1,3 +1,4 @@
+# pylint: disable=unicode-format-string
 """
 Defines the URL routes for this app.
 
@@ -5,6 +6,7 @@ NOTE: These views are deprecated.  These routes are superseded by
 ``/api/user/v1/accounts/{username}/image``, found in
 ``openedx.core.djangoapps.user_api.urls``.
 """
+# pylint: enable=unicode-format-string
 
 from django.conf import settings
 from django.conf.urls import url
diff --git a/openedx/core/djangoapps/profile_images/views.py b/openedx/core/djangoapps/profile_images/views.py
index 0086b1eef61406f6752705d8142d377961776f69..5b1b99f782cc02d264a423d0ecab74c003ffbad4 100644
--- a/openedx/core/djangoapps/profile_images/views.py
+++ b/openedx/core/djangoapps/profile_images/views.py
@@ -27,8 +27,8 @@ from .images import IMAGE_TYPES, create_profile_images, remove_profile_images, v
 
 log = logging.getLogger(__name__)
 
-LOG_MESSAGE_CREATE = 'Generated and uploaded images %(image_names)s for user %(user_id)s'
-LOG_MESSAGE_DELETE = 'Deleted images %(image_names)s for user %(user_id)s'
+LOG_MESSAGE_CREATE = u'Generated and uploaded images %(image_names)s for user %(user_id)s'
+LOG_MESSAGE_DELETE = u'Deleted images %(image_names)s for user %(user_id)s'
 
 
 def _make_upload_dt():
diff --git a/openedx/core/djangoapps/programs/management/commands/backpopulate_program_credentials.py b/openedx/core/djangoapps/programs/management/commands/backpopulate_program_credentials.py
index ee4ddccfe2bd5d738869c1e887ef5bb4ab8b3f67..91a9daf0162a7da59902817fb9dbdf8c6b37d5f2 100644
--- a/openedx/core/djangoapps/programs/management/commands/backpopulate_program_credentials.py
+++ b/openedx/core/djangoapps/programs/management/commands/backpopulate_program_credentials.py
@@ -44,10 +44,10 @@ class Command(BaseCommand):
         self._load_usernames()
 
         if options.get('commit'):
-            logger.info('Enqueuing program certification tasks for %d candidates.', len(self.usernames))
+            logger.info(u'Enqueuing program certification tasks for %d candidates.', len(self.usernames))
         else:
             logger.info(
-                'Found %d candidates. To enqueue program certification tasks, pass the -c or --commit flags.',
+                u'Found %d candidates. To enqueue program certification tasks, pass the -c or --commit flags.',
                 len(self.usernames)
             )
             return
@@ -58,14 +58,14 @@ class Command(BaseCommand):
                 award_program_certificates.delay(username)
             except:  # pylint: disable=bare-except
                 failed += 1
-                logger.exception('Failed to enqueue task for user [%s]', username)
+                logger.exception(u'Failed to enqueue task for user [%s]', username)
             else:
                 succeeded += 1
-                logger.debug('Successfully enqueued task for user [%s]', username)
+                logger.debug(u'Successfully enqueued task for user [%s]', username)
 
         logger.info(
-            'Done. Successfully enqueued tasks for %d candidates. '
-            'Failed to enqueue tasks for %d candidates.',
+            u'Done. Successfully enqueued tasks for %d candidates. '
+            u'Failed to enqueue tasks for %d candidates.',
             succeeded,
             failed
         )
@@ -74,7 +74,7 @@ class Command(BaseCommand):
         """Find all course runs which are part of a program."""
         programs = []
         for site in Site.objects.all():
-            logger.info('Loading programs from the catalog for site %s.', site.domain)
+            logger.info(u'Loading programs from the catalog for site %s.', site.domain)
             programs.extend(get_programs(site))
 
         self.course_runs = self._flatten(programs)
diff --git a/openedx/core/djangoapps/programs/signals.py b/openedx/core/djangoapps/programs/signals.py
index 377e29aa84b4e65d77bced1f29d817c23c222072..1c30106e5efbda37123c3d182755b140ebdbdd87 100644
--- a/openedx/core/djangoapps/programs/signals.py
+++ b/openedx/core/djangoapps/programs/signals.py
@@ -44,7 +44,7 @@ def handle_course_cert_awarded(sender, user, course_key, mode, status, **kwargs)
 
     # schedule background task to process
     LOGGER.debug(
-        'handling COURSE_CERT_AWARDED: username=%s, course_key=%s, mode=%s, status=%s',
+        u'handling COURSE_CERT_AWARDED: username=%s, course_key=%s, mode=%s, status=%s',
         user,
         course_key,
         mode,
@@ -83,7 +83,7 @@ def handle_course_cert_changed(sender, user, course_key, mode, status, **kwargs)
 
     verbose = kwargs.get('verbose', False)
     if verbose:
-        msg = "Starting handle_course_cert_changed with params: "\
+        msg = u"Starting handle_course_cert_changed with params: "\
             "sender [{sender}], "\
             "user [{username}], "\
             "course_key [{course_key}], "\
@@ -112,7 +112,7 @@ def handle_course_cert_changed(sender, user, course_key, mode, status, **kwargs)
     if not helpers.get_value_for_org(course_key.org, 'ENABLE_LEARNER_RECORDS', True):
         if verbose:
             LOGGER.info(
-                "Skipping send cert: ENABLE_LEARNER_RECORDS False for org [{org}]".format(
+                u"Skipping send cert: ENABLE_LEARNER_RECORDS False for org [{org}]".format(
                     org=course_key.org
                 )
             )
@@ -120,7 +120,7 @@ def handle_course_cert_changed(sender, user, course_key, mode, status, **kwargs)
 
     # schedule background task to process
     LOGGER.debug(
-        'handling COURSE_CERT_CHANGED: username=%s, course_key=%s, mode=%s, status=%s',
+        u'handling COURSE_CERT_CHANGED: username=%s, course_key=%s, mode=%s, status=%s',
         user,
         course_key,
         mode,
diff --git a/openedx/core/djangoapps/programs/tasks/v1/tasks.py b/openedx/core/djangoapps/programs/tasks/v1/tasks.py
index 69c492bff4b545cc9489b4d0bb9bec7fde1785e9..a5e7b30022c6257b6a7b5a59e23fb5781d8307d4 100644
--- a/openedx/core/djangoapps/programs/tasks/v1/tasks.py
+++ b/openedx/core/djangoapps/programs/tasks/v1/tasks.py
@@ -124,7 +124,7 @@ def award_program_certificates(self, username):
         None
 
     """
-    LOGGER.info('Running task award_program_certificates for username %s', username)
+    LOGGER.info(u'Running task award_program_certificates for username %s', username)
     programs_without_certificates = configuration_helpers.get_value('programs_without_certificates', [])
     if programs_without_certificates:
         if str(programs_without_certificates[0]).lower() == "all":
@@ -147,7 +147,7 @@ def award_program_certificates(self, username):
         try:
             student = User.objects.get(username=username)
         except User.DoesNotExist:
-            LOGGER.exception('Task award_program_certificates was called with invalid username %s', username)
+            LOGGER.exception(u'Task award_program_certificates was called with invalid username %s', username)
             # Don't retry for this case - just conclude the task.
             return
         completed_programs = {}
@@ -156,7 +156,7 @@ def award_program_certificates(self, username):
         if not completed_programs:
             # No reason to continue beyond this point unless/until this
             # task gets updated to support revocation of program certs.
-            LOGGER.info('Task award_program_certificates was called for user %s with no completed programs', username)
+            LOGGER.info(u'Task award_program_certificates was called for user %s with no completed programs', username)
             return
 
         # Determine which program certificates the user has already been awarded, if any.
@@ -167,7 +167,7 @@ def award_program_certificates(self, username):
         awarded_and_skipped_program_uuids = list(set(existing_program_uuids + list(programs_without_certificates)))
 
     except Exception as exc:
-        LOGGER.exception('Failed to determine program certificates to be awarded for user %s', username)
+        LOGGER.exception(u'Failed to determine program certificates to be awarded for user %s', username)
         raise self.retry(exc=exc, countdown=countdown, max_retries=MAX_RETRIES)
 
     # For each completed program for which the student doesn't already have a
@@ -192,10 +192,10 @@ def award_program_certificates(self, username):
             visible_date = completed_programs[program_uuid]
             try:
                 award_program_certificate(credentials_client, username, program_uuid, visible_date)
-                LOGGER.info('Awarded certificate for program %s to user %s', program_uuid, username)
+                LOGGER.info(u'Awarded certificate for program %s to user %s', program_uuid, username)
             except exceptions.HttpNotFoundError:
                 LOGGER.exception(
-                    """Certificate for program {uuid} could not be found. Unable to award certificate to user
+                    u"""Certificate for program {uuid} could not be found. Unable to award certificate to user
                     {username}. The program might not be configured.""".format(uuid=program_uuid, username=username)
                 )
             except exceptions.HttpClientError as exc:
@@ -206,39 +206,39 @@ def award_program_certificates(self, username):
                 if exc.response.status_code == 429:  # pylint: disable=no-member
                     rate_limit_countdown = 60
                     LOGGER.info(
-                        """Rate limited. Retrying task to award certificates to user {username} in {countdown}
+                        u"""Rate limited. Retrying task to award certificates to user {username} in {countdown}
                         seconds""".format(username=username, countdown=rate_limit_countdown)
                     )
                     # Retry after 60 seconds, when we should be in a new throttling window
                     raise self.retry(exc=exc, countdown=rate_limit_countdown, max_retries=MAX_RETRIES)
                 else:
                     LOGGER.exception(
-                        """Unable to award certificate to user {username} for program {uuid}. The program might not be
+                        u"""Unable to award certificate to user {username} for program {uuid}. The program might not be
                         configured.""".format(username=username, uuid=program_uuid)
                     )
             except Exception:  # pylint: disable=broad-except
                 # keep trying to award other certs, but retry the whole task to fix any missing entries
-                LOGGER.warning('Failed to award certificate for program {uuid} to user {username}.'.format(
+                LOGGER.warning(u'Failed to award certificate for program {uuid} to user {username}.'.format(
                     uuid=program_uuid, username=username))
                 failed_program_certificate_award_attempts.append(program_uuid)
 
         if failed_program_certificate_award_attempts:
             # N.B. This logic assumes that this task is idempotent
-            LOGGER.info('Retrying task to award failed certificates to user %s', username)
+            LOGGER.info(u'Retrying task to award failed certificates to user %s', username)
             # The error message may change on each reattempt but will never be raised until
             # the max number of retries have been exceeded. It is unlikely that this list
             # will change by the time it reaches its maximimum number of attempts.
             exception = MaxRetriesExceededError(
-                "Failed to award certificate for user {} for programs {}".format(
+                u"Failed to award certificate for user {} for programs {}".format(
                     username, failed_program_certificate_award_attempts))
             raise self.retry(
                 exc=exception,
                 countdown=countdown,
                 max_retries=MAX_RETRIES)
     else:
-        LOGGER.info('User %s is not eligible for any new program certificates', username)
+        LOGGER.info(u'User %s is not eligible for any new program certificates', username)
 
-    LOGGER.info('Successfully completed the task award_program_certificates for username %s', username)
+    LOGGER.info(u'Successfully completed the task award_program_certificates for username %s', username)
 
 
 def post_course_certificate(client, username, certificate, visible_date):
@@ -268,7 +268,7 @@ def award_course_certificate(self, username, course_run_key):
     This task is designed to be called whenever a student GeneratedCertificate is updated.
     It can be called independently for a username and a course_run, but is invoked on each GeneratedCertificate.save.
     """
-    LOGGER.info('Running task award_course_certificate for username %s', username)
+    LOGGER.info(u'Running task award_course_certificate for username %s', username)
 
     countdown = 2 ** self.request.retries
 
@@ -288,7 +288,7 @@ def award_course_certificate(self, username, course_run_key):
         try:
             user = User.objects.get(username=username)
         except User.DoesNotExist:
-            LOGGER.exception('Task award_course_certificate was called with invalid username %s', username)
+            LOGGER.exception(u'Task award_course_certificate was called with invalid username %s', username)
             # Don't retry for this case - just conclude the task.
             return
         # Get the cert for the course key and username if it's both passing and available in professional/verified
@@ -299,7 +299,7 @@ def award_course_certificate(self, username, course_run_key):
             )
         except GeneratedCertificate.DoesNotExist:
             LOGGER.exception(
-                'Task award_course_certificate was called without Certificate found for %s to user %s',
+                u'Task award_course_certificate was called without Certificate found for %s to user %s',
                 course_key,
                 username
             )
@@ -309,7 +309,7 @@ def award_course_certificate(self, username, course_run_key):
                 course_overview = CourseOverview.get_from_id(course_key)
             except (CourseOverview.DoesNotExist, IOError):
                 LOGGER.exception(
-                    'Task award_course_certificate was called without course overview data for course %s',
+                    u'Task award_course_certificate was called without course overview data for course %s',
                     course_key
                 )
                 return
@@ -323,7 +323,7 @@ def award_course_certificate(self, username, course_run_key):
             visible_date = available_date_for_certificate(course_overview, certificate)
             post_course_certificate(credentials_client, username, certificate, visible_date)
 
-            LOGGER.info('Awarded certificate for course %s to user %s', course_key, username)
+            LOGGER.info(u'Awarded certificate for course %s to user %s', course_key, username)
     except Exception as exc:
-        LOGGER.exception('Failed to determine course certificates to be awarded for user %s', username)
+        LOGGER.exception(u'Failed to determine course certificates to be awarded for user %s', username)
         raise self.retry(exc=exc, countdown=countdown, max_retries=MAX_RETRIES)
diff --git a/openedx/core/djangoapps/programs/tasks/v1/tests/test_tasks.py b/openedx/core/djangoapps/programs/tasks/v1/tests/test_tasks.py
index bba5fcb94f0e919b4a7cd33e970901ca959f9f67..eeeae5bb91111d2375c69884001ebf80dc96465a 100644
--- a/openedx/core/djangoapps/programs/tasks/v1/tests/test_tasks.py
+++ b/openedx/core/djangoapps/programs/tasks/v1/tests/test_tasks.py
@@ -319,7 +319,7 @@ class AwardProgramCertificatesTestCase(CatalogIntegrationMixin, CredentialsApiCo
 
         self.assertEqual(mock_award_program_certificate.call_count, 3)
         mock_warning.assert_called_once_with(
-            'Failed to award certificate for program {uuid} to user {username}.'.format(
+            u'Failed to award certificate for program {uuid} to user {username}.'.format(
                 uuid=1,
                 username=self.student.username)
         )
diff --git a/openedx/core/djangoapps/programs/utils.py b/openedx/core/djangoapps/programs/utils.py
index 05400ca3bfead63bbb5a55326155d424b21fa350..3aa7eb1e57093bef40ca753144e9748731c06297 100644
--- a/openedx/core/djangoapps/programs/utils.py
+++ b/openedx/core/djangoapps/programs/utils.py
@@ -500,7 +500,7 @@ class ProgramDataExtender(object):
                 try:
                     self.course_overview = CourseOverview.get_from_id(self.course_run_key)
                 except CourseOverview.DoesNotExist:
-                    log.warning('Failed to get course overview for course run key: %s',
+                    log.warning(u'Failed to get course overview for course run key: %s',
                                 self.course_run.get('key'),
                                 exec_info=True)
                 else:
@@ -695,7 +695,7 @@ class ProgramDataExtender(object):
                     'variant': bundle_variant
                 })
             except (ConnectionError, SlumberBaseException, Timeout):
-                log.exception('Failed to get discount price for following product SKUs: %s ', ', '.join(skus))
+                log.exception(u'Failed to get discount price for following product SKUs: %s ', ', '.join(skus))
                 self.data.update({
                     'discount_data': {'is_discounted': False}
                 })
diff --git a/openedx/core/djangoapps/safe_sessions/middleware.py b/openedx/core/djangoapps/safe_sessions/middleware.py
index 670cf459dd4ae097c70bf4579d521b22bedba704..a16d4feb36cc9848009324b6a098da81564243b0 100644
--- a/openedx/core/djangoapps/safe_sessions/middleware.py
+++ b/openedx/core/djangoapps/safe_sessions/middleware.py
@@ -146,12 +146,12 @@ class SafeCookieData(object):
             safe_cookie_data = SafeCookieData(*raw_cookie_components)
         except TypeError:
             raise SafeCookieError(
-                "SafeCookieData BWC parse error: {0!r}.".format(safe_cookie_string)
+                u"SafeCookieData BWC parse error: {0!r}.".format(safe_cookie_string)
             )
         else:
             if safe_cookie_data.version != cls.CURRENT_VERSION:
                 raise SafeCookieError(
-                    "SafeCookieData version {0!r} is not supported. Current version is {1}.".format(
+                    u"SafeCookieData version {0!r} is not supported. Current version is {1}.".format(
                         safe_cookie_data.version,
                         cls.CURRENT_VERSION,
                     ))
@@ -182,10 +182,10 @@ class SafeCookieData(object):
             unsigned_data = signing.loads(self.signature, salt=self.key_salt, max_age=settings.SESSION_COOKIE_AGE)
             if unsigned_data == self._compute_digest(user_id):
                 return True
-            log.error("SafeCookieData '%r' is not bound to user '%s'.", unicode(self), user_id)
+            log.error(u"SafeCookieData '%r' is not bound to user '%s'.", unicode(self), user_id)
         except signing.BadSignature as sig_error:
             log.error(
-                "SafeCookieData signature error for cookie data {0!r}: {1}".format(  # pylint: disable=logging-format-interpolation
+                u"SafeCookieData signature error for cookie data {0!r}: {1}".format(  # pylint: disable=logging-format-interpolation
                     unicode(self),
                     text_type(sig_error),
                 )
@@ -215,7 +215,7 @@ class SafeCookieData(object):
         if not session_id or session_id == unicode(None):
             # The session ID should always be valid in the cookie.
             raise SafeCookieError(
-                "SafeCookieData not created due to invalid value for session_id '{}' for user_id '{}'.".format(
+                u"SafeCookieData not created due to invalid value for session_id '{}' for user_id '{}'.".format(
                     session_id,
                     user_id,
                 ))
@@ -226,7 +226,7 @@ class SafeCookieData(object):
             # as some of the session requests are made as
             # Anonymous users.
             log.debug(
-                "SafeCookieData received empty user_id '%s' for session_id '%s'.",
+                u"SafeCookieData received empty user_id '%s' for session_id '%s'.",
                 user_id,
                 session_id,
             )
@@ -367,14 +367,14 @@ class SafeSessionMiddleware(SessionMiddleware):
                 # conditionally set the log level.
                 log_func = log.debug if request.user.id is None else log.warning
                 log_func(
-                    "SafeCookieData user at request '{0}' does not match user at response: '{1}'".format(
+                    u"SafeCookieData user at request '{0}' does not match user at response: '{1}'".format(
                         request.safe_cookie_verified_user_id,
                         request.user.id,
                     ),
                 )
             if request.safe_cookie_verified_user_id != userid_in_session:
                 log.warning(
-                    "SafeCookieData user at request '{0}' does not match user in session: '{1}'".format(  # pylint: disable=logging-format-interpolation
+                    u"SafeCookieData user at request '{0}' does not match user in session: '{1}'".format(  # pylint: disable=logging-format-interpolation
                         request.safe_cookie_verified_user_id,
                         userid_in_session,
                     ),
diff --git a/openedx/core/djangoapps/safe_sessions/tests/test_utils.py b/openedx/core/djangoapps/safe_sessions/tests/test_utils.py
index 4dca196ceaf34065e3d59739804ce88b08b57a87..28185a717afb98362292f4ead9b2fb626d5a5f0a 100644
--- a/openedx/core/djangoapps/safe_sessions/tests/test_utils.py
+++ b/openedx/core/djangoapps/safe_sessions/tests/test_utils.py
@@ -120,7 +120,7 @@ class TestSafeSessionsLogMixin(object):
         was not equal to user at response
         """
         with self.assert_logged_with_message(
-            "SafeCookieData user at request '{}' does not match user at response: '{}'".format(
+            u"SafeCookieData user at request '{}' does not match user at response: '{}'".format(
                 user_at_request, user_at_response
             ),
             log_level=log_level,
@@ -134,7 +134,7 @@ class TestSafeSessionsLogMixin(object):
         was not equal to user at session
         """
         with self.assert_logged_with_message(
-            "SafeCookieData user at request '{}' does not match user in session: '{}'".format(
+            u"SafeCookieData user at request '{}' does not match user in session: '{}'".format(
                 user_at_request, user_in_session
             ),
             log_level='warning',
diff --git a/openedx/core/djangoapps/schedules/admin.py b/openedx/core/djangoapps/schedules/admin.py
index 86c89de6731d1de8810f6e43f0c1113f4c7af5dd..dedd85aa6e47b5944a22393072d2933e5763db9d 100644
--- a/openedx/core/djangoapps/schedules/admin.py
+++ b/openedx/core/djangoapps/schedules/admin.py
@@ -34,14 +34,20 @@ def _set_experience(db_name, human_name, modeladmin, request, queryset):
     ).update(
         experience_type=db_name
     )
-    modeladmin.message_user(request, "{} schedule(s) were changed to use the {} experience".format(rows_updated, human_name))
+    modeladmin.message_user(
+        request,
+        u"{} schedule(s) were changed to use the {} experience".format(
+            rows_updated,
+            human_name,
+        )
+    )
 
 
 # Generate a list of all "set_experience_to_X" actions
 experience_actions = []
 for (db_name, human_name) in models.ScheduleExperience.EXPERIENCES:
     partial = functools.partial(_set_experience, db_name, human_name)
-    partial.short_description = "Convert the selected schedules to the {} experience".format(human_name)
+    partial.short_description = u"Convert the selected schedules to the {} experience".format(human_name)
     partial.__name__ = "set_experience_to_{}".format(db_name)
     experience_actions.append(partial)
 
@@ -128,12 +134,12 @@ class ScheduleAdmin(admin.ModelAdmin):
 
     def deactivate_schedules(self, request, queryset):
         rows_updated = queryset.update(active=False)
-        self.message_user(request, "{} schedule(s) were deactivated".format(rows_updated))
+        self.message_user(request, u"{} schedule(s) were deactivated".format(rows_updated))
     deactivate_schedules.short_description = "Deactivate selected schedules"
 
     def activate_schedules(self, request, queryset):
         rows_updated = queryset.update(active=True)
-        self.message_user(request, "{} schedule(s) were activated".format(rows_updated))
+        self.message_user(request, u"{} schedule(s) were activated".format(rows_updated))
     activate_schedules.short_description = "Activate selected schedules"
 
     def experience_display(self, obj):
diff --git a/openedx/core/djangoapps/schedules/content_highlights.py b/openedx/core/djangoapps/schedules/content_highlights.py
index be0e40c1a86a3871452e25e2fd0bb3261f83d73c..3bf296821ad15c48e4e9ab8e11ba5b2128bcc5c2 100644
--- a/openedx/core/djangoapps/schedules/content_highlights.py
+++ b/openedx/core/djangoapps/schedules/content_highlights.py
@@ -66,14 +66,14 @@ def _get_course_with_highlights(course_key):
     # pylint: disable=missing-docstring
     if not COURSE_UPDATE_WAFFLE_FLAG.is_enabled(course_key):
         raise CourseUpdateDoesNotExist(
-            "%s Course Update Messages waffle flag is disabled.",
+            u"%s Course Update Messages waffle flag is disabled.",
             course_key,
         )
 
     course_descriptor = _get_course_descriptor(course_key)
     if not course_descriptor.highlights_enabled_for_messaging:
         raise CourseUpdateDoesNotExist(
-            "%s Course Update Messages are disabled.",
+            u"%s Course Update Messages are disabled.",
             course_key,
         )
 
@@ -84,7 +84,7 @@ def _get_course_descriptor(course_key):
     course_descriptor = modulestore().get_course(course_key, depth=1)
     if course_descriptor is None:
         raise CourseUpdateDoesNotExist(
-            "Course {} not found.".format(course_key)
+            u"Course {} not found.".format(course_key)
         )
     return course_descriptor
 
@@ -116,7 +116,7 @@ def _get_highlights_for_week(sections, week_num, course_key):
     num_sections = len(sections)
     if not (1 <= week_num <= num_sections):
         raise CourseUpdateDoesNotExist(
-            "Requested week {} but {} has only {} sections.".format(
+            u"Requested week {} but {} has only {} sections.".format(
                 week_num, course_key, num_sections
             )
         )
diff --git a/openedx/core/djangoapps/schedules/management/commands/__init__.py b/openedx/core/djangoapps/schedules/management/commands/__init__.py
index ed7b737386d8b8c93e378e5a87879c8d7a8c28cb..09a022953cb1288b4d3eef84815dc89a1d9ba86d 100644
--- a/openedx/core/djangoapps/schedules/management/commands/__init__.py
+++ b/openedx/core/djangoapps/schedules/management/commands/__init__.py
@@ -30,10 +30,10 @@ class SendEmailBaseCommand(PrefixedDebugLoggerMixin, BaseCommand):
             *[int(x) for x in options['date'].split('-')],
             tzinfo=pytz.UTC
         )
-        self.log_debug('Current date = %s', current_date.isoformat())
+        self.log_debug(u'Current date = %s', current_date.isoformat())
 
         site = Site.objects.get(domain__iexact=options['site_domain_name'])
-        self.log_debug('Running for site %s', site.domain)
+        self.log_debug(u'Running for site %s', site.domain)
 
         override_recipient_email = options.get('override_recipient_email')
         self.send_emails(site, current_date, override_recipient_email)
diff --git a/openedx/core/djangoapps/schedules/management/commands/setup_models_to_send_test_emails.py b/openedx/core/djangoapps/schedules/management/commands/setup_models_to_send_test_emails.py
index 85c3165d5ceddf9c61c93a00b75b7c104ac6a34c..138c20e8a561c6414718795e9fcfd6480dba0882 100644
--- a/openedx/core/djangoapps/schedules/management/commands/setup_models_to_send_test_emails.py
+++ b/openedx/core/djangoapps/schedules/management/commands/setup_models_to_send_test_emails.py
@@ -66,7 +66,7 @@ class Command(BaseCommand):
             start=datetime.datetime.today() - datetime.timedelta(days=30),
             end=datetime.datetime.today() + datetime.timedelta(days=30),
             number=factory.Sequence('schedules_test_course_{}'.format),
-            display_name=factory.Sequence('Schedules Test Course {}'.format),
+            display_name=factory.Sequence(u'Schedules Test Course {}'.format),
         )
         XMODULE_FACTORY_LOCK.disable()
         course_overview = CourseOverview.load_from_module_store(course.id)
diff --git a/openedx/core/djangoapps/schedules/management/commands/tests/send_email_base.py b/openedx/core/djangoapps/schedules/management/commands/tests/send_email_base.py
index d80b5d3e02bd1af79407397f124a775e2857f3ca..de250b96016986a051411702412856cd3a675184 100644
--- a/openedx/core/djangoapps/schedules/management/commands/tests/send_email_base.py
+++ b/openedx/core/djangoapps/schedules/management/commands/tests/send_email_base.py
@@ -111,7 +111,7 @@ class ScheduleSendEmailTestMixin(FilteredQueryCountMixin):
 
     def _get_template_overrides(self):
         templates_override = deepcopy(settings.TEMPLATES)
-        templates_override[0]['OPTIONS']['string_if_invalid'] = "TEMPLATE WARNING - MISSING VARIABLE [%s]"
+        templates_override[0]['OPTIONS']['string_if_invalid'] = u"TEMPLATE WARNING - MISSING VARIABLE [%s]"
         return templates_override
 
     def _schedule_factory(self, offset=None, **factory_kwargs):
@@ -187,7 +187,7 @@ class ScheduleSendEmailTestMixin(FilteredQueryCountMixin):
             target_day_str = serialize(target_day)
 
             for b in range(self.task.num_bins):
-                LOG.debug('Checking bin %d', b)
+                LOG.debug(u'Checking bin %d', b)
                 expected_queries = NUM_QUERIES_SITE_SCHEDULES
                 if b in bins_in_use:
                     if is_first_match:
diff --git a/openedx/core/djangoapps/schedules/management/commands/tests/test_send_course_update.py b/openedx/core/djangoapps/schedules/management/commands/tests/test_send_course_update.py
index 9e4c395847daee08457b9381903bcc2b09882d5b..f95012f919b3d52bae07be8e23a36cba0d973785 100644
--- a/openedx/core/djangoapps/schedules/management/commands/tests/test_send_course_update.py
+++ b/openedx/core/djangoapps/schedules/management/commands/tests/test_send_course_update.py
@@ -49,7 +49,7 @@ class TestSendCourseUpdate(ScheduleUpsellTestMixin, ScheduleSendEmailTestMixin,
         super(TestSendCourseUpdate, self).setUp()
         self.highlights_patcher = patch('openedx.core.djangoapps.schedules.resolvers.get_week_highlights')
         mock_highlights = self.highlights_patcher.start()
-        mock_highlights.return_value = ['Highlight {}'.format(num + 1) for num in range(3)]
+        mock_highlights.return_value = [u'Highlight {}'.format(num + 1) for num in range(3)]
         self.addCleanup(self.stop_highlights_patcher)
 
     def stop_highlights_patcher(self):
diff --git a/openedx/core/djangoapps/schedules/resolvers.py b/openedx/core/djangoapps/schedules/resolvers.py
index 1fad58c654e6eaab04bca830227c16309701dd87..40575f5409b6e3aae170ce7bd9d34e8af8a22597 100644
--- a/openedx/core/djangoapps/schedules/resolvers.py
+++ b/openedx/core/djangoapps/schedules/resolvers.py
@@ -135,13 +135,13 @@ class BinnedSchedulesBaseResolver(PrefixedDebugLoggerMixin, RecipientResolver):
         if "read_replica" in settings.DATABASES:
             schedules = schedules.using("read_replica")
 
-        LOG.info('Query = %r', schedules.query.sql_with_params())
+        LOG.info(u'Query = %r', schedules.query.sql_with_params())
 
         with function_trace('schedule_query_set_evaluation'):
             # This will run the query and cache all of the results in memory.
             num_schedules = len(schedules)
 
-        LOG.info('Number of schedules = %d', num_schedules)
+        LOG.info(u'Number of schedules = %d', num_schedules)
 
         # This should give us a sense of the volume of data being processed by each task.
         set_custom_metric('num_schedules', num_schedules)
@@ -352,7 +352,7 @@ class CourseUpdateResolver(BinnedSchedulesBaseResolver):
                 week_highlights = get_week_highlights(user, enrollment.course_id, week_num)
             except CourseUpdateDoesNotExist:
                 LOG.warning(
-                    'Weekly highlights for user {} in week {} of course {} does not exist or is disabled'.format(
+                    u'Weekly highlights for user {} in week {} of course {} does not exist or is disabled'.format(
                         user, week_num, enrollment.course_id
                     )
                 )
diff --git a/openedx/core/djangoapps/schedules/signals.py b/openedx/core/djangoapps/schedules/signals.py
index f6d9dedb3d7d8ec7c1dc9e9239fdb1a5067679a4..39be935826afa4fa7b557525f5859f5134f53bad 100644
--- a/openedx/core/djangoapps/schedules/signals.py
+++ b/openedx/core/djangoapps/schedules/signals.py
@@ -39,7 +39,7 @@ def create_schedule(sender, **kwargs):  # pylint: disable=unused-argument
         if schedule_details:
             log.debug(
                 'Schedules: created a new schedule starting at ' +
-                '%s with an upgrade deadline of %s and experience type: %s',
+                u'%s with an upgrade deadline of %s and experience type: %s',
                 schedule_details['content_availability_date'],
                 schedule_details['upgrade_deadline'],
                 ScheduleExperience.EXPERIENCES[schedule_details['experience_type']]
@@ -47,7 +47,7 @@ def create_schedule(sender, **kwargs):  # pylint: disable=unused-argument
     except Exception:  # pylint: disable=broad-except
         # We do not want to block the creation of a CourseEnrollment because of an error in creating a Schedule.
         # No Schedule is acceptable, but no CourseEnrollment is not.
-        log.exception('Encountered error in creating a Schedule for CourseEnrollment for user {} in course {}'.format(
+        log.exception(u'Encountered error in creating a Schedule for CourseEnrollment for user {} in course {}'.format(
             enrollment.user.id if (enrollment and enrollment.user) else None,
             enrollment.course_id if enrollment else None
         ))
diff --git a/openedx/core/djangoapps/schedules/tasks.py b/openedx/core/djangoapps/schedules/tasks.py
index a7f35ff6291fbf02ea670195c59ebeab1e70e7d3..5782a5a5cd072590dc9dc4bce4e7cd3a57f8267b 100644
--- a/openedx/core/djangoapps/schedules/tasks.py
+++ b/openedx/core/djangoapps/schedules/tasks.py
@@ -53,7 +53,7 @@ def update_course_schedules(self, **kwargs):
         )
     except Exception as exc:
         if not isinstance(exc, KNOWN_RETRY_ERRORS):
-            LOG.exception("Unexpected failure: task id: %s, kwargs=%s".format(self.request.id, kwargs))
+            LOG.exception(u"Unexpected failure: task id: {}, kwargs={}".format(self.request.id, kwargs))
         raise self.retry(kwargs=kwargs, exc=exc)
 
 
@@ -89,11 +89,11 @@ class ScheduleMessageBaseTask(LoggedTask):
         current_date = resolvers._get_datetime_beginning_of_day(current_date)
 
         if not cls.is_enqueue_enabled(site):
-            cls.log_info('Message queuing disabled for site %s', site.domain)
+            cls.log_info(u'Message queuing disabled for site %s', site.domain)
             return
 
         target_date = current_date + datetime.timedelta(days=day_offset)
-        cls.log_info('Target date = %s', target_date.isoformat())
+        cls.log_info(u'Target date = %s', target_date.isoformat())
         for bin in range(cls.num_bins):
             task_args = (
                 site.id,
@@ -102,7 +102,7 @@ class ScheduleMessageBaseTask(LoggedTask):
                 bin,
                 override_recipient_email,
             )
-            cls.log_info('Launching task with args = %r', task_args)
+            cls.log_info(u'Launching task with args = %r', task_args)
             cls().apply_async(
                 task_args,
                 retry=False,
@@ -205,7 +205,7 @@ def _schedule_send(msg_str, site_id, delivery_config_var, log_prefix):
         user = User.objects.get(username=msg.recipient.username)
         with emulate_http_request(site=site, user=user):
             _annonate_send_task_for_monitoring(msg)
-            LOG.debug('%s: Sending message = %s', log_prefix, msg_str)
+            LOG.debug(u'%s: Sending message = %s', log_prefix, msg_str)
             ace.send(msg)
             _track_message_sent(site, user, msg)
 
@@ -250,7 +250,7 @@ def _is_delivery_enabled(site, delivery_config_var, log_prefix):
     if getattr(ScheduleConfig.current(site), delivery_config_var, False):
         return True
     else:
-        LOG.info('%s: Message delivery disabled for site %s', log_prefix, site.domain)
+        LOG.info(u'%s: Message delivery disabled for site %s', log_prefix, site.domain)
 
 
 def _annotate_for_monitoring(message_type, site, bin_num, target_day_str, day_offset):
diff --git a/openedx/core/djangoapps/schedules/tests/test_tasks.py b/openedx/core/djangoapps/schedules/tests/test_tasks.py
index ad2bf113ac01b3cc2087ccdfd37b7b3013daf159..cfb7095c5dcb82dc6ba4bece5d7fcb2addd0f4be 100644
--- a/openedx/core/djangoapps/schedules/tests/test_tasks.py
+++ b/openedx/core/djangoapps/schedules/tests/test_tasks.py
@@ -38,7 +38,7 @@ class TestScheduleMessageBaseTask(CacheIsolationTestCase):
                 day_offset=2
             )
             patches['log_info'].assert_called_once_with(
-                'Message queuing disabled for site %s', self.site.domain)
+                u'Message queuing disabled for site %s', self.site.domain)
             send.apply_async.assert_not_called()
 
     @ddt.data(0, 2, -3)
@@ -59,7 +59,7 @@ class TestScheduleMessageBaseTask(CacheIsolationTestCase):
             target_date = current_date.replace(hour=0, minute=0, second=0, microsecond=0) + \
                 datetime.timedelta(day_offset)
             patches['log_info'].assert_any_call(
-                'Target date = %s', target_date.isoformat())
+                u'Target date = %s', target_date.isoformat())
             assert send.call_count == DEFAULT_NUM_BINS
 
     @ddt.data(True, False)