Commit 9d9c199d by bmedx

LMS urls cleanup for Django 1.11

- Remove usage of django.urls.patterns
- Change urls tuples to lists
- Make all string view names callables
- This is the first of several urls updates for LMS; a work in progress
parent 0255592c
...@@ -510,7 +510,7 @@ class XQueueCertInterface(object): ...@@ -510,7 +510,7 @@ class XQueueCertInterface(object):
# for other certificates. Although both tasks use the same queue, # for other certificates. Although both tasks use the same queue,
# we can distinguish whether the certificate was an example cert based # we can distinguish whether the certificate was an example cert based
# on which end-point XQueue uses once the task completes. # on which end-point XQueue uses once the task completes.
callback_url_path = reverse('certificates.views.update_example_certificate') callback_url_path = reverse('update_example_certificate')
try: try:
self._send_to_xqueue( self._send_to_xqueue(
......
...@@ -59,7 +59,7 @@ class UpdateExampleCertificateViewTest(CacheIsolationTestCase): ...@@ -59,7 +59,7 @@ class UpdateExampleCertificateViewTest(CacheIsolationTestCase):
description=self.DESCRIPTION, description=self.DESCRIPTION,
template=self.TEMPLATE, template=self.TEMPLATE,
) )
self.url = reverse('certificates.views.update_example_certificate') self.url = reverse('update_example_certificate')
# Since rate limit counts are cached, we need to clear # Since rate limit counts are cached, we need to clear
# this before each test. # this before each test.
......
...@@ -935,7 +935,7 @@ class CertificatesViewsTests(CommonCertificatesTestCase): ...@@ -935,7 +935,7 @@ class CertificatesViewsTests(CommonCertificatesTestCase):
def test_request_certificate_without_passing(self): def test_request_certificate_without_passing(self):
self.cert.status = CertificateStatuses.unavailable self.cert.status = CertificateStatuses.unavailable
self.cert.save() self.cert.save()
request_certificate_url = reverse('certificates.views.request_certificate') request_certificate_url = reverse('request_certificate')
response = self.client.post(request_certificate_url, {'course_id': unicode(self.course.id)}) response = self.client.post(request_certificate_url, {'course_id': unicode(self.course.id)})
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
response_json = json.loads(response.content) response_json = json.loads(response.content)
...@@ -946,7 +946,7 @@ class CertificatesViewsTests(CommonCertificatesTestCase): ...@@ -946,7 +946,7 @@ class CertificatesViewsTests(CommonCertificatesTestCase):
def test_request_certificate_after_passing(self): def test_request_certificate_after_passing(self):
self.cert.status = CertificateStatuses.unavailable self.cert.status = CertificateStatuses.unavailable
self.cert.save() self.cert.save()
request_certificate_url = reverse('certificates.views.request_certificate') request_certificate_url = reverse('request_certificate')
with patch('capa.xqueue_interface.XQueueInterface.send_to_queue') as mock_queue: with patch('capa.xqueue_interface.XQueueInterface.send_to_queue') as mock_queue:
mock_queue.return_value = (0, "Successfully queued") mock_queue.return_value = (0, "Successfully queued")
with mock_passing_grade(): with mock_passing_grade():
......
...@@ -2,25 +2,52 @@ ...@@ -2,25 +2,52 @@
URLs for LMS URLs for LMS
""" """
from config_models.views import ConfigurationModelCurrentAPIView
from django.conf import settings from django.conf import settings
from django.conf.urls import include, patterns, url from django.conf.urls import include, url
from django.conf.urls.static import static from django.conf.urls.static import static
from django.contrib.admin import autodiscover as django_autodiscover from django.contrib.admin import autodiscover as django_autodiscover
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.views.generic.base import RedirectView from django.views.generic.base import RedirectView
from ratelimitbackend import admin
from branding import views as branding_views
from certificates import views as certificates_views
from config_models.views import ConfigurationModelCurrentAPIView
from courseware.masquerade import handle_ajax as courseware_masquerade_handle_ajax
from courseware.module_render import handle_xblock_callback, handle_xblock_callback_noauth, xblock_view, xqueue_callback
from courseware.views import views as courseware_views
from courseware.views.index import CoursewareIndex from courseware.views.index import CoursewareIndex
from courseware.views.views import CourseTabView, EnrollStaffView, StaticCourseTabView from courseware.views.views import CourseTabView, EnrollStaffView, StaticCourseTabView
from debug import views as debug_views
from django_cas import views as django_cas_views
from django_comment_common.models import ForumsConfig from django_comment_common.models import ForumsConfig
from django_openid_auth import views as django_openid_auth_views
from lms.djangoapps.discussion import views as discussion_views
from lms.djangoapps.instructor.views import coupons as instructor_coupons_views
from lms.djangoapps.instructor.views import instructor_dashboard as instructor_dashboard_views
from lms.djangoapps.instructor.views import registration_codes as instructor_registration_codes_views
from lms.djangoapps.instructor_task import views as instructor_task_views
from lms_migration import migrate as lms_migrate_views
from notes import views as notes_views
from notification_prefs import views as notification_prefs_views
from openedx.core.djangoapps.auth_exchange.views import LoginWithAccessTokenView from openedx.core.djangoapps.auth_exchange.views import LoginWithAccessTokenView
from openedx.core.djangoapps.catalog.models import CatalogIntegration from openedx.core.djangoapps.catalog.models import CatalogIntegration
from openedx.core.djangoapps.cors_csrf import views as cors_csrf_views
from openedx.core.djangoapps.course_groups import views as course_groups_views
from openedx.core.djangoapps.debug import views as openedx_debug_views
from openedx.core.djangoapps.external_auth import views as external_auth_views
from openedx.core.djangoapps.lang_pref import views as lang_pref_views
from openedx.core.djangoapps.programs.models import ProgramsApiConfig from openedx.core.djangoapps.programs.models import ProgramsApiConfig
from openedx.core.djangoapps.self_paced.models import SelfPacedConfiguration from openedx.core.djangoapps.self_paced.models import SelfPacedConfiguration
from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers
from openedx.core.djangoapps.verified_track_content import views as verified_track_content_views
from openedx.features.enterprise_support.api import enterprise_enabled from openedx.features.enterprise_support.api import enterprise_enabled
from ratelimitbackend import admin
from static_template_view import views as static_template_view_views
from staticbook import views as staticbook_views
from student import views as student_views
from student_account import views as student_account_views
from track import views as track_views
from util import views as util_views
if settings.DEBUG or settings.FEATURES.get('ENABLE_DJANGO_ADMIN_SITE'): if settings.DEBUG or settings.FEATURES.get('ENABLE_DJANGO_ADMIN_SITE'):
django_autodiscover() django_autodiscover()
...@@ -28,16 +55,13 @@ if settings.DEBUG or settings.FEATURES.get('ENABLE_DJANGO_ADMIN_SITE'): ...@@ -28,16 +55,13 @@ if settings.DEBUG or settings.FEATURES.get('ENABLE_DJANGO_ADMIN_SITE'):
admin.site.site_title = admin.site.site_header admin.site.site_title = admin.site.site_header
# Use urlpatterns formatted as within the Django docs with first parameter "stuck" to the open parenthesis urlpatterns = [
urlpatterns = ( url(r'^$', branding_views.index, name='root'), # Main marketing page, or redirect to courseware
'',
url(r'^$', 'branding.views.index', name="root"), # Main marketing page, or redirect to courseware
url(r'', include('student.urls')), url(r'', include('student.urls')),
# TODO: Move lms specific student views out of common code # TODO: Move lms specific student views out of common code
url(r'^dashboard$', 'student.views.dashboard', name="dashboard"), url(r'^dashboard$', student_views.dashboard, name='dashboard'),
url(r'^change_enrollment$', 'student.views.change_enrollment', name='change_enrollment'), url(r'^change_enrollment$', student_views.change_enrollment, name='change_enrollment'),
# Event tracking endpoints # Event tracking endpoints
url(r'', include('track.urls')), url(r'', include('track.urls')),
...@@ -59,7 +83,7 @@ urlpatterns = ( ...@@ -59,7 +83,7 @@ urlpatterns = (
url(r'^i18n/', include('django.conf.urls.i18n')), url(r'^i18n/', include('django.conf.urls.i18n')),
# Feedback Form endpoint # Feedback Form endpoint
url(r'^submit_feedback$', 'util.views.submit_feedback'), url(r'^submit_feedback$', util_views.submit_feedback),
# Enrollment API RESTful endpoints # Enrollment API RESTful endpoints
url(r'^api/enrollment/v1/', include('enrollment.urls')), url(r'^api/enrollment/v1/', include('enrollment.urls')),
...@@ -87,21 +111,16 @@ urlpatterns = ( ...@@ -87,21 +111,16 @@ urlpatterns = (
url(r'^api/val/v0/', include('edxval.urls')), url(r'^api/val/v0/', include('edxval.urls')),
url(r'^api/commerce/', include('commerce.api.urls', namespace='commerce_api')), url(r'^api/commerce/', include('commerce.api.urls', namespace='commerce_api')),
url(r'^api/credit/', include('openedx.core.djangoapps.credit.urls', app_name="credit", namespace='credit')), url(r'^api/credit/', include('openedx.core.djangoapps.credit.urls', app_name='credit', namespace='credit')),
url(r'^rss_proxy/', include('rss_proxy.urls', namespace='rss_proxy')), url(r'^rss_proxy/', include('rss_proxy.urls', namespace='rss_proxy')),
url(r'^api/organizations/', include('organizations.urls', namespace='organizations')), url(r'^api/organizations/', include('organizations.urls', namespace='organizations')),
url(r'^catalog/', include('openedx.core.djangoapps.catalog.urls', namespace='catalog')), url(r'^catalog/', include('openedx.core.djangoapps.catalog.urls', namespace='catalog')),
# Update session view # Update session view
url( url(r'^lang_pref/session_language', lang_pref_views.update_session_language, name='session_language'),
r'^lang_pref/session_language',
'openedx.core.djangoapps.lang_pref.views.update_session_language',
name='session_language'
),
# Multiple course modes and identity verification # Multiple course modes and identity verification
# TODO Namespace these!
url(r'^course_modes/', include('course_modes.urls')), url(r'^course_modes/', include('course_modes.urls')),
url(r'^verify_student/', include('verify_student.urls')), url(r'^verify_student/', include('verify_student.urls')),
...@@ -119,34 +138,34 @@ urlpatterns = ( ...@@ -119,34 +138,34 @@ urlpatterns = (
url(r'^dashboard/', include('learner_dashboard.urls')), url(r'^dashboard/', include('learner_dashboard.urls')),
url(r'^api/experiments/', include('experiments.urls', namespace='api_experiments')), url(r'^api/experiments/', include('experiments.urls', namespace='api_experiments')),
) ]
# TODO: This needs to move to a separate urls.py once the student_account and # TODO: This needs to move to a separate urls.py once the student_account and
# student views below find a home together # student views below find a home together
if settings.FEATURES["ENABLE_COMBINED_LOGIN_REGISTRATION"]: if settings.FEATURES['ENABLE_COMBINED_LOGIN_REGISTRATION']:
# Backwards compatibility with old URL structure, but serve the new views # Backwards compatibility with old URL structure, but serve the new views
urlpatterns += ( urlpatterns += [
url(r'^login$', 'student_account.views.login_and_registration_form', url(r'^login$', student_account_views.login_and_registration_form,
{'initial_mode': 'login'}, name="signin_user"), {'initial_mode': 'login'}, name='signin_user'),
url(r'^register$', 'student_account.views.login_and_registration_form', url(r'^register$', student_account_views.login_and_registration_form,
{'initial_mode': 'register'}, name="register_user"), {'initial_mode': 'register'}, name='register_user'),
) ]
else: else:
# Serve the old views # Serve the old views
urlpatterns += ( urlpatterns += [
url(r'^login$', 'student.views.signin_user', name="signin_user"), url(r'^login$', student_views.signin_user, name='signin_user'),
url(r'^register$', 'student.views.register_user', name="register_user"), url(r'^register$', student_views.register_user, name='register_user'),
) ]
if settings.FEATURES["ENABLE_MOBILE_REST_API"]: if settings.FEATURES['ENABLE_MOBILE_REST_API']:
urlpatterns += ( urlpatterns += [
url(r'^api/mobile/v0.5/', include('mobile_api.urls')), url(r'^api/mobile/v0.5/', include('mobile_api.urls')),
) ]
if settings.FEATURES["ENABLE_OPENBADGES"]: if settings.FEATURES['ENABLE_OPENBADGES']:
urlpatterns += ( urlpatterns += [
url(r'^api/badges/v1/', include('badges.api.urls', app_name="badges", namespace="badges_api")), url(r'^api/badges/v1/', include('badges.api.urls', app_name='badges', namespace='badges_api')),
) ]
js_info_dict = { js_info_dict = {
'domain': 'djangojs', 'domain': 'djangojs',
...@@ -154,75 +173,74 @@ js_info_dict = { ...@@ -154,75 +173,74 @@ js_info_dict = {
'packages': ('openassessment',), 'packages': ('openassessment',),
} }
urlpatterns += ( urlpatterns += [
url(r'^openassessment/fileupload/', include('openassessment.fileupload.urls')), url(r'^openassessment/fileupload/', include('openassessment.fileupload.urls')),
) ]
# sysadmin dashboard, to see what courses are loaded, to delete & load courses # sysadmin dashboard, to see what courses are loaded, to delete & load courses
if settings.FEATURES["ENABLE_SYSADMIN_DASHBOARD"]: if settings.FEATURES['ENABLE_SYSADMIN_DASHBOARD']:
urlpatterns += ( urlpatterns += [
url(r'^sysadmin/', include('dashboard.sysadmin_urls')), url(r'^sysadmin/', include('dashboard.sysadmin_urls')),
) ]
urlpatterns += ( urlpatterns += [
url(r'^support/', include('support.urls', app_name="support", namespace='support')), url(r'^support/', include('support.urls', app_name='support', namespace='support')),
) ]
# Favicon # Favicon
favicon_path = configuration_helpers.get_value('favicon_path', settings.FAVICON_PATH) # pylint: disable=invalid-name favicon_path = configuration_helpers.get_value('favicon_path', settings.FAVICON_PATH) # pylint: disable=invalid-name
urlpatterns += (url( urlpatterns += [
r'^favicon\.ico$', url(r'^favicon\.ico$', RedirectView.as_view(url=settings.STATIC_URL + favicon_path, permanent=True)),
RedirectView.as_view(url=settings.STATIC_URL + favicon_path, permanent=True) ]
),)
# Multicourse wiki (Note: wiki urls must be above the courseware ones because of # Multicourse wiki (Note: wiki urls must be above the courseware ones because of
# the custom tab catch-all) # the custom tab catch-all)
if settings.WIKI_ENABLED: if settings.WIKI_ENABLED:
from wiki.urls import get_pattern as wiki_pattern from wiki.urls import get_pattern as wiki_pattern
from course_wiki import views as course_wiki_views
from django_notify.urls import get_pattern as notify_pattern from django_notify.urls import get_pattern as notify_pattern
urlpatterns += ( urlpatterns += [
# First we include views from course_wiki that we use to override the default views. # First we include views from course_wiki that we use to override the default views.
# They come first in the urlpatterns so they get resolved first # They come first in the urlpatterns so they get resolved first
url('^wiki/create-root/$', 'course_wiki.views.root_create', name='root_create'), url('^wiki/create-root/$', course_wiki_views.root_create, name='root_create'),
url(r'^wiki/', include(wiki_pattern())), url(r'^wiki/', include(wiki_pattern())),
url(r'^notify/', include(notify_pattern())), url(r'^notify/', include(notify_pattern())),
# These urls are for viewing the wiki in the context of a course. They should # These urls are for viewing the wiki in the context of a course. They should
# never be returned by a reverse() so they come after the other url patterns # never be returned by a reverse() so they come after the other url patterns
url(r'^courses/{}/course_wiki/?$'.format(settings.COURSE_ID_PATTERN), url(r'^courses/{}/course_wiki/?$'.format(settings.COURSE_ID_PATTERN),
'course_wiki.views.course_wiki_redirect', name="course_wiki"), course_wiki_views.course_wiki_redirect, name='course_wiki'),
url(r'^courses/{}/wiki/'.format(settings.COURSE_KEY_REGEX), include(wiki_pattern())), url(r'^courses/{}/wiki/'.format(settings.COURSE_KEY_REGEX), include(wiki_pattern())),
) ]
COURSE_URLS = patterns( COURSE_URLS = [
'',
url( url(
r'^look_up_registration_code$', r'^look_up_registration_code$',
'lms.djangoapps.instructor.views.registration_codes.look_up_registration_code', instructor_registration_codes_views.look_up_registration_code,
name='look_up_registration_code', name='look_up_registration_code',
), ),
url( url(
r'^registration_code_details$', r'^registration_code_details$',
'lms.djangoapps.instructor.views.registration_codes.registration_code_details', instructor_registration_codes_views.registration_code_details,
name='registration_code_details', name='registration_code_details',
), ),
) ]
urlpatterns += ( urlpatterns += [
# jump_to URLs for direct access to a location in the course # jump_to URLs for direct access to a location in the course
url( url(
r'^courses/{}/jump_to/(?P<location>.*)$'.format( r'^courses/{}/jump_to/(?P<location>.*)$'.format(
settings.COURSE_ID_PATTERN, settings.COURSE_ID_PATTERN,
), ),
'courseware.views.views.jump_to', courseware_views.jump_to,
name='jump_to', name='jump_to',
), ),
url( url(
r'^courses/{}/jump_to_id/(?P<module_id>.*)$'.format( r'^courses/{}/jump_to_id/(?P<module_id>.*)$'.format(
settings.COURSE_ID_PATTERN, settings.COURSE_ID_PATTERN,
), ),
'courseware.views.views.jump_to_id', courseware_views.jump_to_id,
name='jump_to_id', name='jump_to_id',
), ),
...@@ -232,7 +250,7 @@ urlpatterns += ( ...@@ -232,7 +250,7 @@ urlpatterns += (
course_key=settings.COURSE_ID_PATTERN, course_key=settings.COURSE_ID_PATTERN,
usage_key=settings.USAGE_ID_PATTERN, usage_key=settings.USAGE_ID_PATTERN,
), ),
'courseware.module_render.handle_xblock_callback', handle_xblock_callback,
name='xblock_handler', name='xblock_handler',
), ),
url( url(
...@@ -240,7 +258,7 @@ urlpatterns += ( ...@@ -240,7 +258,7 @@ urlpatterns += (
course_key=settings.COURSE_ID_PATTERN, course_key=settings.COURSE_ID_PATTERN,
usage_key=settings.USAGE_ID_PATTERN, usage_key=settings.USAGE_ID_PATTERN,
), ),
'courseware.module_render.handle_xblock_callback_noauth', handle_xblock_callback_noauth,
name='xblock_handler_noauth', name='xblock_handler_noauth',
), ),
...@@ -252,17 +270,17 @@ urlpatterns += ( ...@@ -252,17 +270,17 @@ urlpatterns += (
course_key=settings.COURSE_ID_PATTERN, course_key=settings.COURSE_ID_PATTERN,
usage_key=settings.USAGE_ID_PATTERN, usage_key=settings.USAGE_ID_PATTERN,
), ),
'courseware.module_render.xblock_view', xblock_view,
name='xblock_view', name='xblock_view',
), ),
# xblock Rendering View URL # xblock Rendering View URL
# URL to provide an HTML view of an xBlock. The view type (e.g., student_view) is # URL to provide an HTML view of an xBlock. The view type (e.g., student_view) is
# passed as a "view" parameter to the URL. # passed as a 'view' parameter to the URL.
# Note: This is not an API. Compare this with the xblock_view API above. # Note: This is not an API. Compare this with the xblock_view API above.
url( url(
r'^xblock/{usage_key_string}$'.format(usage_key_string=settings.USAGE_KEY_PATTERN), r'^xblock/{usage_key_string}$'.format(usage_key_string=settings.USAGE_KEY_PATTERN),
'courseware.views.views.render_xblock', courseware_views.render_xblock,
name='render_xblock', name='render_xblock',
), ),
...@@ -277,21 +295,21 @@ urlpatterns += ( ...@@ -277,21 +295,21 @@ urlpatterns += (
r'^courses/{}/xqueue/(?P<userid>[^/]*)/(?P<mod_id>.*?)/(?P<dispatch>[^/]*)$'.format( r'^courses/{}/xqueue/(?P<userid>[^/]*)/(?P<mod_id>.*?)/(?P<dispatch>[^/]*)$'.format(
settings.COURSE_ID_PATTERN, settings.COURSE_ID_PATTERN,
), ),
'courseware.module_render.xqueue_callback', xqueue_callback,
name='xqueue_callback', name='xqueue_callback',
), ),
# TODO: These views need to be updated before they work # TODO: These views need to be updated before they work
url(r'^calculate$', 'util.views.calculate'), url(r'^calculate$', util_views.calculate),
url(r'^courses/?$', 'branding.views.courses', name="courses"), url(r'^courses/?$', branding_views.courses, name='courses'),
#About the course #About the course
url( url(
r'^courses/{}/about$'.format( r'^courses/{}/about$'.format(
settings.COURSE_ID_PATTERN, settings.COURSE_ID_PATTERN,
), ),
'courseware.views.views.course_about', courseware_views.course_about,
name='about_course', name='about_course',
), ),
...@@ -308,14 +326,14 @@ urlpatterns += ( ...@@ -308,14 +326,14 @@ urlpatterns += (
r'^courses/{}/$'.format( r'^courses/{}/$'.format(
settings.COURSE_ID_PATTERN, settings.COURSE_ID_PATTERN,
), ),
'courseware.views.views.course_info', courseware_views.course_info,
name='course_root', name='course_root',
), ),
url( url(
r'^courses/{}/info$'.format( r'^courses/{}/info$'.format(
settings.COURSE_ID_PATTERN, settings.COURSE_ID_PATTERN,
), ),
'courseware.views.views.course_info', courseware_views.course_info,
name='info', name='info',
), ),
# TODO arjun remove when custom tabs in place, see courseware/courses.py # TODO arjun remove when custom tabs in place, see courseware/courses.py
...@@ -323,7 +341,7 @@ urlpatterns += ( ...@@ -323,7 +341,7 @@ urlpatterns += (
r'^courses/{}/syllabus$'.format( r'^courses/{}/syllabus$'.format(
settings.COURSE_ID_PATTERN, settings.COURSE_ID_PATTERN,
), ),
'courseware.views.views.syllabus', courseware_views.syllabus,
name='syllabus', name='syllabus',
), ),
...@@ -332,7 +350,7 @@ urlpatterns += ( ...@@ -332,7 +350,7 @@ urlpatterns += (
r'^courses/{}/survey$'.format( r'^courses/{}/survey$'.format(
settings.COURSE_ID_PATTERN, settings.COURSE_ID_PATTERN,
), ),
'courseware.views.views.course_survey', courseware_views.course_survey,
name='course_survey', name='course_survey',
), ),
...@@ -340,14 +358,14 @@ urlpatterns += ( ...@@ -340,14 +358,14 @@ urlpatterns += (
r'^courses/{}/book/(?P<book_index>\d+)/$'.format( r'^courses/{}/book/(?P<book_index>\d+)/$'.format(
settings.COURSE_ID_PATTERN, settings.COURSE_ID_PATTERN,
), ),
'staticbook.views.index', staticbook_views.index,
name='book', name='book',
), ),
url( url(
r'^courses/{}/book/(?P<book_index>\d+)/(?P<page>\d+)$'.format( r'^courses/{}/book/(?P<book_index>\d+)/(?P<page>\d+)$'.format(
settings.COURSE_ID_PATTERN, settings.COURSE_ID_PATTERN,
), ),
'staticbook.views.index', staticbook_views.index,
name='book', name='book',
), ),
...@@ -355,14 +373,14 @@ urlpatterns += ( ...@@ -355,14 +373,14 @@ urlpatterns += (
r'^courses/{}/pdfbook/(?P<book_index>\d+)/$'.format( r'^courses/{}/pdfbook/(?P<book_index>\d+)/$'.format(
settings.COURSE_ID_PATTERN, settings.COURSE_ID_PATTERN,
), ),
'staticbook.views.pdf_index', staticbook_views.pdf_index,
name='pdf_book', name='pdf_book',
), ),
url( url(
r'^courses/{}/pdfbook/(?P<book_index>\d+)/(?P<page>\d+)$'.format( r'^courses/{}/pdfbook/(?P<book_index>\d+)/(?P<page>\d+)$'.format(
settings.COURSE_ID_PATTERN, settings.COURSE_ID_PATTERN,
), ),
'staticbook.views.pdf_index', staticbook_views.pdf_index,
name='pdf_book', name='pdf_book',
), ),
...@@ -370,14 +388,14 @@ urlpatterns += ( ...@@ -370,14 +388,14 @@ urlpatterns += (
r'^courses/{}/pdfbook/(?P<book_index>\d+)/chapter/(?P<chapter>\d+)/$'.format( r'^courses/{}/pdfbook/(?P<book_index>\d+)/chapter/(?P<chapter>\d+)/$'.format(
settings.COURSE_ID_PATTERN, settings.COURSE_ID_PATTERN,
), ),
'staticbook.views.pdf_index', staticbook_views.pdf_index,
name='pdf_book', name='pdf_book',
), ),
url( url(
r'^courses/{}/pdfbook/(?P<book_index>\d+)/chapter/(?P<chapter>\d+)/(?P<page>\d+)$'.format( r'^courses/{}/pdfbook/(?P<book_index>\d+)/chapter/(?P<chapter>\d+)/(?P<page>\d+)$'.format(
settings.COURSE_ID_PATTERN, settings.COURSE_ID_PATTERN,
), ),
'staticbook.views.pdf_index', staticbook_views.pdf_index,
name='pdf_book', name='pdf_book',
), ),
...@@ -385,14 +403,14 @@ urlpatterns += ( ...@@ -385,14 +403,14 @@ urlpatterns += (
r'^courses/{}/htmlbook/(?P<book_index>\d+)/$'.format( r'^courses/{}/htmlbook/(?P<book_index>\d+)/$'.format(
settings.COURSE_ID_PATTERN, settings.COURSE_ID_PATTERN,
), ),
'staticbook.views.html_index', staticbook_views.html_index,
name='html_book', name='html_book',
), ),
url( url(
r'^courses/{}/htmlbook/(?P<book_index>\d+)/chapter/(?P<chapter>\d+)/$'.format( r'^courses/{}/htmlbook/(?P<book_index>\d+)/chapter/(?P<chapter>\d+)/$'.format(
settings.COURSE_ID_PATTERN, settings.COURSE_ID_PATTERN,
), ),
'staticbook.views.html_index', staticbook_views.html_index,
name='html_book', name='html_book',
), ),
...@@ -430,7 +448,7 @@ urlpatterns += ( ...@@ -430,7 +448,7 @@ urlpatterns += (
r'^courses/{}/progress$'.format( r'^courses/{}/progress$'.format(
settings.COURSE_ID_PATTERN, settings.COURSE_ID_PATTERN,
), ),
'courseware.views.views.progress', courseware_views.progress,
name='progress', name='progress',
), ),
...@@ -439,7 +457,7 @@ urlpatterns += ( ...@@ -439,7 +457,7 @@ urlpatterns += (
r'^courses/{}/progress/(?P<student_id>[^/]*)/$'.format( r'^courses/{}/progress/(?P<student_id>[^/]*)/$'.format(
settings.COURSE_ID_PATTERN, settings.COURSE_ID_PATTERN,
), ),
'courseware.views.views.progress', courseware_views.progress,
name='student_progress', name='student_progress',
), ),
...@@ -447,7 +465,7 @@ urlpatterns += ( ...@@ -447,7 +465,7 @@ urlpatterns += (
r'^programs/{}/about'.format( r'^programs/{}/about'.format(
r'(?P<program_uuid>[0-9a-f-]+)', r'(?P<program_uuid>[0-9a-f-]+)',
), ),
'courseware.views.views.program_marketing', courseware_views.program_marketing,
name='program_marketing_view', name='program_marketing_view',
), ),
...@@ -463,7 +481,7 @@ urlpatterns += ( ...@@ -463,7 +481,7 @@ urlpatterns += (
r'^courses/{}/instructor$'.format( r'^courses/{}/instructor$'.format(
settings.COURSE_ID_PATTERN, settings.COURSE_ID_PATTERN,
), ),
'lms.djangoapps.instructor.views.instructor_dashboard.instructor_dashboard_2', instructor_dashboard_views.instructor_dashboard_2,
name='instructor_dashboard', name='instructor_dashboard',
), ),
...@@ -472,7 +490,7 @@ urlpatterns += ( ...@@ -472,7 +490,7 @@ urlpatterns += (
r'^courses/{}/set_course_mode_price$'.format( r'^courses/{}/set_course_mode_price$'.format(
settings.COURSE_ID_PATTERN, settings.COURSE_ID_PATTERN,
), ),
'lms.djangoapps.instructor.views.instructor_dashboard.set_course_mode_price', instructor_dashboard_views.set_course_mode_price,
name='set_course_mode_price', name='set_course_mode_price',
), ),
url( url(
...@@ -484,28 +502,28 @@ urlpatterns += ( ...@@ -484,28 +502,28 @@ urlpatterns += (
r'^courses/{}/remove_coupon$'.format( r'^courses/{}/remove_coupon$'.format(
settings.COURSE_ID_PATTERN, settings.COURSE_ID_PATTERN,
), ),
'lms.djangoapps.instructor.views.coupons.remove_coupon', instructor_coupons_views.remove_coupon,
name='remove_coupon', name='remove_coupon',
), ),
url( url(
r'^courses/{}/add_coupon$'.format( r'^courses/{}/add_coupon$'.format(
settings.COURSE_ID_PATTERN, settings.COURSE_ID_PATTERN,
), ),
'lms.djangoapps.instructor.views.coupons.add_coupon', instructor_coupons_views.add_coupon,
name='add_coupon', name='add_coupon',
), ),
url( url(
r'^courses/{}/update_coupon$'.format( r'^courses/{}/update_coupon$'.format(
settings.COURSE_ID_PATTERN, settings.COURSE_ID_PATTERN,
), ),
'lms.djangoapps.instructor.views.coupons.update_coupon', instructor_coupons_views.update_coupon,
name='update_coupon', name='update_coupon',
), ),
url( url(
r'^courses/{}/get_coupon_info$'.format( r'^courses/{}/get_coupon_info$'.format(
settings.COURSE_ID_PATTERN, settings.COURSE_ID_PATTERN,
), ),
'lms.djangoapps.instructor.views.coupons.get_coupon_info', instructor_coupons_views.get_coupon_info,
name='get_coupon_info', name='get_coupon_info',
), ),
...@@ -521,7 +539,7 @@ urlpatterns += ( ...@@ -521,7 +539,7 @@ urlpatterns += (
r'^courses/{}/discussions/settings$'.format( r'^courses/{}/discussions/settings$'.format(
settings.COURSE_KEY_PATTERN, settings.COURSE_KEY_PATTERN,
), ),
'lms.djangoapps.discussion.views.course_discussions_settings_handler', discussion_views.course_discussions_settings_handler,
name='course_discussions_settings', name='course_discussions_settings',
), ),
...@@ -530,63 +548,63 @@ urlpatterns += ( ...@@ -530,63 +548,63 @@ urlpatterns += (
r'^courses/{}/cohorts/settings$'.format( r'^courses/{}/cohorts/settings$'.format(
settings.COURSE_KEY_PATTERN, settings.COURSE_KEY_PATTERN,
), ),
'openedx.core.djangoapps.course_groups.views.course_cohort_settings_handler', course_groups_views.course_cohort_settings_handler,
name='course_cohort_settings', name='course_cohort_settings',
), ),
url( url(
r'^courses/{}/cohorts/(?P<cohort_id>[0-9]+)?$'.format( r'^courses/{}/cohorts/(?P<cohort_id>[0-9]+)?$'.format(
settings.COURSE_KEY_PATTERN, settings.COURSE_KEY_PATTERN,
), ),
'openedx.core.djangoapps.course_groups.views.cohort_handler', course_groups_views.cohort_handler,
name='cohorts', name='cohorts',
), ),
url( url(
r'^courses/{}/cohorts/(?P<cohort_id>[0-9]+)$'.format( r'^courses/{}/cohorts/(?P<cohort_id>[0-9]+)$'.format(
settings.COURSE_KEY_PATTERN, settings.COURSE_KEY_PATTERN,
), ),
'openedx.core.djangoapps.course_groups.views.users_in_cohort', course_groups_views.users_in_cohort,
name='list_cohort', name='list_cohort',
), ),
url( url(
r'^courses/{}/cohorts/(?P<cohort_id>[0-9]+)/add$'.format( r'^courses/{}/cohorts/(?P<cohort_id>[0-9]+)/add$'.format(
settings.COURSE_KEY_PATTERN, settings.COURSE_KEY_PATTERN,
), ),
'openedx.core.djangoapps.course_groups.views.add_users_to_cohort', course_groups_views.add_users_to_cohort,
name='add_to_cohort', name='add_to_cohort',
), ),
url( url(
r'^courses/{}/cohorts/(?P<cohort_id>[0-9]+)/delete$'.format( r'^courses/{}/cohorts/(?P<cohort_id>[0-9]+)/delete$'.format(
settings.COURSE_KEY_PATTERN, settings.COURSE_KEY_PATTERN,
), ),
'openedx.core.djangoapps.course_groups.views.remove_user_from_cohort', course_groups_views.remove_user_from_cohort,
name='remove_from_cohort', name='remove_from_cohort',
), ),
url( url(
r'^courses/{}/cohorts/debug$'.format( r'^courses/{}/cohorts/debug$'.format(
settings.COURSE_KEY_PATTERN, settings.COURSE_KEY_PATTERN,
), ),
'openedx.core.djangoapps.course_groups.views.debug_cohort_mgmt', course_groups_views.debug_cohort_mgmt,
name='debug_cohort_mgmt', name='debug_cohort_mgmt',
), ),
url( url(
r'^courses/{}/discussion/topics$'.format( r'^courses/{}/discussion/topics$'.format(
settings.COURSE_KEY_PATTERN, settings.COURSE_KEY_PATTERN,
), ),
'lms.djangoapps.discussion.views.discussion_topics', discussion_views.discussion_topics,
name='discussion_topics', name='discussion_topics',
), ),
url( url(
r'^courses/{}/verified_track_content/settings'.format( r'^courses/{}/verified_track_content/settings'.format(
settings.COURSE_KEY_PATTERN, settings.COURSE_KEY_PATTERN,
), ),
'openedx.core.djangoapps.verified_track_content.views.cohorting_settings', verified_track_content_views.cohorting_settings,
name='verified_track_cohorting', name='verified_track_cohorting',
), ),
url( url(
r'^courses/{}/notes$'.format( r'^courses/{}/notes$'.format(
settings.COURSE_ID_PATTERN, settings.COURSE_ID_PATTERN,
), ),
'notes.views.notes', notes_views.notes,
name='notes', name='notes',
), ),
url( url(
...@@ -601,7 +619,7 @@ urlpatterns += ( ...@@ -601,7 +619,7 @@ urlpatterns += (
r'^courses/{}/lti_rest_endpoints/'.format( r'^courses/{}/lti_rest_endpoints/'.format(
settings.COURSE_ID_PATTERN, settings.COURSE_ID_PATTERN,
), ),
'courseware.views.views.get_course_lti_endpoints', courseware_views.get_course_lti_endpoints,
name='lti_rest_endpoints', name='lti_rest_endpoints',
), ),
...@@ -655,11 +673,11 @@ urlpatterns += ( ...@@ -655,11 +673,11 @@ urlpatterns += (
r'^u/', r'^u/',
include('openedx.features.learner_profile.urls'), include('openedx.features.learner_profile.urls'),
), ),
) ]
if settings.FEATURES["ENABLE_TEAMS"]: if settings.FEATURES['ENABLE_TEAMS']:
# Teams endpoints # Teams endpoints
urlpatterns += ( urlpatterns += [
url( url(
r'^api/team/', r'^api/team/',
include('lms.djangoapps.teams.api_urls') include('lms.djangoapps.teams.api_urls')
...@@ -671,33 +689,33 @@ if settings.FEATURES["ENABLE_TEAMS"]: ...@@ -671,33 +689,33 @@ if settings.FEATURES["ENABLE_TEAMS"]:
include('lms.djangoapps.teams.urls'), include('lms.djangoapps.teams.urls'),
name='teams_endpoints', name='teams_endpoints',
), ),
) ]
# allow course staff to change to student view of courseware # allow course staff to change to student view of courseware
if settings.FEATURES.get('ENABLE_MASQUERADE'): if settings.FEATURES.get('ENABLE_MASQUERADE'):
urlpatterns += ( urlpatterns += [
url( url(
r'^courses/{}/masquerade$'.format( r'^courses/{}/masquerade$'.format(
settings.COURSE_KEY_PATTERN, settings.COURSE_KEY_PATTERN,
), ),
'courseware.masquerade.handle_ajax', courseware_masquerade_handle_ajax,
name='masquerade_update', name='masquerade_update',
), ),
) ]
urlpatterns += ( urlpatterns += [
url( url(
r'^courses/{}/generate_user_cert'.format( r'^courses/{}/generate_user_cert'.format(
settings.COURSE_ID_PATTERN, settings.COURSE_ID_PATTERN,
), ),
'courseware.views.views.generate_user_cert', courseware_views.generate_user_cert,
name='generate_user_cert', name='generate_user_cert',
), ),
) ]
# discussion forums live within courseware, so courseware must be enabled first # discussion forums live within courseware, so courseware must be enabled first
if settings.FEATURES.get('ENABLE_DISCUSSION_SERVICE'): if settings.FEATURES.get('ENABLE_DISCUSSION_SERVICE'):
urlpatterns += ( urlpatterns += [
url( url(
r'^api/discussion/', r'^api/discussion/',
include('discussion_api.urls') include('discussion_api.urls')
...@@ -716,19 +734,19 @@ if settings.FEATURES.get('ENABLE_DISCUSSION_SERVICE'): ...@@ -716,19 +734,19 @@ if settings.FEATURES.get('ENABLE_DISCUSSION_SERVICE'):
), ),
url( url(
r'^notification_prefs/enable/', r'^notification_prefs/enable/',
'notification_prefs.views.ajax_enable' notification_prefs_views.ajax_enable
), ),
url( url(
r'^notification_prefs/disable/', r'^notification_prefs/disable/',
'notification_prefs.views.ajax_disable' notification_prefs_views.ajax_disable
), ),
url( url(
r'^notification_prefs/status/', r'^notification_prefs/status/',
'notification_prefs.views.ajax_status' notification_prefs_views.ajax_status
), ),
url( url(
r'^notification_prefs/unsubscribe/(?P<token>[a-zA-Z0-9-_=]+)/', r'^notification_prefs/unsubscribe/(?P<token>[a-zA-Z0-9-_=]+)/',
'notification_prefs.views.set_subscription', notification_prefs_views.set_subscription,
{ {
'subscribe': False, 'subscribe': False,
}, },
...@@ -736,15 +754,15 @@ if settings.FEATURES.get('ENABLE_DISCUSSION_SERVICE'): ...@@ -736,15 +754,15 @@ if settings.FEATURES.get('ENABLE_DISCUSSION_SERVICE'):
), ),
url( url(
r'^notification_prefs/resubscribe/(?P<token>[a-zA-Z0-9-_=]+)/', r'^notification_prefs/resubscribe/(?P<token>[a-zA-Z0-9-_=]+)/',
'notification_prefs.views.set_subscription', notification_prefs_views.set_subscription,
{ {
'subscribe': True, 'subscribe': True,
}, },
name='resubscribe_forum_update', name='resubscribe_forum_update',
), ),
) ]
urlpatterns += ( urlpatterns += [
url( url(
r'^courses/{}/tab/(?P<tab_type>[^/]+)/$'.format( r'^courses/{}/tab/(?P<tab_type>[^/]+)/$'.format(
settings.COURSE_ID_PATTERN, settings.COURSE_ID_PATTERN,
...@@ -752,9 +770,9 @@ urlpatterns += ( ...@@ -752,9 +770,9 @@ urlpatterns += (
CourseTabView.as_view(), CourseTabView.as_view(),
name='course_tab_view', name='course_tab_view',
), ),
) ]
urlpatterns += ( urlpatterns += [
# This MUST be the last view in the courseware--it's a catch-all for custom tabs. # This MUST be the last view in the courseware--it's a catch-all for custom tabs.
url( url(
r'^courses/{}/(?P<tab_slug>[^/]+)/$'.format( r'^courses/{}/(?P<tab_slug>[^/]+)/$'.format(
...@@ -763,115 +781,115 @@ urlpatterns += ( ...@@ -763,115 +781,115 @@ urlpatterns += (
StaticCourseTabView.as_view(), StaticCourseTabView.as_view(),
name='static_tab', name='static_tab',
), ),
) ]
if settings.FEATURES.get('ENABLE_STUDENT_HISTORY_VIEW'): if settings.FEATURES.get('ENABLE_STUDENT_HISTORY_VIEW'):
urlpatterns += ( urlpatterns += [
url( url(
r'^courses/{}/submission_history/(?P<student_username>[^/]*)/(?P<location>.*?)$'.format( r'^courses/{}/submission_history/(?P<student_username>[^/]*)/(?P<location>.*?)$'.format(
settings.COURSE_ID_PATTERN settings.COURSE_ID_PATTERN
), ),
'courseware.views.views.submission_history', courseware_views.submission_history,
name='submission_history', name='submission_history',
), ),
) ]
if settings.FEATURES.get('CLASS_DASHBOARD'): if settings.FEATURES.get('CLASS_DASHBOARD'):
urlpatterns += ( urlpatterns += [
url(r'^class_dashboard/', include('class_dashboard.urls')), url(r'^class_dashboard/', include('class_dashboard.urls')),
) ]
if settings.DEBUG or settings.FEATURES.get('ENABLE_DJANGO_ADMIN_SITE'): if settings.DEBUG or settings.FEATURES.get('ENABLE_DJANGO_ADMIN_SITE'):
## Jasmine and admin # Jasmine and admin
urlpatterns += (url(r'^admin/', include(admin.site.urls)),) urlpatterns += [
url(r'^admin/', include(admin.site.urls)),
]
if settings.FEATURES.get('AUTH_USE_OPENID'): if settings.FEATURES.get('AUTH_USE_OPENID'):
urlpatterns += ( urlpatterns += [
url(r'^openid/login/$', 'django_openid_auth.views.login_begin', name='openid-login'), url(r'^openid/login/$', django_openid_auth_views.login_begin, name='openid-login'),
url( url(
r'^openid/complete/$', r'^openid/complete/$',
'openedx.core.djangoapps.external_auth.views.openid_login_complete', external_auth_views.openid_login_complete,
name='openid-complete', name='openid-complete',
), ),
url(r'^openid/logo.gif$', 'django_openid_auth.views.logo', name='openid-logo'), url(r'^openid/logo.gif$', django_openid_auth_views.logo, name='openid-logo'),
) ]
if settings.FEATURES.get('AUTH_USE_SHIB'): if settings.FEATURES.get('AUTH_USE_SHIB'):
urlpatterns += ( urlpatterns += [
url(r'^shib-login/$', 'openedx.core.djangoapps.external_auth.views.shib_login', name='shib-login'), url(r'^shib-login/$', external_auth_views.shib_login, name='shib-login'),
) ]
if settings.FEATURES.get('AUTH_USE_CAS'): if settings.FEATURES.get('AUTH_USE_CAS'):
urlpatterns += ( urlpatterns += [
url(r'^cas-auth/login/$', 'openedx.core.djangoapps.external_auth.views.cas_login', name="cas-login"), url(r'^cas-auth/login/$', external_auth_views.cas_login, name='cas-login'),
url(r'^cas-auth/logout/$', 'django_cas.views.logout', {'next_page': '/'}, name="cas-logout"), url(r'^cas-auth/logout/$', django_cas_views.logout, {'next_page': '/'}, name='cas-logout'),
) ]
if settings.FEATURES.get('RESTRICT_ENROLL_BY_REG_METHOD'): if settings.FEATURES.get('RESTRICT_ENROLL_BY_REG_METHOD'):
urlpatterns += ( urlpatterns += [
url(r'^course_specific_login/{}/$'.format(settings.COURSE_ID_PATTERN), url(r'^course_specific_login/{}/$'.format(settings.COURSE_ID_PATTERN),
'openedx.core.djangoapps.external_auth.views.course_specific_login', name='course-specific-login'), external_auth_views.course_specific_login, name='course-specific-login'),
url(r'^course_specific_register/{}/$'.format(settings.COURSE_ID_PATTERN), url(r'^course_specific_register/{}/$'.format(settings.COURSE_ID_PATTERN),
'openedx.core.djangoapps.external_auth.views.course_specific_register', name='course-specific-register'), external_auth_views.course_specific_register, name='course-specific-register'),
]
)
if configuration_helpers.get_value('ENABLE_BULK_ENROLLMENT_VIEW', if configuration_helpers.get_value('ENABLE_BULK_ENROLLMENT_VIEW', settings.FEATURES['ENABLE_BULK_ENROLLMENT_VIEW']):
settings.FEATURES['ENABLE_BULK_ENROLLMENT_VIEW']): urlpatterns += [
urlpatterns += (
url(r'^api/bulk_enroll/v1/', include('bulk_enroll.urls')), url(r'^api/bulk_enroll/v1/', include('bulk_enroll.urls')),
) ]
# Shopping cart # Shopping cart
urlpatterns += ( urlpatterns += [
url(r'^shoppingcart/', include('shoppingcart.urls')), url(r'^shoppingcart/', include('shoppingcart.urls')),
url(r'^commerce/', include('commerce.urls', namespace='commerce')), url(r'^commerce/', include('commerce.urls', namespace='commerce')),
) ]
# Course goals # Course goals
urlpatterns += ( urlpatterns += [
url(r'^api/course_goals/', include('lms.djangoapps.course_goals.urls', namespace='course_goals_api')), url(r'^api/course_goals/', include('lms.djangoapps.course_goals.urls', namespace='course_goals_api')),
) ]
# Embargo # Embargo
if settings.FEATURES.get('EMBARGO'): if settings.FEATURES.get('EMBARGO'):
urlpatterns += ( urlpatterns += [
url(r'^embargo/', include('openedx.core.djangoapps.embargo.urls', namespace='embargo')), url(r'^embargo/', include('openedx.core.djangoapps.embargo.urls', namespace='embargo')),
url(r'^api/embargo/', include('openedx.core.djangoapps.embargo.urls', namespace='api_embargo')), url(r'^api/embargo/', include('openedx.core.djangoapps.embargo.urls', namespace='api_embargo')),
) ]
# Survey Djangoapp # Survey Djangoapp
urlpatterns += ( urlpatterns += [
url(r'^survey/', include('survey.urls')), url(r'^survey/', include('survey.urls')),
) ]
if settings.FEATURES.get('AUTH_USE_OPENID_PROVIDER'): if settings.FEATURES.get('AUTH_USE_OPENID_PROVIDER'):
urlpatterns += ( urlpatterns += [
url( url(
r'^openid/provider/login/$', r'^openid/provider/login/$',
'openedx.core.djangoapps.external_auth.views.provider_login', external_auth_views.provider_login,
name='openid-provider-login', name='openid-provider-login',
), ),
url( url(
r'^openid/provider/login/(?:.+)$', r'^openid/provider/login/(?:.+)$',
'openedx.core.djangoapps.external_auth.views.provider_identity', external_auth_views.provider_identity,
name='openid-provider-login-identity' name='openid-provider-login-identity'
), ),
url( url(
r'^openid/provider/identity/$', r'^openid/provider/identity/$',
'openedx.core.djangoapps.external_auth.views.provider_identity', external_auth_views.provider_identity,
name='openid-provider-identity', name='openid-provider-identity',
), ),
url( url(
r'^openid/provider/xrds/$', r'^openid/provider/xrds/$',
'openedx.core.djangoapps.external_auth.views.provider_xrds', external_auth_views.provider_xrds,
name='openid-provider-xrds', name='openid-provider-xrds',
), ),
) ]
if settings.FEATURES.get('ENABLE_OAUTH2_PROVIDER'): if settings.FEATURES.get('ENABLE_OAUTH2_PROVIDER'):
urlpatterns += ( urlpatterns += [
# These URLs dispatch to django-oauth-toolkit or django-oauth2-provider as appropriate. # These URLs dispatch to django-oauth-toolkit or django-oauth2-provider as appropriate.
# Developers should use these routes, to maintain compatibility for existing client code # Developers should use these routes, to maintain compatibility for existing client code
url(r'^oauth2/', include('openedx.core.djangoapps.oauth_dispatch.urls')), url(r'^oauth2/', include('openedx.core.djangoapps.oauth_dispatch.urls')),
...@@ -883,122 +901,122 @@ if settings.FEATURES.get('ENABLE_OAUTH2_PROVIDER'): ...@@ -883,122 +901,122 @@ if settings.FEATURES.get('ENABLE_OAUTH2_PROVIDER'):
# uses reverse() with the 'oauth2_provider' namespace. Developers should not access these # uses reverse() with the 'oauth2_provider' namespace. Developers should not access these
# views directly, but should rather use the wrapped views at /oauth2/ # views directly, but should rather use the wrapped views at /oauth2/
url(r'^_o/', include('oauth2_provider.urls', namespace='oauth2_provider')), url(r'^_o/', include('oauth2_provider.urls', namespace='oauth2_provider')),
) ]
if settings.FEATURES.get('ENABLE_LMS_MIGRATION'): if settings.FEATURES.get('ENABLE_LMS_MIGRATION'):
urlpatterns += ( urlpatterns += [
url(r'^migrate/modules$', 'lms_migration.migrate.manage_modulestores'), url(r'^migrate/modules$', lms_migrate_views.manage_modulestores),
url(r'^migrate/reload/(?P<reload_dir>[^/]+)$', 'lms_migration.migrate.manage_modulestores'), url(r'^migrate/reload/(?P<reload_dir>[^/]+)$', lms_migrate_views.manage_modulestores),
url( url(
r'^migrate/reload/(?P<reload_dir>[^/]+)/(?P<commit_id>[^/]+)$', r'^migrate/reload/(?P<reload_dir>[^/]+)/(?P<commit_id>[^/]+)$',
'lms_migration.migrate.manage_modulestores' lms_migrate_views.manage_modulestores
), ),
url(r'^gitreload$', 'lms_migration.migrate.gitreload'), url(r'^gitreload$', lms_migrate_views.gitreload),
url(r'^gitreload/(?P<reload_dir>[^/]+)$', 'lms_migration.migrate.gitreload'), url(r'^gitreload/(?P<reload_dir>[^/]+)$', lms_migrate_views.gitreload),
) ]
if settings.FEATURES.get('ENABLE_SQL_TRACKING_LOGS'): if settings.FEATURES.get('ENABLE_SQL_TRACKING_LOGS'):
urlpatterns += ( urlpatterns += [
url(r'^event_logs$', 'track.views.view_tracking_log'), url(r'^event_logs$', track_views.view_tracking_log),
url(r'^event_logs/(?P<args>.+)$', 'track.views.view_tracking_log'), url(r'^event_logs/(?P<args>.+)$', track_views.view_tracking_log),
) ]
if settings.FEATURES.get('ENABLE_SERVICE_STATUS'): if settings.FEATURES.get('ENABLE_SERVICE_STATUS'):
urlpatterns += ( urlpatterns += [
url(r'^status/', include('openedx.core.djangoapps.service_status.urls')), url(r'^status/', include('openedx.core.djangoapps.service_status.urls')),
) ]
if settings.FEATURES.get('ENABLE_INSTRUCTOR_BACKGROUND_TASKS'): if settings.FEATURES.get('ENABLE_INSTRUCTOR_BACKGROUND_TASKS'):
urlpatterns += ( urlpatterns += [
url( url(
r'^instructor_task_status/$', r'^instructor_task_status/$',
'lms.djangoapps.instructor_task.views.instructor_task_status', instructor_task_views.instructor_task_status,
name='instructor_task_status' name='instructor_task_status'
), ),
) ]
if settings.FEATURES.get('RUN_AS_ANALYTICS_SERVER_ENABLED'): if settings.FEATURES.get('RUN_AS_ANALYTICS_SERVER_ENABLED'):
urlpatterns += ( urlpatterns += [
url(r'^edinsights_service/', include('edinsights.core.urls')), url(r'^edinsights_service/', include('edinsights.core.urls')),
) ]
if settings.FEATURES.get('ENABLE_DEBUG_RUN_PYTHON'): if settings.FEATURES.get('ENABLE_DEBUG_RUN_PYTHON'):
urlpatterns += ( urlpatterns += [
url(r'^debug/run_python$', 'debug.views.run_python'), url(r'^debug/run_python$', debug_views.run_python),
) ]
urlpatterns += ( urlpatterns += [
url(r'^debug/show_parameters$', 'debug.views.show_parameters'), url(r'^debug/show_parameters$', debug_views.show_parameters),
) ]
# Third-party auth. # Third-party auth.
if settings.FEATURES.get('ENABLE_THIRD_PARTY_AUTH'): if settings.FEATURES.get('ENABLE_THIRD_PARTY_AUTH'):
urlpatterns += ( urlpatterns += [
url(r'', include('third_party_auth.urls')), url(r'', include('third_party_auth.urls')),
url(r'api/third_party_auth/', include('third_party_auth.api.urls')), url(r'api/third_party_auth/', include('third_party_auth.api.urls')),
# NOTE: The following login_oauth_token endpoint is DEPRECATED. # NOTE: The following login_oauth_token endpoint is DEPRECATED.
# Please use the exchange_access_token endpoint instead. # Please use the exchange_access_token endpoint instead.
url(r'^login_oauth_token/(?P<backend>[^/]+)/$', 'student.views.login_oauth_token'), url(r'^login_oauth_token/(?P<backend>[^/]+)/$', student_views.login_oauth_token),
) ]
# Enterprise # Enterprise
if enterprise_enabled(): if enterprise_enabled():
urlpatterns += ( urlpatterns += [
url(r'', include('enterprise.urls')), url(r'', include('enterprise.urls')),
) ]
# OAuth token exchange # OAuth token exchange
if settings.FEATURES.get('ENABLE_OAUTH2_PROVIDER'): if settings.FEATURES.get('ENABLE_OAUTH2_PROVIDER'):
urlpatterns += ( urlpatterns += [
url( url(
r'^oauth2/login/$', r'^oauth2/login/$',
LoginWithAccessTokenView.as_view(), LoginWithAccessTokenView.as_view(),
name="login_with_access_token" name='login_with_access_token'
), ),
) ]
# Certificates # Certificates
urlpatterns += ( urlpatterns += [
url(r'^certificates/', include('certificates.urls', app_name="certificates", namespace="certificates")), url(r'^certificates/', include('certificates.urls', app_name='certificates', namespace='certificates')),
# Backwards compatibility with XQueue, which uses URLs that are not prefixed with /certificates/ # Backwards compatibility with XQueue, which uses URLs that are not prefixed with /certificates/
url(r'^update_certificate$', 'certificates.views.update_certificate'), url(r'^update_certificate$', certificates_views.update_certificate, name='update_certificate'),
url(r'^update_example_certificate$', 'certificates.views.update_example_certificate'), url(r'^update_example_certificate$', certificates_views.update_example_certificate,
url(r'^request_certificate$', 'certificates.views.request_certificate'), name='update_example_certificate'),
url(r'^request_certificate$', certificates_views.request_certificate,
name='request_certificate'),
# REST APIs # REST APIs
url(r'^api/certificates/', url(r'^api/certificates/',
include('lms.djangoapps.certificates.apis.urls', namespace='certificates_api')), include('lms.djangoapps.certificates.apis.urls', namespace='certificates_api')),
) ]
# XDomain proxy # XDomain proxy
urlpatterns += ( urlpatterns += [
url(r'^xdomain_proxy.html$', 'openedx.core.djangoapps.cors_csrf.views.xdomain_proxy', name='xdomain_proxy'), url(r'^xdomain_proxy.html$', cors_csrf_views.xdomain_proxy, name='xdomain_proxy'),
) ]
# Custom courses on edX (CCX) URLs # Custom courses on edX (CCX) URLs
if settings.FEATURES["CUSTOM_COURSES_EDX"]: if settings.FEATURES['CUSTOM_COURSES_EDX']:
urlpatterns += ( urlpatterns += [
url(r'^courses/{}/'.format(settings.COURSE_ID_PATTERN), url(r'^courses/{}/'.format(settings.COURSE_ID_PATTERN),
include('ccx.urls')), include('ccx.urls')),
url(r'^api/ccx/', include('lms.djangoapps.ccx.api.urls', namespace='ccx_api')), url(r'^api/ccx/', include('lms.djangoapps.ccx.api.urls', namespace='ccx_api')),
) ]
# Access to courseware as an LTI provider # Access to courseware as an LTI provider
if settings.FEATURES.get("ENABLE_LTI_PROVIDER"): if settings.FEATURES.get('ENABLE_LTI_PROVIDER'):
urlpatterns += ( urlpatterns += [
url(r'^lti_provider/', include('lti_provider.urls')), url(r'^lti_provider/', include('lti_provider.urls')),
) ]
urlpatterns += ( urlpatterns += [
url(r'config/self_paced', ConfigurationModelCurrentAPIView.as_view(model=SelfPacedConfiguration)), url(r'config/self_paced', ConfigurationModelCurrentAPIView.as_view(model=SelfPacedConfiguration)),
url(r'config/programs', ConfigurationModelCurrentAPIView.as_view(model=ProgramsApiConfig)), url(r'config/programs', ConfigurationModelCurrentAPIView.as_view(model=ProgramsApiConfig)),
url(r'config/catalog', ConfigurationModelCurrentAPIView.as_view(model=CatalogIntegration)), url(r'config/catalog', ConfigurationModelCurrentAPIView.as_view(model=CatalogIntegration)),
url(r'config/forums', ConfigurationModelCurrentAPIView.as_view(model=ForumsConfig)), url(r'config/forums', ConfigurationModelCurrentAPIView.as_view(model=ForumsConfig)),
) ]
urlpatterns = patterns(*urlpatterns)
if settings.DEBUG: if settings.DEBUG:
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
...@@ -1009,41 +1027,43 @@ if settings.DEBUG: ...@@ -1009,41 +1027,43 @@ if settings.DEBUG:
) )
# UX reference templates # UX reference templates
urlpatterns += url(r'^template/(?P<template>.+)$', 'openedx.core.djangoapps.debug.views.show_reference_template'), urlpatterns += [
url(r'^template/(?P<template>.+)$', openedx_debug_views.show_reference_template),
]
if 'debug_toolbar' in settings.INSTALLED_APPS: if 'debug_toolbar' in settings.INSTALLED_APPS:
import debug_toolbar import debug_toolbar
urlpatterns += ( urlpatterns += [
url(r'^__debug__/', include(debug_toolbar.urls)), url(r'^__debug__/', include(debug_toolbar.urls)),
) ]
# Custom error pages # Custom error pages
# These are used by Django to render these error codes. Do not remove. # These are used by Django to render these error codes. Do not remove.
# pylint: disable=invalid-name # pylint: disable=invalid-name
handler404 = 'static_template_view.views.render_404' handler404 = static_template_view_views.render_404
handler500 = 'static_template_view.views.render_500' handler500 = static_template_view_views.render_500
# include into our URL patterns the HTTP REST API that comes with edx-proctoring. # include into our URL patterns the HTTP REST API that comes with edx-proctoring.
urlpatterns += ( urlpatterns += [
url(r'^api/', include('edx_proctoring.urls')), url(r'^api/', include('edx_proctoring.urls')),
) ]
if settings.FEATURES.get('ENABLE_FINANCIAL_ASSISTANCE_FORM'): if settings.FEATURES.get('ENABLE_FINANCIAL_ASSISTANCE_FORM'):
urlpatterns += ( urlpatterns += [
url( url(
r'^financial-assistance/$', r'^financial-assistance/$',
'courseware.views.views.financial_assistance', courseware_views.financial_assistance,
name='financial_assistance' name='financial_assistance'
), ),
url( url(
r'^financial-assistance/apply/$', r'^financial-assistance/apply/$',
'courseware.views.views.financial_assistance_form', courseware_views.financial_assistance_form,
name='financial_assistance_form' name='financial_assistance_form'
), ),
url( url(
r'^financial-assistance/submit/$', r'^financial-assistance/submit/$',
'courseware.views.views.financial_assistance_request', courseware_views.financial_assistance_request,
name='submit_financial_assistance_request' name='submit_financial_assistance_request'
) )
) ]
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment