diff --git a/cms/djangoapps/api/urls.py b/cms/djangoapps/api/urls.py index fe901ba689..6ce60f505b 100644 --- a/cms/djangoapps/api/urls.py +++ b/cms/djangoapps/api/urls.py @@ -3,10 +3,11 @@ URLs for the Studio API app """ -from django.conf.urls import include, url +from django.conf.urls import include +from django.urls import path app_name = 'cms.djangoapps.api' urlpatterns = [ - url(r'^v1/', include('cms.djangoapps.api.v1.urls', namespace='v1')), + path('v1/', include('cms.djangoapps.api.v1.urls', namespace='v1')), ] diff --git a/cms/djangoapps/contentstore/api/urls.py b/cms/djangoapps/contentstore/api/urls.py index 384b0b708e..2b363c705a 100644 --- a/cms/djangoapps/contentstore/api/urls.py +++ b/cms/djangoapps/contentstore/api/urls.py @@ -2,17 +2,17 @@ from django.conf import settings -from django.conf.urls import url from cms.djangoapps.contentstore.api.views import course_import, course_quality, course_validation +from django.urls import re_path app_name = 'contentstore' urlpatterns = [ - url(fr'^v0/import/{settings.COURSE_ID_PATTERN}/$', - course_import.CourseImportView.as_view(), name='course_import'), - url(fr'^v1/validation/{settings.COURSE_ID_PATTERN}/$', - course_validation.CourseValidationView.as_view(), name='course_validation'), - url(fr'^v1/quality/{settings.COURSE_ID_PATTERN}/$', - course_quality.CourseQualityView.as_view(), name='course_quality'), + re_path(fr'^v0/import/{settings.COURSE_ID_PATTERN}/$', + course_import.CourseImportView.as_view(), name='course_import'), + re_path(fr'^v1/validation/{settings.COURSE_ID_PATTERN}/$', + course_validation.CourseValidationView.as_view(), name='course_validation'), + re_path(fr'^v1/quality/{settings.COURSE_ID_PATTERN}/$', + course_quality.CourseQualityView.as_view(), name='course_quality'), ] diff --git a/cms/djangoapps/maintenance/urls.py b/cms/djangoapps/maintenance/urls.py index c1a83a4b6b..c3bdbb98be 100644 --- a/cms/djangoapps/maintenance/urls.py +++ b/cms/djangoapps/maintenance/urls.py @@ -2,9 +2,6 @@ URLs for the maintenance app. """ - -from django.conf.urls import url - from .views import ( AnnouncementCreateView, AnnouncementDeleteView, @@ -13,14 +10,15 @@ from .views import ( ForcePublishCourseView, MaintenanceIndexView ) +from django.urls import path, re_path app_name = 'cms.djangoapps.maintenance' urlpatterns = [ - url(r'^$', MaintenanceIndexView.as_view(), name='maintenance_index'), - url(r'^force_publish_course/?$', ForcePublishCourseView.as_view(), name='force_publish_course'), - url(r'^announcements/(?P\d+)?$', AnnouncementIndexView.as_view(), name='announcement_index'), - url(r'^announcements/create$', AnnouncementCreateView.as_view(), name='announcement_create'), - url(r'^announcements/edit/(?P\d+)?$', AnnouncementEditView.as_view(), name='announcement_edit'), - url(r'^announcements/delete/(?P\d+)$', AnnouncementDeleteView.as_view(), name='announcement_delete'), + path('', MaintenanceIndexView.as_view(), name='maintenance_index'), + re_path(r'^force_publish_course/?$', ForcePublishCourseView.as_view(), name='force_publish_course'), + re_path(r'^announcements/(?P\d+)?$', AnnouncementIndexView.as_view(), name='announcement_index'), + path('announcements/create', AnnouncementCreateView.as_view(), name='announcement_create'), + re_path(r'^announcements/edit/(?P\d+)?$', AnnouncementEditView.as_view(), name='announcement_edit'), + path('announcements/delete/', AnnouncementDeleteView.as_view(), name='announcement_delete'), ] diff --git a/cms/urls.py b/cms/urls.py index 05e4afc1d2..9748c00919 100644 --- a/cms/urls.py +++ b/cms/urls.py @@ -3,9 +3,10 @@ Urls of Studio. """ from django.conf import settings -from django.conf.urls import include, url +from django.conf.urls import include from django.conf.urls.static import static from django.contrib.admin import autodiscover as django_autodiscover +from django.urls import path, re_path from django.utils.translation import gettext_lazy as _ from auth_backends.urls import oauth2_urlpatterns from edx_api_doc_tools import make_docs_urls @@ -47,155 +48,153 @@ LIBRARY_KEY_PATTERN = r'(?Plibrary-v1:[^/+]+\+[^/+]+)' # oauth2_urlpatterns needs to be first to override any other login and # logout related views. urlpatterns = oauth2_urlpatterns + [ - url(r'', include('openedx.core.djangoapps.user_authn.urls_common')), - url(r'', include('common.djangoapps.student.urls')), - url(r'^transcripts/upload$', contentstore_views.upload_transcripts, name='upload_transcripts'), - url(r'^transcripts/download$', contentstore_views.download_transcripts, name='download_transcripts'), - url(r'^transcripts/check$', contentstore_views.check_transcripts, name='check_transcripts'), - url(r'^transcripts/choose$', contentstore_views.choose_transcripts, name='choose_transcripts'), - url(r'^transcripts/replace$', contentstore_views.replace_transcripts, name='replace_transcripts'), - url(r'^transcripts/rename$', contentstore_views.rename_transcripts, name='rename_transcripts'), - url(r'^preview/xblock/(?P.*?)/handler/(?P[^/]*)(?:/(?P.*))?$', - contentstore_views.preview_handler, name='preview_handler'), - url(r'^xblock/(?P.*?)/handler/(?P[^/]*)(?:/(?P.*))?$', - contentstore_views.component_handler, name='component_handler'), - url(r'^xblock/resource/(?P[^/]*)/(?P.*)$', - openedx.core.djangoapps.common_views.xblock.xblock_resource, name='xblock_resource_url'), - url(r'', include('openedx.core.djangoapps.xblock.rest_api.urls', namespace='xblock_api')), - url(r'^not_found$', contentstore_views.not_found, name='not_found'), - url(r'^server_error$', contentstore_views.server_error, name='server_error'), - url(r'^organizations$', OrganizationListView.as_view(), name='organizations'), + path('', include('openedx.core.djangoapps.user_authn.urls_common')), + path('', include('common.djangoapps.student.urls')), + path('transcripts/upload', contentstore_views.upload_transcripts, name='upload_transcripts'), + path('transcripts/download', contentstore_views.download_transcripts, name='download_transcripts'), + path('transcripts/check', contentstore_views.check_transcripts, name='check_transcripts'), + path('transcripts/choose', contentstore_views.choose_transcripts, name='choose_transcripts'), + path('transcripts/replace', contentstore_views.replace_transcripts, name='replace_transcripts'), + path('transcripts/rename', contentstore_views.rename_transcripts, name='rename_transcripts'), + re_path(r'^preview/xblock/(?P.*?)/handler/(?P[^/]*)(?:/(?P.*))?$', + contentstore_views.preview_handler, name='preview_handler'), + re_path(r'^xblock/(?P.*?)/handler/(?P[^/]*)(?:/(?P.*))?$', + contentstore_views.component_handler, name='component_handler'), + re_path(r'^xblock/resource/(?P[^/]*)/(?P.*)$', + openedx.core.djangoapps.common_views.xblock.xblock_resource, name='xblock_resource_url'), + path('', include('openedx.core.djangoapps.xblock.rest_api.urls', namespace='xblock_api')), + path('not_found', contentstore_views.not_found, name='not_found'), + path('server_error', contentstore_views.server_error, name='server_error'), + path('organizations', OrganizationListView.as_view(), name='organizations'), # noop to squelch ajax errors - url(r'^event$', contentstore_views.event, name='event'), - url(r'^heartbeat', include('openedx.core.djangoapps.heartbeat.urls')), - url(r'^i18n/', include('django.conf.urls.i18n')), + path('event', contentstore_views.event, name='event'), + path('heartbeat', include('openedx.core.djangoapps.heartbeat.urls')), + path('i18n/', include('django.conf.urls.i18n')), # User API endpoints - url(r'^api/user/', include('openedx.core.djangoapps.user_api.urls')), + path('api/user/', include('openedx.core.djangoapps.user_api.urls')), # Update session view - url(r'^lang_pref/session_language', - openedx.core.djangoapps.lang_pref.views.update_session_language, - name='session_language' - ), + path('lang_pref/session_language', openedx.core.djangoapps.lang_pref.views.update_session_language, + name='session_language' + ), # Darklang View to change the preview language (or dark language) - url(r'^update_lang/', include('openedx.core.djangoapps.dark_lang.urls', namespace='dark_lang')), + path('update_lang/', include('openedx.core.djangoapps.dark_lang.urls', namespace='dark_lang')), # For redirecting to help pages. - url(r'^help_token/', include('help_tokens.urls')), - url(r'^api/', include('cms.djangoapps.api.urls', namespace='api')), + path('help_token/', include('help_tokens.urls')), + path('api/', include('cms.djangoapps.api.urls', namespace='api')), # restful api - url(r'^$', contentstore_views.howitworks, name='homepage'), - url(r'^howitworks$', contentstore_views.howitworks, name='howitworks'), - url(r'^signin_redirect_to_lms$', contentstore_views.login_redirect_to_lms, name='login_redirect_to_lms'), - url(r'^request_course_creator$', contentstore_views.request_course_creator, name='request_course_creator'), - url(fr'^course_team/{COURSELIKE_KEY_PATTERN}(?:/(?P.+))?$', - contentstore_views.course_team_handler, name='course_team_handler'), - url(fr'^course_info/{settings.COURSE_KEY_PATTERN}$', contentstore_views.course_info_handler, - name='course_info_handler'), - url(fr'^course_info_update/{settings.COURSE_KEY_PATTERN}/(?P\d+)?$', - contentstore_views.course_info_update_handler, name='course_info_update_handler' - ), - url(r'^home/?$', contentstore_views.course_listing, name='home'), - url(r'^home_library/?$', contentstore_views.library_listing, name='home_library'), - url(fr'^course/{settings.COURSE_KEY_PATTERN}/search_reindex?$', - contentstore_views.course_search_index_handler, - name='course_search_index_handler' - ), - url(fr'^course/{settings.COURSE_KEY_PATTERN}?$', contentstore_views.course_handler, name='course_handler'), + path('', contentstore_views.howitworks, name='homepage'), + path('howitworks', contentstore_views.howitworks, name='howitworks'), + path('signin_redirect_to_lms', contentstore_views.login_redirect_to_lms, name='login_redirect_to_lms'), + path('request_course_creator', contentstore_views.request_course_creator, name='request_course_creator'), + re_path(fr'^course_team/{COURSELIKE_KEY_PATTERN}(?:/(?P.+))?$', + contentstore_views.course_team_handler, name='course_team_handler'), + re_path(fr'^course_info/{settings.COURSE_KEY_PATTERN}$', contentstore_views.course_info_handler, + name='course_info_handler'), + re_path(fr'^course_info_update/{settings.COURSE_KEY_PATTERN}/(?P\d+)?$', + contentstore_views.course_info_update_handler, name='course_info_update_handler' + ), + re_path(r'^home/?$', contentstore_views.course_listing, name='home'), + re_path(r'^home_library/?$', contentstore_views.library_listing, name='home_library'), + re_path(fr'^course/{settings.COURSE_KEY_PATTERN}/search_reindex?$', + contentstore_views.course_search_index_handler, + name='course_search_index_handler' + ), + re_path(fr'^course/{settings.COURSE_KEY_PATTERN}?$', contentstore_views.course_handler, name='course_handler'), - url(fr'^checklists/{settings.COURSE_KEY_PATTERN}?$', - contentstore_views.checklists_handler, - name='checklists_handler'), + re_path(fr'^checklists/{settings.COURSE_KEY_PATTERN}?$', + contentstore_views.checklists_handler, + name='checklists_handler'), - url(fr'^course_notifications/{settings.COURSE_KEY_PATTERN}/(?P\d+)?$', - contentstore_views.course_notifications_handler, - name='course_notifications_handler'), - url(fr'^course_rerun/{settings.COURSE_KEY_PATTERN}$', contentstore_views.course_rerun_handler, - name='course_rerun_handler'), - url(fr'^container/{settings.USAGE_KEY_PATTERN}$', contentstore_views.container_handler, - name='container_handler'), - url(fr'^orphan/{settings.COURSE_KEY_PATTERN}$', contentstore_views.orphan_handler, - name='orphan_handler'), - url(fr'^assets/{settings.COURSE_KEY_PATTERN}/{settings.ASSET_KEY_PATTERN}?$', - contentstore_views.assets_handler, - name='assets_handler'), - url(fr'^import/{COURSELIKE_KEY_PATTERN}$', contentstore_views.import_handler, - name='import_handler'), - url(fr'^import_status/{COURSELIKE_KEY_PATTERN}/(?P.+)$', - contentstore_views.import_status_handler, name='import_status_handler'), + re_path(fr'^course_notifications/{settings.COURSE_KEY_PATTERN}/(?P\d+)?$', + contentstore_views.course_notifications_handler, + name='course_notifications_handler'), + re_path(fr'^course_rerun/{settings.COURSE_KEY_PATTERN}$', contentstore_views.course_rerun_handler, + name='course_rerun_handler'), + re_path(fr'^container/{settings.USAGE_KEY_PATTERN}$', contentstore_views.container_handler, + name='container_handler'), + re_path(fr'^orphan/{settings.COURSE_KEY_PATTERN}$', contentstore_views.orphan_handler, + name='orphan_handler'), + re_path(fr'^assets/{settings.COURSE_KEY_PATTERN}/{settings.ASSET_KEY_PATTERN}?$', + contentstore_views.assets_handler, + name='assets_handler'), + re_path(fr'^import/{COURSELIKE_KEY_PATTERN}$', contentstore_views.import_handler, + name='import_handler'), + re_path(fr'^import_status/{COURSELIKE_KEY_PATTERN}/(?P.+)$', + contentstore_views.import_status_handler, name='import_status_handler'), # rest api for course import/export - url(r'^api/courses/', - include('cms.djangoapps.contentstore.api.urls', namespace='courses_api') - ), - url(fr'^export/{COURSELIKE_KEY_PATTERN}$', contentstore_views.export_handler, - name='export_handler'), - url(fr'^export_output/{COURSELIKE_KEY_PATTERN}$', contentstore_views.export_output_handler, - name='export_output_handler'), - url(fr'^export_status/{COURSELIKE_KEY_PATTERN}$', contentstore_views.export_status_handler, - name='export_status_handler'), - url(fr'^xblock/outline/{settings.USAGE_KEY_PATTERN}$', contentstore_views.xblock_outline_handler, - name='xblock_outline_handler'), - url(fr'^xblock/container/{settings.USAGE_KEY_PATTERN}$', contentstore_views.xblock_container_handler, - name='xblock_container_handler'), - url(fr'^xblock/{settings.USAGE_KEY_PATTERN}/(?P[^/]+)$', contentstore_views.xblock_view_handler, - name='xblock_view_handler'), - url(fr'^xblock/{settings.USAGE_KEY_PATTERN}?$', contentstore_views.xblock_handler, - name='xblock_handler'), - url(fr'^tabs/{settings.COURSE_KEY_PATTERN}$', contentstore_views.tabs_handler, - name='tabs_handler'), - url(fr'^settings/details/{settings.COURSE_KEY_PATTERN}$', contentstore_views.settings_handler, - name='settings_handler'), - url(fr'^settings/grading/{settings.COURSE_KEY_PATTERN}(/)?(?P\d+)?$', - contentstore_views.grading_handler, name='grading_handler'), - url(fr'^settings/advanced/{settings.COURSE_KEY_PATTERN}$', contentstore_views.advanced_settings_handler, - name='advanced_settings_handler'), - url(fr'^textbooks/{settings.COURSE_KEY_PATTERN}$', contentstore_views.textbooks_list_handler, - name='textbooks_list_handler'), - url(fr'^textbooks/{settings.COURSE_KEY_PATTERN}/(?P\d[^/]*)$', - contentstore_views.textbooks_detail_handler, name='textbooks_detail_handler'), - url(fr'^videos/{settings.COURSE_KEY_PATTERN}(?:/(?P[-\w]+))?$', - contentstore_views.videos_handler, name='videos_handler'), - url(fr'^generate_video_upload_link/{settings.COURSE_KEY_PATTERN}', - contentstore_views.generate_video_upload_link_handler, name='generate_video_upload_link'), - url(fr'^video_images/{settings.COURSE_KEY_PATTERN}(?:/(?P[-\w]+))?$', - contentstore_views.video_images_handler, name='video_images_handler'), - url(fr'^transcript_preferences/{settings.COURSE_KEY_PATTERN}$', - contentstore_views.transcript_preferences_handler, name='transcript_preferences_handler'), - url(fr'^transcript_credentials/{settings.COURSE_KEY_PATTERN}$', - contentstore_views.transcript_credentials_handler, name='transcript_credentials_handler'), - url(r'^transcript_download/$', contentstore_views.transcript_download_handler, name='transcript_download_handler'), - url(r'^transcript_upload/$', contentstore_views.transcript_upload_handler, name='transcript_upload_handler'), - url(r'^transcript_delete/{}(?:/(?P[-\w]+))?(?:/(?P[^/]*))?$'.format( + path('api/courses/', include('cms.djangoapps.contentstore.api.urls', namespace='courses_api') + ), + re_path(fr'^export/{COURSELIKE_KEY_PATTERN}$', contentstore_views.export_handler, + name='export_handler'), + re_path(fr'^export_output/{COURSELIKE_KEY_PATTERN}$', contentstore_views.export_output_handler, + name='export_output_handler'), + re_path(fr'^export_status/{COURSELIKE_KEY_PATTERN}$', contentstore_views.export_status_handler, + name='export_status_handler'), + re_path(fr'^xblock/outline/{settings.USAGE_KEY_PATTERN}$', contentstore_views.xblock_outline_handler, + name='xblock_outline_handler'), + re_path(fr'^xblock/container/{settings.USAGE_KEY_PATTERN}$', contentstore_views.xblock_container_handler, + name='xblock_container_handler'), + re_path(fr'^xblock/{settings.USAGE_KEY_PATTERN}/(?P[^/]+)$', contentstore_views.xblock_view_handler, + name='xblock_view_handler'), + re_path(fr'^xblock/{settings.USAGE_KEY_PATTERN}?$', contentstore_views.xblock_handler, + name='xblock_handler'), + re_path(fr'^tabs/{settings.COURSE_KEY_PATTERN}$', contentstore_views.tabs_handler, + name='tabs_handler'), + re_path(fr'^settings/details/{settings.COURSE_KEY_PATTERN}$', contentstore_views.settings_handler, + name='settings_handler'), + re_path(fr'^settings/grading/{settings.COURSE_KEY_PATTERN}(/)?(?P\d+)?$', + contentstore_views.grading_handler, name='grading_handler'), + re_path(fr'^settings/advanced/{settings.COURSE_KEY_PATTERN}$', contentstore_views.advanced_settings_handler, + name='advanced_settings_handler'), + re_path(fr'^textbooks/{settings.COURSE_KEY_PATTERN}$', contentstore_views.textbooks_list_handler, + name='textbooks_list_handler'), + re_path(fr'^textbooks/{settings.COURSE_KEY_PATTERN}/(?P\d[^/]*)$', + contentstore_views.textbooks_detail_handler, name='textbooks_detail_handler'), + re_path(fr'^videos/{settings.COURSE_KEY_PATTERN}(?:/(?P[-\w]+))?$', + contentstore_views.videos_handler, name='videos_handler'), + re_path(fr'^generate_video_upload_link/{settings.COURSE_KEY_PATTERN}', + contentstore_views.generate_video_upload_link_handler, name='generate_video_upload_link'), + re_path(fr'^video_images/{settings.COURSE_KEY_PATTERN}(?:/(?P[-\w]+))?$', + contentstore_views.video_images_handler, name='video_images_handler'), + re_path(fr'^transcript_preferences/{settings.COURSE_KEY_PATTERN}$', + contentstore_views.transcript_preferences_handler, name='transcript_preferences_handler'), + re_path(fr'^transcript_credentials/{settings.COURSE_KEY_PATTERN}$', + contentstore_views.transcript_credentials_handler, name='transcript_credentials_handler'), + path('transcript_download/', contentstore_views.transcript_download_handler, name='transcript_download_handler'), + path('transcript_upload/', contentstore_views.transcript_upload_handler, name='transcript_upload_handler'), + re_path(r'^transcript_delete/{}(?:/(?P[-\w]+))?(?:/(?P[^/]*))?$'.format( settings.COURSE_KEY_PATTERN ), contentstore_views.transcript_delete_handler, name='transcript_delete_handler'), - url(r'^transcript_upload_api/$', contentstore_views.transcript_upload_api, name='transcript_upload_api'), - url(fr'^video_encodings_download/{settings.COURSE_KEY_PATTERN}$', - contentstore_views.video_encodings_download, name='video_encodings_download'), - url(fr'^group_configurations/{settings.COURSE_KEY_PATTERN}$', - contentstore_views.group_configurations_list_handler, - name='group_configurations_list_handler'), - url(r'^group_configurations/{}/(?P\d+)(/)?(?P\d+)?$'.format( + path('transcript_upload_api/', contentstore_views.transcript_upload_api, name='transcript_upload_api'), + re_path(fr'^video_encodings_download/{settings.COURSE_KEY_PATTERN}$', + contentstore_views.video_encodings_download, name='video_encodings_download'), + re_path(fr'^group_configurations/{settings.COURSE_KEY_PATTERN}$', + contentstore_views.group_configurations_list_handler, + name='group_configurations_list_handler'), + re_path(r'^group_configurations/{}/(?P\d+)(/)?(?P\d+)?$'.format( settings.COURSE_KEY_PATTERN), contentstore_views.group_configurations_detail_handler, name='group_configurations_detail_handler'), - url(r'^api/val/v0/', include('edxval.urls')), - url(r'^api/tasks/v0/', include('user_tasks.urls')), - url(r'^accessibility$', contentstore_views.accessibility, name='accessibility'), + path('api/val/v0/', include('edxval.urls')), + path('api/tasks/v0/', include('user_tasks.urls')), + path('accessibility', contentstore_views.accessibility, name='accessibility'), ] if not settings.DISABLE_DEPRECATED_SIGNIN_URL: # TODO: Remove deprecated signin url when traffic proves it is no longer in use urlpatterns += [ - url(r'^signin$', contentstore_views.login_redirect_to_lms), + path('signin', contentstore_views.login_redirect_to_lms), ] if not settings.DISABLE_DEPRECATED_SIGNUP_URL: # TODO: Remove deprecated signup url when traffic proves it is no longer in use urlpatterns += [ - url(r'^signup$', contentstore_views.register_redirect_to_lms, name='register_redirect_to_lms'), + path('signup', contentstore_views.register_redirect_to_lms, name='register_redirect_to_lms'), ] JS_INFO_DICT = { @@ -205,37 +204,37 @@ JS_INFO_DICT = { } urlpatterns += [ - url(r'^openassessment/fileupload/', include('openassessment.fileupload.urls')), + path('openassessment/fileupload/', include('openassessment.fileupload.urls')), ] if settings.FEATURES.get('ENABLE_CONTENT_LIBRARIES'): urlpatterns += [ - url(fr'^library/{LIBRARY_KEY_PATTERN}?$', - contentstore_views.library_handler, name='library_handler'), - url(fr'^library/{LIBRARY_KEY_PATTERN}/team/$', - contentstore_views.manage_library_users, name='manage_library_users'), + re_path(fr'^library/{LIBRARY_KEY_PATTERN}?$', + contentstore_views.library_handler, name='library_handler'), + re_path(fr'^library/{LIBRARY_KEY_PATTERN}/team/$', + contentstore_views.manage_library_users, name='manage_library_users'), ] if toggles.EXPORT_GIT.is_enabled(): urlpatterns += [ - url(fr'^export_git/{settings.COURSE_KEY_PATTERN}$', - contentstore_views.export_git, - name='export_git') + re_path(fr'^export_git/{settings.COURSE_KEY_PATTERN}$', + contentstore_views.export_git, + name='export_git') ] if settings.FEATURES.get('ENABLE_SERVICE_STATUS'): - urlpatterns.append(url(r'^status/', include('openedx.core.djangoapps.service_status.urls'))) + urlpatterns.append(path('status/', include('openedx.core.djangoapps.service_status.urls'))) # The password pages in the admin tool are disabled so that all password # changes go through our user portal and follow complexity requirements. if not settings.FEATURES.get('ENABLE_CHANGE_USER_PASSWORD_ADMIN'): - urlpatterns.append(url(r'^admin/auth/user/\d+/password/$', handler404)) -urlpatterns.append(url(r'^admin/password_change/$', handler404)) -urlpatterns.append(url(r'^admin/', admin.site.urls)) + urlpatterns.append(re_path(r'^admin/auth/user/\d+/password/$', handler404)) +urlpatterns.append(path('admin/password_change/', handler404)) +urlpatterns.append(path('admin/', admin.site.urls)) # enable entrance exams if core_toggles.ENTRANCE_EXAMS.is_enabled(): - urlpatterns.append(url(fr'^course/{settings.COURSE_KEY_PATTERN}/entrance_exam/?$', + urlpatterns.append(re_path(fr'^course/{settings.COURSE_KEY_PATTERN}/entrance_exam/?$', contentstore_views.entrance_exam)) # Enable Web/HTML Certificates @@ -248,19 +247,19 @@ if settings.FEATURES.get('CERTIFICATES_HTML_VIEW'): ) urlpatterns += [ - url(fr'^certificates/activation/{settings.COURSE_KEY_PATTERN}/', - certificate_activation_handler, - name='certificate_activation_handler'), - url(r'^certificates/{}/(?P\d+)/signatories/(?P\d+)?$'.format( + re_path(fr'^certificates/activation/{settings.COURSE_KEY_PATTERN}/', + certificate_activation_handler, + name='certificate_activation_handler'), + re_path(r'^certificates/{}/(?P\d+)/signatories/(?P\d+)?$'.format( settings.COURSE_KEY_PATTERN), signatory_detail_handler, name='signatory_detail_handler'), - url(fr'^certificates/{settings.COURSE_KEY_PATTERN}/(?P\d+)?$', - certificates_detail_handler, name='certificates_detail_handler'), - url(fr'^certificates/{settings.COURSE_KEY_PATTERN}$', - certificates_list_handler, name='certificates_list_handler') + re_path(fr'^certificates/{settings.COURSE_KEY_PATTERN}/(?P\d+)?$', + certificates_detail_handler, name='certificates_detail_handler'), + re_path(fr'^certificates/{settings.COURSE_KEY_PATTERN}$', + certificates_list_handler, name='certificates_list_handler') ] # Maintenance Dashboard -urlpatterns.append(url(r'^maintenance/', include('cms.djangoapps.maintenance.urls', namespace='maintenance'))) +urlpatterns.append(path('maintenance/', include('cms.djangoapps.maintenance.urls', namespace='maintenance'))) if settings.DEBUG: try: @@ -281,26 +280,24 @@ if settings.DEBUG: if 'debug_toolbar' in settings.INSTALLED_APPS: import debug_toolbar - urlpatterns.append(url(r'^__debug__/', include(debug_toolbar.urls))) + urlpatterns.append(path('__debug__/', include(debug_toolbar.urls))) # UX reference templates -urlpatterns.append(url(r'^template/(?P