From f294b1a37469aa8968fe67eb8918bbeb8b326a87 Mon Sep 17 00:00:00 2001 From: Matthew Piatetsky Date: Tue, 5 Feb 2019 09:44:26 -0500 Subject: [PATCH] fix unicode strings in openedx/ part 1 --- .../djangoapps/ace_common/templatetags/ace.py | 8 ++-- openedx/core/djangoapps/api_admin/admin.py | 9 +++-- openedx/core/djangoapps/api_admin/forms.py | 2 +- openedx/core/djangoapps/api_admin/models.py | 10 ++--- .../djangoapps/api_admin/tests/test_forms.py | 2 +- .../djangoapps/api_admin/tests/test_models.py | 4 +- openedx/core/djangoapps/api_admin/widgets.py | 13 ++++--- .../core/djangoapps/auth_exchange/forms.py | 8 ++-- .../auth_exchange/tests/test_views.py | 2 +- .../djangoapps/auth_exchange/tests/utils.py | 4 +- openedx/core/djangoapps/bookmarks/tasks.py | 2 +- .../djangoapps/cache_toolbox/middleware.py | 2 +- .../management/commands/cache_programs.py | 30 +++++++-------- .../commands/create_catalog_integrations.py | 4 +- .../management/commands/sync_course_runs.py | 10 ++--- .../commands/tests/test_sync_course_runs.py | 6 +-- .../djangoapps/catalog/tests/test_utils.py | 12 +++--- openedx/core/djangoapps/catalog/utils.py | 22 +++++------ openedx/core/djangoapps/ccxcon/api.py | 18 ++++----- openedx/core/djangoapps/ccxcon/tasks.py | 6 +-- .../block_structure/block_structure.py | 4 +- .../content/block_structure/exceptions.py | 2 +- .../content/block_structure/manager.py | 2 +- .../content/block_structure/store.py | 6 +-- .../content/block_structure/tasks.py | 6 +-- .../content/block_structure/tests/helpers.py | 2 +- .../block_structure/tests/test_store.py | 2 +- .../content/block_structure/transformers.py | 4 +- .../management/commands/simulate_publish.py | 26 ++++++------- .../content/course_overviews/models.py | 16 ++++---- .../content/course_overviews/signals.py | 2 +- .../tests/test_course_overviews.py | 2 +- .../djangoapps/contentserver/middleware.py | 6 +-- .../contentserver/test/test_contentserver.py | 6 +-- .../core/djangoapps/cors_csrf/middleware.py | 2 +- openedx/core/djangoapps/cors_csrf/models.py | 2 +- .../cors_csrf/tests/test_middleware.py | 2 +- .../core/djangoapps/course_groups/cohorts.py | 6 +-- .../core/djangoapps/course_groups/models.py | 5 +-- .../course_groups/partition_scheme.py | 4 +- .../djangoapps/course_groups/serializers.py | 2 +- .../course_groups/tests/test_api_views.py | 2 +- .../course_groups/tests/test_views.py | 4 +- .../core/djangoapps/course_groups/views.py | 8 ++-- .../management/commands/notify_credentials.py | 21 +++++----- .../core/djangoapps/credentials/signals.py | 12 +++--- .../djangoapps/credentials/tasks/v1/tasks.py | 6 +-- .../core/djangoapps/credit/api/provider.py | 4 +- openedx/core/djangoapps/credit/email_utils.py | 15 ++++---- openedx/core/djangoapps/credit/services.py | 14 +++---- openedx/core/djangoapps/credit/tasks.py | 10 ++--- .../core/djangoapps/credit/tests/test_api.py | 6 +-- openedx/core/djangoapps/dark_lang/tests.py | 2 +- openedx/core/djangoapps/dark_lang/views.py | 2 +- openedx/core/djangoapps/debug/views.py | 2 +- openedx/core/djangoapps/embargo/forms.py | 2 +- openedx/core/djangoapps/embargo/models.py | 4 +- .../core/djangoapps/embargo/tests/test_api.py | 2 +- .../djangoapps/external_auth/djangostore.py | 8 ++-- .../tests/test_openid_provider.py | 8 ++-- .../external_auth/tests/test_shib.py | 2 +- .../external_auth/tests/test_ssl.py | 18 ++++----- .../core/djangoapps/external_auth/views.py | 14 +++---- openedx/core/djangoapps/geoinfo/middleware.py | 2 +- .../core/djangoapps/heartbeat/runchecks.py | 5 +-- .../core/djangoapps/models/course_details.py | 8 ++-- .../tests/test_clear_expired_tokens.py | 4 +- .../oauth_dispatch/tests/test_views.py | 4 +- .../core/djangoapps/password_policy/apps.py | 2 +- .../djangoapps/password_policy/compliance.py | 12 +++--- .../core/djangoapps/profile_images/urls.py | 2 + .../core/djangoapps/profile_images/views.py | 4 +- .../backpopulate_program_credentials.py | 14 +++---- openedx/core/djangoapps/programs/signals.py | 8 ++-- .../djangoapps/programs/tasks/v1/tasks.py | 38 +++++++++---------- .../programs/tasks/v1/tests/test_tasks.py | 2 +- openedx/core/djangoapps/programs/utils.py | 4 +- .../djangoapps/safe_sessions/middleware.py | 16 ++++---- .../safe_sessions/tests/test_utils.py | 4 +- openedx/core/djangoapps/schedules/admin.py | 14 +++++-- .../schedules/content_highlights.py | 8 ++-- .../schedules/management/commands/__init__.py | 4 +- .../setup_models_to_send_test_emails.py | 2 +- .../commands/tests/send_email_base.py | 4 +- .../commands/tests/test_send_course_update.py | 2 +- .../core/djangoapps/schedules/resolvers.py | 6 +-- openedx/core/djangoapps/schedules/signals.py | 4 +- openedx/core/djangoapps/schedules/tasks.py | 12 +++--- .../djangoapps/schedules/tests/test_tasks.py | 4 +- 89 files changed, 323 insertions(+), 315 deletions(-) diff --git a/openedx/core/djangoapps/ace_common/templatetags/ace.py b/openedx/core/djangoapps/ace_common/templatetags/ace.py index 71deeb9a4e..287b8a432f 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('').format(HTML(image_url)) + HTML(u'').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 63bdcf4b09..4d1822787b 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='{0}'.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'{0}').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 97a45bf951..796dd00913 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 08631f519e..8efa30796e 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 4c4ff65d8c..f9a27ecf35 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 = ''.format( + expected_widget_html = u''.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 808c3bc877..3a7b651f1a 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 0bef4dd37a..25e3392cc0 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=''.format(url=reverse('api_admin:api-tos')), - link_end='', + link_start=HTML(u'').format(url=reverse('api_admin:api-tos')), + link_end=HTML(''), ) - html = u' '.format( + html = HTML(u' ').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 c39f9642a6..6c18e10a69 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 c757000d0b..8905d7951e 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 49f8d16437..db6fa91c1b 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 172a5c07c1..1b07c4c8fb 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 1bdec1b45c..e156ef2e7e 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 17ed81f256..9e83c03a35 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 b4f23a9dd6..f85b3e2ece 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 ea2540cabe..86ae6540a7 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 a8fc43f3d6..b8492bbbe2 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 5b809694e4..6122cef7be 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 61e40ce4d0..9fb74c0cf8 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 43c40c6e80..a1cc05e9a3 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 6dc52829db..6822d67584 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 5d74fd2049..43839c9718 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 8e78805530..750ac7a8f0 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 9ed40525cc..4e2052e97b 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 959a2fb11c..0ea0d1dcad 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 c97d0bf700..9c5e91ce8d 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 83e5b2d666..bd37e0c51e 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 82feb4b6b7..52241cd414 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 7c5347c02e..aaaf740e7e 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 cd2dd76639..048ec400eb 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 6d1998c92f..e6f4382f64 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 744adf779c..f80d92a777 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 4708b442a1..20c738ceaa 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 7d3b8a5083..ed587049ce 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 afe5cdcb85..a2d16aac5d 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 7478d54287..805354e26d 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 02b66ac1af..44194fb246 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 9c6480ba92..294cd45b98 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 415a026eb9..bc4e63064b 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 89cdf19864..7bb9a015b2 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 76f0976755..55965a3aeb 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 3867a776c5..a21d367f0c 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 1e8bf27a9b..d75441b45d 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 0c3de5ab70..f3b66d70db 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 a28eb94b2c..18fbeb86e6 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 086ba62aa0..88a265c04f 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 95a2a45550..41924c28c3 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 630aafc588..ea11d0be50 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 453163d2e3..c139cb9929 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 fc5108d96b..4c418774f7 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('' + html_without_css) + html_with_inline_css = pynliner.fromString(HTML('{}').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 57cc57d9f7..50e4a1d27e 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 b4a050213f..81682bccb0 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 f712f3f2a5..77ef4454e6 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 17e361a9c4..9b5d562ac8 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 ae2c0a406c..ffc968e517 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 bbd2dd753c..d0a4da96ed 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 9ba0b71ef7..6c4e8608e7 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 15a620f3e1..365f0e0b48 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 9ddfa6759b..11093519a0 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 e69ce85806..3a10c343ea 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 16c3c2bfd8..14bcf3d340 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 ( '', @@ -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 ccf20ef976..53072c8f28 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 ea8dc31f88..1885d7ee4f 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 3f147f207e..53cff9de37 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 d256501777..cf89c787e8 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 c6972fc4de..82d1e88d34 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 7f3aa76465..3d3dae7d16 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 = ( - '' + HTML(u'').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 cdd907389d..db71e2f325 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 aae611079c..1cf00d9f1d 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 025c04ddb7..9905cf3abf 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 27e3e1d5b7..742ba79ae8 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_tag_close=HTML(''), break_line_tag=HTML('
'), platform_name=settings.PLATFORM_NAME, deadline=strftime_localized(deadline, DEFAULT_SHORT_DATE_FORMAT), - anchor_tag_open=HTML('').format( + anchor_tag_open=HTML(u'').format( account_settings_url=settings.LMS_ROOT_URL + "/account/settings" ), anchor_tag_close=HTML('') diff --git a/openedx/core/djangoapps/profile_images/urls.py b/openedx/core/djangoapps/profile_images/urls.py index 3270c57b13..06e6d0529f 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 0086b1eef6..5b1b99f782 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 ee4ddccfe2..91a9daf016 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 377e29aa84..1c30106e5e 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 69c492bff4..a5e7b30022 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 bba5fcb94f..eeeae5bb91 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 05400ca3bf..3aa7eb1e57 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 670cf459dd..a16d4feb36 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 4dca196cea..28185a717a 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 86c89de673..dedd85aa6e 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 be0e40c1a8..3bf296821a 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 ed7b737386..09a022953c 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 85c3165d5c..138c20e8a5 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 d80b5d3e02..de250b9601 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 9e4c395847..f95012f919 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 1fad58c654..40575f5409 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 f6d9dedb3d..39be935826 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 a7f35ff629..5782a5a5cd 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 ad2bf113ac..cfb7095c5d 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)