From 68e0885ca8ed967a1ff8df02f1fc3ccbe7d36861 Mon Sep 17 00:00:00 2001 From: Mohammad Ahtasham ul Hassan <60315450+aht007@users.noreply.github.com> Date: Mon, 7 Mar 2022 15:50:17 +0500 Subject: [PATCH] fix: fixed django4 warnings (#29644) --- openedx/core/djangoapps/user_api/urls.py | 148 +++++++----------- .../core/djangoapps/user_authn/api/urls.py | 18 +-- openedx/core/djangoapps/user_authn/urls.py | 20 +-- .../core/djangoapps/user_authn/urls_common.py | 90 +++++------ openedx/core/djangoapps/waffle_utils/urls.py | 5 +- .../core/djangoapps/xblock/rest_api/urls.py | 15 +- openedx/core/djangoapps/zendesk_proxy/urls.py | 8 +- openedx/core/djangolib/markup.py | 2 +- openedx/core/djangolib/tests/test_markup.py | 2 +- openedx/core/lib/api/view_utils.py | 5 +- openedx/core/lib/license/mixin.py | 2 +- 11 files changed, 134 insertions(+), 181 deletions(-) diff --git a/openedx/core/djangoapps/user_api/urls.py b/openedx/core/djangoapps/user_api/urls.py index e9f1b01a1b..078ac69e0f 100644 --- a/openedx/core/djangoapps/user_api/urls.py +++ b/openedx/core/djangoapps/user_api/urls.py @@ -4,7 +4,7 @@ Defines the URL routes for this app. from django.conf import settings -from django.conf.urls import include, url +from django.urls import include, path, re_path from rest_framework import routers from ..profile_images.views import ProfileImageView @@ -95,151 +95,121 @@ USER_API_ROUTER.register(r'users', user_api_views.UserViewSet) USER_API_ROUTER.register(r'user_prefs', user_api_views.UserPreferenceViewSet) urlpatterns = [ - url( - r'^v1/me$', - ME, - name='own_username_api' - ), - url( - r'^v1/accounts$', - ACCOUNT_LIST, - name='accounts_detail_api' - ), - url( - r'^v1/accounts/search_emails$', - ACCOUNT_SEARCH_EMAILS, - name='accounts_search_emails_api' - ), - url( + path('v1/me', ME, + name='own_username_api' + ), + path('v1/accounts', ACCOUNT_LIST, + name='accounts_detail_api' + ), + path('v1/accounts/search_emails', ACCOUNT_SEARCH_EMAILS, + name='accounts_search_emails_api' + ), + re_path( fr'^v1/accounts/{settings.USERNAME_PATTERN}$', ACCOUNT_DETAIL, name='accounts_api' ), - url( + re_path( fr'^v1/accounts/{settings.USERNAME_PATTERN}/image$', ProfileImageView.as_view(), name='accounts_profile_image_api' ), - url( + re_path( fr'^v1/accounts/{settings.USERNAME_PATTERN}/deactivate/$', AccountDeactivationView.as_view(), name='accounts_deactivation' ), - url( - r'^v1/accounts/deactivate_logout/$', - DeactivateLogoutView.as_view(), + path( + 'v1/accounts/deactivate_logout/', DeactivateLogoutView.as_view(), name='deactivate_logout' ), - url( - r'^v1/accounts/name_change/$', - REQUEST_NAME_CHANGE, + path( + 'v1/accounts/name_change/', REQUEST_NAME_CHANGE, name='request_name_change' ), - url( + re_path( fr'^v1/accounts/name_change/{settings.USERNAME_PATTERN}/confirm/$', CONFIRM_NAME_CHANGE, name='confirm_name_change' ), - url( + re_path( fr'^v1/accounts/{settings.USERNAME_PATTERN}/verification_status/$', IDVerificationStatusView.as_view(), name='verification_status' ), - url( + re_path( fr'^v1/accounts/{settings.USERNAME_PATTERN}/verifications/$', IDVerificationStatusDetailsView.as_view(), name='verification_details' ), - url( + re_path( r'^v1/accounts/verifications/(?P[0-9]+)/$', IDVerificationSupportView.as_view(), name='verification_for_support' ), - url( + re_path( fr'^v1/accounts/{settings.USERNAME_PATTERN}/retirement_status/$', RETIREMENT_RETRIEVE, name='accounts_retirement_retrieve' ), - url( - r'^v1/accounts/retirement_partner_report/$', - PARTNER_REPORT, - name='accounts_retirement_partner_report' - ), - url( - r'^v1/accounts/retirement_partner_report_cleanup/$', - PARTNER_REPORT_CLEANUP, - name='accounts_retirement_partner_report_cleanup' - ), - url( - r'^v1/accounts/retirement_queue/$', - RETIREMENT_QUEUE, - name='accounts_retirement_queue' - ), - url( - r'^v1/accounts/retirement_cleanup/$', - RETIREMENT_CLEANUP, - name='accounts_retirement_cleanup' - ), - url( - r'^v1/accounts/retirements_by_status_and_date/$', - RETIREMENT_LIST_BY_STATUS_AND_DATE, - name='accounts_retirements_by_status_and_date' - ), - url( - r'^v1/accounts/retire/$', - RETIREMENT_POST, - name='accounts_retire' - ), - url( - r'^v1/accounts/retire_misc/$', - RETIREMENT_LMS_POST, - name='accounts_retire_misc' - ), - url( - r'^v1/accounts/update_retirement_status/$', - RETIREMENT_UPDATE, - name='accounts_retirement_update' - ), - url( - r'^v1/accounts/replace_usernames/$', - UsernameReplacementView.as_view(), - name='username_replacement' - ), - url( + path('v1/accounts/retirement_partner_report/', PARTNER_REPORT, + name='accounts_retirement_partner_report' + ), + path('v1/accounts/retirement_partner_report_cleanup/', PARTNER_REPORT_CLEANUP, + name='accounts_retirement_partner_report_cleanup' + ), + path('v1/accounts/retirement_queue/', RETIREMENT_QUEUE, + name='accounts_retirement_queue' + ), + path('v1/accounts/retirement_cleanup/', RETIREMENT_CLEANUP, + name='accounts_retirement_cleanup' + ), + path('v1/accounts/retirements_by_status_and_date/', RETIREMENT_LIST_BY_STATUS_AND_DATE, + name='accounts_retirements_by_status_and_date' + ), + path('v1/accounts/retire/', RETIREMENT_POST, + name='accounts_retire' + ), + path('v1/accounts/retire_misc/', RETIREMENT_LMS_POST, + name='accounts_retire_misc' + ), + path('v1/accounts/update_retirement_status/', RETIREMENT_UPDATE, + name='accounts_retirement_update' + ), + path('v1/accounts/replace_usernames/', UsernameReplacementView.as_view(), + name='username_replacement' + ), + re_path( fr'^v1/preferences/{settings.USERNAME_PATTERN}$', PreferencesView.as_view(), name='preferences_api' ), - url( + re_path( fr'^v1/preferences/{settings.USERNAME_PATTERN}/(?P[a-zA-Z0-9_]+)$', PreferencesDetailView.as_view(), name='preferences_detail_api' ), # Moved from user_api/legacy_urls.py - url(r'^v1/', include(USER_API_ROUTER.urls)), + path('v1/', include(USER_API_ROUTER.urls)), # Moved from user_api/legacy_urls.py - url( + re_path( fr'^v1/preferences/(?P{UserPreference.KEY_REGEX})/users/$', user_api_views.PreferenceUsersListView.as_view() ), # Moved from user_api/legacy_urls.py - url( + re_path( r'^v1/forum_roles/(?P[a-zA-Z]+)/users/$', user_api_views.ForumRoleUsersListView.as_view() ), # Moved from user_api/legacy_urls.py - url( - r'^v1/preferences/email_opt_in/$', - user_api_views.UpdateEmailOptInPreference.as_view(), - name="preferences_email_opt_in" - ), + path('v1/preferences/email_opt_in/', user_api_views.UpdateEmailOptInPreference.as_view(), + name="preferences_email_opt_in" + ), # Moved from user_api/legacy_urls.py - url( - r'^v1/preferences/time_zones/$', - user_api_views.CountryTimeZoneListView.as_view(), - ), + path('v1/preferences/time_zones/', user_api_views.CountryTimeZoneListView.as_view(), + ), ] diff --git a/openedx/core/djangoapps/user_authn/api/urls.py b/openedx/core/djangoapps/user_authn/api/urls.py index b0588062a0..cbf8b473ea 100644 --- a/openedx/core/djangoapps/user_authn/api/urls.py +++ b/openedx/core/djangoapps/user_authn/api/urls.py @@ -1,19 +1,15 @@ """ Authn API urls """ - -from django.conf.urls import url - +from django.urls import path from openedx.core.djangoapps.user_authn.api.views import MFEContextView, SendAccountActivationEmail from openedx.core.djangoapps.user_authn.api.optional_fields import OptionalFieldsView urlpatterns = [ - url(r'^third_party_auth_context$', MFEContextView.as_view(), name='third_party_auth_context'), - url(r'^mfe_context$', MFEContextView.as_view(), name='mfe_context'), - url( - r'^send_account_activation_email$', - SendAccountActivationEmail.as_view(), - name='send_account_activation_email' - ), - url(r'^optional_fields$', OptionalFieldsView.as_view(), name='optional_fields'), + path('third_party_auth_context', MFEContextView.as_view(), name='third_party_auth_context'), + path('mfe_context', MFEContextView.as_view(), name='mfe_context'), + path('send_account_activation_email', SendAccountActivationEmail.as_view(), + name='send_account_activation_email' + ), + path('optional_fields', OptionalFieldsView.as_view(), name='optional_fields'), ] diff --git a/openedx/core/djangoapps/user_authn/urls.py b/openedx/core/djangoapps/user_authn/urls.py index 3623fd9b14..f9d93d1ab1 100644 --- a/openedx/core/djangoapps/user_authn/urls.py +++ b/openedx/core/djangoapps/user_authn/urls.py @@ -1,23 +1,23 @@ """ URLs for User Authentication """ -from django.conf.urls import include, url +from django.urls import include, path from .views import login, login_form urlpatterns = [ # TODO move contents of urls_common here once CMS no longer has its own login - url(r'', include('openedx.core.djangoapps.user_authn.urls_common')), - url(r'^api/', include('openedx.core.djangoapps.user_authn.api.urls')), - url(r'^account/finish_auth$', login.finish_auth, name='finish_auth'), + path('', include('openedx.core.djangoapps.user_authn.urls_common')), + path('api/', include('openedx.core.djangoapps.user_authn.api.urls')), + path('account/finish_auth', login.finish_auth, name='finish_auth'), ] # Backwards compatibility with old URL structure, but serve the new views urlpatterns += [ - url(r'^login$', login_form.login_and_registration_form, - {'initial_mode': 'login'}, name='signin_user'), - url(r'^register$', login_form.login_and_registration_form, - {'initial_mode': 'register'}, name='register_user'), - url(r'^password_assistance', login_form.login_and_registration_form, - {'initial_mode': 'reset'}, name='password_assistance'), + path('login', login_form.login_and_registration_form, + {'initial_mode': 'login'}, name='signin_user'), + path('register', login_form.login_and_registration_form, + {'initial_mode': 'register'}, name='register_user'), + path('password_assistance', login_form.login_and_registration_form, + {'initial_mode': 'reset'}, name='password_assistance'), ] diff --git a/openedx/core/djangoapps/user_authn/urls_common.py b/openedx/core/djangoapps/user_authn/urls_common.py index 0fce4a5e67..bb735f7b29 100644 --- a/openedx/core/djangoapps/user_authn/urls_common.py +++ b/openedx/core/djangoapps/user_authn/urls_common.py @@ -12,95 +12,85 @@ which leads to inconsistent prefixing. from django.conf import settings -from django.conf.urls import url from django.contrib.auth.views import PasswordResetCompleteView +from django.urls import path, re_path from .views import auto_auth, login, logout, password_reset, register from .views.password_reset import PasswordResetConfirmWrapper urlpatterns = [ # Registration - url(r'^create_account$', register.RegistrationView.as_view(), name='create_account'), + path('create_account', register.RegistrationView.as_view(), name='create_account'), # Moved from user_api/legacy_urls.py - url( - r'^api/user/v1/account/registration/$', - register.RegistrationView.as_view(), - name="user_api_registration" - ), + path('api/user/v1/account/registration/', register.RegistrationView.as_view(), + name="user_api_registration" + ), # `user_api` prefix is preserved for backwards compatibility. - url(r'^user_api/v1/account/registration/$', register.RegistrationView.as_view(), - name="user_api_registration_legacy"), + path('user_api/v1/account/registration/', register.RegistrationView.as_view(), + name="user_api_registration_legacy"), # V2 is created to avoid backward compatibility issue with confirm_email - url( - r'^api/user/v2/account/registration/$', - register.RegistrationView.as_view(), - name="user_api_registration_v2" - ), + path('api/user/v2/account/registration/', register.RegistrationView.as_view(), + name="user_api_registration_v2" + ), # legacy url - url(r'^user_api/v2/account/registration/$', register.RegistrationView.as_view(), - name="user_api_registration_v2_legacy"), + path('user_api/v2/account/registration/', register.RegistrationView.as_view(), + name="user_api_registration_v2_legacy"), # Moved from user_api/urls.py # `api/user` prefix is preserved for backwards compatibility. - url( - r'^api/user/v1/validation/registration$', - register.RegistrationValidationView.as_view(), - name='registration_validation' - ), + path('api/user/v1/validation/registration', register.RegistrationValidationView.as_view(), + name='registration_validation' + ), - url(r'^login_ajax$', login.login_user, name="login_api"), + path('login_ajax', login.login_user, name="login_api"), # Moved from user_api/legacy_urls.py - url( + re_path( r'^api/user/(?Pv(1|2))/account/login_session/$', login.LoginSessionView.as_view(), name="user_api_login_session" ), # `user_api` prefix is preserved for backwards compatibility. - url(r'^user_api/(?Pv(1|2))/account/login_session/$', login.LoginSessionView.as_view(), - name="user_api_login_session_legacy"), + re_path(r'^user_api/(?Pv(1|2))/account/login_session/$', login.LoginSessionView.as_view(), + name="user_api_login_session_legacy"), # Login Refresh of JWT Cookies - url(r'^login_refresh$', login.login_refresh, name="login_refresh"), + path('login_refresh', login.login_refresh, name="login_refresh"), # WARNING: This is similar to auth_backends ^logout/$ (which has a # trailing slash); LMS uses this view, but Studio links to the # auth_backends logout view. - url(r'^logout$', logout.LogoutView.as_view(), name='logout'), + path('logout', logout.LogoutView.as_view(), name='logout'), # Moved from user_api/legacy_urls.py - url( - r'^api/user/v1/account/password_reset/$', - password_reset.PasswordResetView.as_view(), - name="user_api_password_reset" - ), + path('api/user/v1/account/password_reset/', password_reset.PasswordResetView.as_view(), + name="user_api_password_reset" + ), # legacy url - url(r'^user_api/v1/account/password_reset/$', password_reset.PasswordResetView.as_view(), - name="user_api_password_reset_legacy"), + path('user_api/v1/account/password_reset/', password_reset.PasswordResetView.as_view(), + name="user_api_password_reset_legacy"), # Password reset api views. - url(r'^password_reset/$', password_reset.password_reset, name='password_reset'), - url( + path('password_reset/', password_reset.password_reset, name='password_reset'), + re_path( r'^password_reset_confirm/(?P[0-9A-Za-z]+)-(?P.+)/$', PasswordResetConfirmWrapper.as_view(), name='password_reset_confirm', ), - url(r'^account/password$', password_reset.password_change_request_handler, name='password_change_request'), + path('account/password', password_reset.password_change_request_handler, name='password_change_request'), # authn MFE flow - url( - r'^api/user/v1/account/password_reset/token/validate/$', - password_reset.PasswordResetTokenValidation.as_view(), - name="user_api_password_reset_token_validate" - ), + path('api/user/v1/account/password_reset/token/validate/', password_reset.PasswordResetTokenValidation.as_view(), + name="user_api_password_reset_token_validate" + ), # legacy url - url(r'^user_api/v1/account/password_reset/token/validate/$', password_reset.PasswordResetTokenValidation.as_view(), - name="user_api_password_reset_token_validate_legacy"), + path('user_api/v1/account/password_reset/token/validate/', password_reset.PasswordResetTokenValidation.as_view(), + name="user_api_password_reset_token_validate_legacy"), # authn MFE reset flow - url( + re_path( r'^password/reset/(?P[0-9A-Za-z]+)-(?P.+)/$', password_reset.LogistrationPasswordResetView.as_view(), name='logistration_password_reset', @@ -109,15 +99,13 @@ urlpatterns = [ # password reset django views (see above for password reset views) urlpatterns += [ - url( - r'^password_reset_complete/$', - PasswordResetCompleteView.as_view(), - name='password_reset_complete', - ), + path('password_reset_complete/', PasswordResetCompleteView.as_view(), + name='password_reset_complete', + ), ] # enable automatic login if settings.FEATURES.get('AUTOMATIC_AUTH_FOR_TESTING'): urlpatterns += [ - url(r'^auto_auth$', auto_auth.auto_auth), + path('auto_auth', auto_auth.auto_auth), ] diff --git a/openedx/core/djangoapps/waffle_utils/urls.py b/openedx/core/djangoapps/waffle_utils/urls.py index 0d1d69af98..7f93ac341e 100644 --- a/openedx/core/djangoapps/waffle_utils/urls.py +++ b/openedx/core/djangoapps/waffle_utils/urls.py @@ -1,8 +1,7 @@ """ URL definitions for waffle utils. """ - -from django.conf.urls import url +from django.urls import path from openedx.core.djangoapps.waffle_utils.views import ToggleStateView urlpatterns = [ - url(r'^v0/state/', ToggleStateView.as_view(), name="toggle_state"), + path('v0/state/', ToggleStateView.as_view(), name="toggle_state"), ] diff --git a/openedx/core/djangoapps/xblock/rest_api/urls.py b/openedx/core/djangoapps/xblock/rest_api/urls.py index 2048c91b80..03132f412f 100644 --- a/openedx/core/djangoapps/xblock/rest_api/urls.py +++ b/openedx/core/djangoapps/xblock/rest_api/urls.py @@ -1,8 +1,7 @@ """ URL configuration for the new XBlock API """ -from django.conf.urls import include, url - +from django.urls import include, path, re_path from . import views # Note that the exact same API URLs are used in Studio and the LMS, but the API @@ -12,16 +11,16 @@ from . import views app_name = 'openedx.core.djangoapps.xblock.rest_api' urlpatterns = [ - url(r'^api/xblock/v2/', include([ - url(r'^xblocks/(?P[^/]+)/', include([ + path('api/xblock/v2/', include([ + path('xblocks//', include([ # get metadata about an XBlock: - url(r'^$', views.block_metadata), + path('', views.block_metadata), # render one of this XBlock's views (e.g. student_view) - url(r'^view/(?P[\w\-]+)/$', views.render_block_view), + re_path(r'^view/(?P[\w\-]+)/$', views.render_block_view), # get the URL needed to call this XBlock's handlers - url(r'^handler_url/(?P[\w\-]+)/$', views.get_handler_url), + re_path(r'^handler_url/(?P[\w\-]+)/$', views.get_handler_url), # call one of this block's handlers - url( + re_path( r'^handler/(?P\w+)-(?P\w+)/(?P[\w\-]+)/(?P.+)?$', views.xblock_handler, name='xblock_handler', diff --git a/openedx/core/djangoapps/zendesk_proxy/urls.py b/openedx/core/djangoapps/zendesk_proxy/urls.py index 751ec0071b..9881b72664 100644 --- a/openedx/core/djangoapps/zendesk_proxy/urls.py +++ b/openedx/core/djangoapps/zendesk_proxy/urls.py @@ -2,13 +2,11 @@ Map urls to the relevant view handlers """ - -from django.conf.urls import url - +from django.urls import path from openedx.core.djangoapps.zendesk_proxy.v0.views import ZendeskPassthroughView as v0_view from openedx.core.djangoapps.zendesk_proxy.v1.views import ZendeskPassthroughView as v1_view urlpatterns = [ - url(r'^v0$', v0_view.as_view(), name='zendesk_proxy_v0'), - url(r'^v1$', v1_view.as_view(), name='zendesk_proxy_v1'), + path('v0', v0_view.as_view(), name='zendesk_proxy_v0'), + path('v1', v1_view.as_view(), name='zendesk_proxy_v1'), ] diff --git a/openedx/core/djangolib/markup.py b/openedx/core/djangolib/markup.py index c214728d89..8dd5e3699e 100644 --- a/openedx/core/djangolib/markup.py +++ b/openedx/core/djangolib/markup.py @@ -24,7 +24,7 @@ def HTML(html): # pylint: disable=invalid-name <%page expression_filter="h"/> <%! - from django.utils.translation import ugettext as _ + from django.utils.translation import gettext as _ from openedx.core.djangolib.markup import HTML, Text %> diff --git a/openedx/core/djangolib/tests/test_markup.py b/openedx/core/djangolib/tests/test_markup.py index d3775deae6..a7a66902af 100644 --- a/openedx/core/djangolib/tests/test_markup.py +++ b/openedx/core/djangolib/tests/test_markup.py @@ -53,7 +53,7 @@ class FormatHtmlTest(unittest.TestCase): template = Template( """ <%! - from django.utils.translation import ugettext as _ + from django.utils.translation import gettext as _ from openedx.core.djangolib.markup import HTML, Text %> diff --git a/openedx/core/lib/api/view_utils.py b/openedx/core/lib/api/view_utils.py index c6be5542cf..054755ae3c 100644 --- a/openedx/core/lib/api/view_utils.py +++ b/openedx/core/lib/api/view_utils.py @@ -33,6 +33,7 @@ class DeveloperErrorResponseException(Exception): it does not need to be recreated when returning a response. Intended to be used with and by DeveloperErrorViewMixin. """ + def __init__(self, response): super().__init__() self.response = response @@ -174,7 +175,7 @@ def build_api_error(message, **kwargs): Args: message (string): The string to use for developer and user messages. The user message will be translated, but for this to work message - must have already been scraped. ugettext_noop is useful for this. + must have already been scraped. gettext_noop is useful for this. **kwargs: format parameters for message """ return { @@ -188,6 +189,7 @@ class RetrievePatchAPIView(RetrieveModelMixin, UpdateModelMixin, GenericAPIView) Like DRF's RetrieveUpdateAPIView, but without PUT and with automatic validation errors in the edX format. """ + def get(self, request, *args, **kwargs): """Retrieves the specified resource using the RetrieveModelMixin.""" return self.retrieve(request, *args, **kwargs) @@ -245,6 +247,7 @@ class LazySequence(Sequence): It is immutable, and accepts an estimated length in order to support __len__ without exhausting the underlying sequence """ + def __init__(self, iterable, est_len=None): self.iterable = iterable self.est_len = est_len diff --git a/openedx/core/lib/license/mixin.py b/openedx/core/lib/license/mixin.py index 22bfc5ff51..a6add5b090 100644 --- a/openedx/core/lib/license/mixin.py +++ b/openedx/core/lib/license/mixin.py @@ -6,7 +6,7 @@ from xblock.core import XBlockMixin from xblock.fields import Scope, String # Make '_' a no-op so we can scrape strings. Using lambda instead of -# `django.utils.translation.ugettext_noop` because Django cannot be imported in this file +# `django.utils.translation.gettext_noop` because Django cannot be imported in this file _ = lambda text: text