From 8198e2983c55807da78ede8cbe465634e59996d8 Mon Sep 17 00:00:00 2001 From: "M. Zulqarnain" Date: Mon, 1 Nov 2021 18:05:02 +0500 Subject: [PATCH] feat: New codemods on OpenedX 4 (#28779) --- openedx/features/calendar_sync/plugins.py | 2 +- openedx/features/calendar_sync/utils.py | 2 +- .../content_type_gating/migrations/0001_initial.py | 2 +- .../migrations/0002_auto_20181119_0959.py | 2 +- openedx/features/content_type_gating/models.py | 7 ++++--- openedx/features/content_type_gating/partitions.py | 2 +- openedx/features/course_bookmarks/plugins.py | 2 +- .../features/course_bookmarks/views/course_bookmarks.py | 2 +- openedx/features/course_duration_limits/access.py | 2 +- openedx/features/course_duration_limits/models.py | 2 +- openedx/features/course_experience/__init__.py | 2 +- openedx/features/course_experience/api/v1/views.py | 2 +- openedx/features/course_experience/plugins.py | 2 +- .../course_experience/tests/views/test_course_home.py | 4 ++-- .../course_experience/views/course_home_messages.py | 8 ++++---- openedx/features/discounts/admin.py | 2 +- openedx/features/discounts/migrations/0001_initial.py | 2 +- openedx/features/discounts/models.py | 4 ++-- openedx/features/discounts/utils.py | 2 +- openedx/features/enterprise_support/admin/forms.py | 2 +- openedx/features/enterprise_support/admin/views.py | 2 +- openedx/features/enterprise_support/api.py | 2 +- openedx/features/enterprise_support/utils.py | 2 +- openedx/features/lti_course_tab/tab.py | 4 ++-- 24 files changed, 33 insertions(+), 32 deletions(-) diff --git a/openedx/features/calendar_sync/plugins.py b/openedx/features/calendar_sync/plugins.py index 0c0c801857c5..75178a1ace7f 100644 --- a/openedx/features/calendar_sync/plugins.py +++ b/openedx/features/calendar_sync/plugins.py @@ -4,7 +4,7 @@ from django.urls import reverse -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from openedx.features.calendar_sync.api import SUBSCRIBE, UNSUBSCRIBE from openedx.features.calendar_sync.models import UserCalendarSyncConfig diff --git a/openedx/features/calendar_sync/utils.py b/openedx/features/calendar_sync/utils.py index e49d9f7abf24..ff6f6a662e12 100644 --- a/openedx/features/calendar_sync/utils.py +++ b/openedx/features/calendar_sync/utils.py @@ -5,7 +5,7 @@ from email.mime.text import MIMEText from django.conf import settings from django.utils.html import format_html -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ import os # lint-amnesty, pylint: disable=wrong-import-order import boto3 diff --git a/openedx/features/content_type_gating/migrations/0001_initial.py b/openedx/features/content_type_gating/migrations/0001_initial.py index eb0499ba787f..9678957e3743 100644 --- a/openedx/features/content_type_gating/migrations/0001_initial.py +++ b/openedx/features/content_type_gating/migrations/0001_initial.py @@ -25,7 +25,7 @@ class Migration(migrations.Migration): ('enabled', models.NullBooleanField(default=None, verbose_name='Enabled')), ('org', models.CharField(blank=True, db_index=True, max_length=255, null=True)), ('enabled_as_of', models.DateField(blank=True, default=None, null=True, verbose_name='Enabled As Of')), - ('studio_override_enabled', models.NullBooleanField(default=None, verbose_name='Studio Override Enabled')), + ('studio_override_enabled', models.BooleanField(default=None, verbose_name='Studio Override Enabled', null=True)), ('changed_by', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL, verbose_name='Changed by')), ('course', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='course_overviews.CourseOverview')), ('site', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='sites.Site')), diff --git a/openedx/features/content_type_gating/migrations/0002_auto_20181119_0959.py b/openedx/features/content_type_gating/migrations/0002_auto_20181119_0959.py index 0d362fd01a66..1bdbb4ebac18 100644 --- a/openedx/features/content_type_gating/migrations/0002_auto_20181119_0959.py +++ b/openedx/features/content_type_gating/migrations/0002_auto_20181119_0959.py @@ -19,6 +19,6 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='contenttypegatingconfig', name='studio_override_enabled', - field=models.NullBooleanField(default=None, help_text='Allow Feature Based Enrollment visibility to be overriden on a per-component basis in Studio.', verbose_name='Studio Override Enabled'), + field=models.BooleanField(blank=True, default=None, help_text='Allow Feature Based Enrollment visibility to be overriden on a per-component basis in Studio.', null=True, verbose_name='Studio Override Enabled'), ), ] diff --git a/openedx/features/content_type_gating/models.py b/openedx/features/content_type_gating/models.py index 1dde8b93484c..2756322db6e1 100644 --- a/openedx/features/content_type_gating/models.py +++ b/openedx/features/content_type_gating/models.py @@ -6,7 +6,7 @@ from django.db import models from django.utils import timezone -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from openedx.core.djangoapps.config_model_utils.models import StackedConfigurationModel from openedx.features.content_type_gating.helpers import correct_modes_for_fbe, enrollment_date_for_fbe @@ -31,14 +31,15 @@ class ContentTypeGatingConfig(StackedConfigurationModel): 'created after this date and time (user local time) will be affected.' ) ) - studio_override_enabled = models.NullBooleanField( + studio_override_enabled = models.BooleanField( default=None, verbose_name=_('Studio Override Enabled'), blank=True, help_text=_( 'Allow Feature Based Enrollment visibility to be overriden ' 'on a per-component basis in Studio.' - ) + ), + null=True ) @classmethod diff --git a/openedx/features/content_type_gating/partitions.py b/openedx/features/content_type_gating/partitions.py index 4eda32eb7261..fc3eef08b0c5 100644 --- a/openedx/features/content_type_gating/partitions.py +++ b/openedx/features/content_type_gating/partitions.py @@ -12,7 +12,7 @@ import crum import pytz from django.template.loader import render_to_string -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from web_fragments.fragment import Fragment from common.djangoapps.course_modes.models import CourseMode diff --git a/openedx/features/course_bookmarks/plugins.py b/openedx/features/course_bookmarks/plugins.py index c93d6f8d613a..895a7df26719 100644 --- a/openedx/features/course_bookmarks/plugins.py +++ b/openedx/features/course_bookmarks/plugins.py @@ -4,7 +4,7 @@ from django.urls import reverse -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from lms.djangoapps.courseware.permissions import EDIT_BOOKMARK from openedx.features.course_experience.course_tools import CourseTool diff --git a/openedx/features/course_bookmarks/views/course_bookmarks.py b/openedx/features/course_bookmarks/views/course_bookmarks.py index 34eb335af0e6..00db635d70dc 100644 --- a/openedx/features/course_bookmarks/views/course_bookmarks.py +++ b/openedx/features/course_bookmarks/views/course_bookmarks.py @@ -9,7 +9,7 @@ from django.template.loader import render_to_string from django.urls import reverse from django.utils.decorators import method_decorator -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from django.views.decorators.cache import cache_control from django.views.decorators.csrf import ensure_csrf_cookie from django.views.generic import View diff --git a/openedx/features/course_duration_limits/access.py b/openedx/features/course_duration_limits/access.py index 60f9491ecd5f..a778c1244272 100644 --- a/openedx/features/course_duration_limits/access.py +++ b/openedx/features/course_duration_limits/access.py @@ -4,7 +4,7 @@ """ from django.utils import timezone -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from edx_django_utils.cache import RequestCache from web_fragments.fragment import Fragment diff --git a/openedx/features/course_duration_limits/models.py b/openedx/features/course_duration_limits/models.py index fe1d0cb5895b..fc80adb48125 100644 --- a/openedx/features/course_duration_limits/models.py +++ b/openedx/features/course_duration_limits/models.py @@ -6,7 +6,7 @@ from django.db import models from django.utils import timezone -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from openedx.core.djangoapps.config_model_utils.models import StackedConfigurationModel from openedx.features.content_type_gating.helpers import correct_modes_for_fbe, enrollment_date_for_fbe diff --git a/openedx/features/course_experience/__init__.py b/openedx/features/course_experience/__init__.py index d550261a93ea..38db72f69e82 100644 --- a/openedx/features/course_experience/__init__.py +++ b/openedx/features/course_experience/__init__.py @@ -2,7 +2,7 @@ Unified course experience settings and helper methods. """ import crum -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from edx_django_utils.monitoring import set_custom_attribute from waffle import flag_is_active # lint-amnesty, pylint: disable=invalid-django-waffle-import diff --git a/openedx/features/course_experience/api/v1/views.py b/openedx/features/course_experience/api/v1/views.py index e055aa9d1fd2..4a16f9ac9f2d 100644 --- a/openedx/features/course_experience/api/v1/views.py +++ b/openedx/features/course_experience/api/v1/views.py @@ -6,7 +6,7 @@ from django.conf import settings from django.urls import reverse from django.utils.html import format_html -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from eventtracking import tracker from rest_framework.decorators import api_view, authentication_classes, permission_classes diff --git a/openedx/features/course_experience/plugins.py b/openedx/features/course_experience/plugins.py index 516f6b7c0d13..1d3adab33c76 100644 --- a/openedx/features/course_experience/plugins.py +++ b/openedx/features/course_experience/plugins.py @@ -6,7 +6,7 @@ from django.urls import reverse -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from common.djangoapps.student.models import CourseEnrollment from openedx.core.lib.courses import get_course_by_id diff --git a/openedx/features/course_experience/tests/views/test_course_home.py b/openedx/features/course_experience/tests/views/test_course_home.py index 90eefa9ee9f0..e89ddde0166e 100644 --- a/openedx/features/course_experience/tests/views/test_course_home.py +++ b/openedx/features/course_experience/tests/views/test_course_home.py @@ -5,13 +5,13 @@ from datetime import datetime, timedelta from unittest import mock +from urllib.parse import quote_plus import ddt from django.conf import settings from django.http import QueryDict from django.test.utils import override_settings from django.urls import reverse -from django.utils.http import urlquote_plus from django.utils.timezone import now from edx_toggles.toggles.testutils import override_waffle_flag from pytz import UTC @@ -371,7 +371,7 @@ def test_sign_in_button(self): """ url = course_home_url(self.course) response = self.client.get(url) - self.assertContains(response, f'/login?next={urlquote_plus(url)}') + self.assertContains(response, f'/login?next={quote_plus(url)}') @mock.patch.dict(settings.FEATURES, {'DISABLE_START_DATES': False}) def test_non_live_course(self): diff --git a/openedx/features/course_experience/views/course_home_messages.py b/openedx/features/course_experience/views/course_home_messages.py index cc51ef8f80df..38256d558310 100644 --- a/openedx/features/course_experience/views/course_home_messages.py +++ b/openedx/features/course_experience/views/course_home_messages.py @@ -4,14 +4,14 @@ from datetime import datetime +from urllib.parse import quote_plus from babel.dates import format_date, format_timedelta from django.conf import settings from django.contrib import auth from django.template.loader import render_to_string -from django.utils.http import urlquote_plus from django.utils.translation import get_language, to_locale -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from opaque_keys.edx.keys import CourseKey from pytz import UTC from web_fragments.fragment import Fragment @@ -123,11 +123,11 @@ def _register_course_home_messages(request, course, user_access, course_start_da Text(sign_in_or_register_text).format( sign_in_link=HTML('{sign_in_label}').format( sign_in_label=_('Sign in'), - current_url=urlquote_plus(request.path), + current_url=quote_plus(request.path), ), register_link=HTML('{register_label}').format( register_label=_('register'), - current_url=urlquote_plus(request.path), + current_url=quote_plus(request.path), ) ), title=Text(_('You must be enrolled in the course to see course content.')) diff --git a/openedx/features/discounts/admin.py b/openedx/features/discounts/admin.py index 57a8e1b5da78..af2b726701e3 100644 --- a/openedx/features/discounts/admin.py +++ b/openedx/features/discounts/admin.py @@ -4,7 +4,7 @@ from django.contrib import admin -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from openedx.core.djangoapps.config_model_utils.admin import StackedConfigModelAdmin diff --git a/openedx/features/discounts/migrations/0001_initial.py b/openedx/features/discounts/migrations/0001_initial.py index 6cdbb71ff68e..a2a91611c3ee 100644 --- a/openedx/features/discounts/migrations/0001_initial.py +++ b/openedx/features/discounts/migrations/0001_initial.py @@ -27,7 +27,7 @@ class Migration(migrations.Migration): ('enabled', models.NullBooleanField(default=None, verbose_name='Enabled')), ('org', models.CharField(blank=True, db_index=True, help_text='Configure values for all course runs associated with this Organization. This is the organization string (i.e. edX, MITx).', max_length=255, null=True)), ('org_course', models.CharField(blank=True, db_index=True, help_text="Configure values for all course runs associated with this course. This is should be formatted as 'org+course' (i.e. MITx+6.002x, HarvardX+CS50).", max_length=255, null=True, validators=[openedx.core.djangoapps.config_model_utils.models.validate_course_in_org], verbose_name='Course in Org')), - ('disabled', models.NullBooleanField(default=None, verbose_name='Disabled')), + ('disabled', models.BooleanField(default=None, verbose_name='Disabled', null=True)), ('changed_by', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL, verbose_name='Changed by')), ('course', models.ForeignKey(blank=True, help_text='Configure values for this course run. This should be formatted as the CourseKey (i.e. course-v1://MITx+6.002x+2019_Q1)', null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='course_overviews.CourseOverview', verbose_name='Course Run')), ('site', models.ForeignKey(blank=True, help_text='Configure values for all course runs associated with this site.', null=True, on_delete=django.db.models.deletion.CASCADE, to='sites.Site')), diff --git a/openedx/features/discounts/models.py b/openedx/features/discounts/models.py index bcb394e720e2..bca6ef7b37c1 100644 --- a/openedx/features/discounts/models.py +++ b/openedx/features/discounts/models.py @@ -7,7 +7,7 @@ from django.db import models -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from openedx.core.djangoapps.config_model_utils.models import StackedConfigurationModel @@ -20,7 +20,7 @@ class DiscountRestrictionConfig(StackedConfigurationModel): STACKABLE_FIELDS = ('disabled',) # Since this config disables a feature, it seemed it would be clearer to use a disabled flag instead of enabled. # The enabled field still exists but is not used or shown in the admin. - disabled = models.NullBooleanField(default=None, verbose_name=_("Disabled")) + disabled = models.BooleanField(default=None, verbose_name=_("Disabled"), null=True) @classmethod def disabled_for_course_stacked_config(cls, course): diff --git a/openedx/features/discounts/utils.py b/openedx/features/discounts/utils.py index af49ee5e4c81..f52f821d9a9d 100644 --- a/openedx/features/discounts/utils.py +++ b/openedx/features/discounts/utils.py @@ -6,7 +6,7 @@ import pytz from django.utils.translation import get_language -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from common.djangoapps.course_modes.models import format_course_price, get_course_prices from lms.djangoapps.experiments.models import ExperimentData diff --git a/openedx/features/enterprise_support/admin/forms.py b/openedx/features/enterprise_support/admin/forms.py index 4b43acfe7ab3..bf193efc66d0 100644 --- a/openedx/features/enterprise_support/admin/forms.py +++ b/openedx/features/enterprise_support/admin/forms.py @@ -3,7 +3,7 @@ """ from django import forms -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from enterprise.admin.utils import validate_csv diff --git a/openedx/features/enterprise_support/admin/views.py b/openedx/features/enterprise_support/admin/views.py index 3ab1cc097b10..37fedcc69b88 100644 --- a/openedx/features/enterprise_support/admin/views.py +++ b/openedx/features/enterprise_support/admin/views.py @@ -4,7 +4,7 @@ from django.contrib import messages from django.urls import reverse -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from django.views.generic.edit import FormView from enterprise.models import EnterpriseCourseEnrollment diff --git a/openedx/features/enterprise_support/api.py b/openedx/features/enterprise_support/api.py index ba53e7788536..b8dd301bb059 100644 --- a/openedx/features/enterprise_support/api.py +++ b/openedx/features/enterprise_support/api.py @@ -16,7 +16,7 @@ from django.template.loader import render_to_string from django.urls import reverse from django.utils.http import urlencode -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from edx_django_utils.cache import TieredCache, get_cache_key from edx_rest_api_client.client import EdxRestApiClient from slumber.exceptions import HttpClientError, HttpNotFoundError, HttpServerError diff --git a/openedx/features/enterprise_support/utils.py b/openedx/features/enterprise_support/utils.py index 11ef96d02ace..23055935aacd 100644 --- a/openedx/features/enterprise_support/utils.py +++ b/openedx/features/enterprise_support/utils.py @@ -12,7 +12,7 @@ from django.core.cache import cache from django.http import HttpRequest from django.urls import NoReverseMatch, reverse -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from edx_django_utils.cache import TieredCache, get_cache_key from edx_toggles.toggles import LegacyWaffleFlag from enterprise.api.v1.serializers import EnterpriseCustomerBrandingConfigurationSerializer diff --git a/openedx/features/lti_course_tab/tab.py b/openedx/features/lti_course_tab/tab.py index 0c15b5777282..8dfd210b11e6 100644 --- a/openedx/features/lti_course_tab/tab.py +++ b/openedx/features/lti_course_tab/tab.py @@ -7,7 +7,7 @@ from django.contrib.auth.models import AbstractBaseUser from django.contrib.sites.shortcuts import get_current_site from django.http import HttpRequest -from django.utils.translation import get_language, to_locale, ugettext_lazy +from django.utils.translation import get_language, to_locale, gettext_lazy from lti_consumer.api import get_lti_pii_sharing_state_for_course from lti_consumer.lti_1p1.contrib.django import lti_embed from lti_consumer.models import LtiConfiguration @@ -268,7 +268,7 @@ class DiscussionLtiCourseTab(LtiCourseLaunchMixin, TabFragmentViewMixin, Enrolle type = 'lti_discussion' allow_multiple = False is_dynamic = True - title = ugettext_lazy("Discussion") + title = gettext_lazy("Discussion") def _get_lti_config(self, course: CourseBlock) -> LtiConfiguration: config = DiscussionsConfiguration.get(course.id)