diff --git a/cms/urls.py b/cms/urls.py index 610f0b35bf..8c740f8ce2 100644 --- a/cms/urls.py +++ b/cms/urls.py @@ -5,7 +5,6 @@ from ratelimitbackend import admin from cms.djangoapps.contentstore.views.program import ProgramAuthoringView, ProgramsIdTokenView from cms.djangoapps.contentstore.views.organization import OrganizationListView -from student.views import LogoutView admin.autodiscover() @@ -19,6 +18,8 @@ LIBRARY_KEY_PATTERN = r'(?Plibrary-v1:[^/+]+\+[^/+]+)' urlpatterns = patterns( '', + url(r'', include('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'), @@ -60,18 +61,6 @@ urlpatterns = patterns( url(r'^update_lang/', include('dark_lang.urls', namespace='darklang')), ) -# User creation and updating views -urlpatterns += patterns( - '', - - url(r'^create_account$', 'student.views.create_account', name='create_account'), - url(r'^activate/(?P[^/]*)$', 'student.views.activate_account', name='activate'), - - # ajax view that actually does the work - url(r'^login_post$', 'student.views.login_user', name='login_post'), - url(r'^logout$', LogoutView.as_view(), name='logout'), -) - # restful api urlpatterns += patterns( 'contentstore.views', @@ -159,12 +148,6 @@ if settings.FEATURES.get('AUTH_USE_CAS'): urlpatterns += patterns('', url(r'^admin/', include(admin.site.urls)),) -# enable automatic login -if settings.FEATURES.get('AUTOMATIC_AUTH_FOR_TESTING'): - urlpatterns += ( - url(r'^auto_auth$', 'student.views.auto_auth'), - ) - # enable entrance exams if settings.FEATURES.get('ENTRANCE_EXAMS'): urlpatterns += ( diff --git a/common/djangoapps/student/tests/test_auto_auth.py b/common/djangoapps/student/tests/test_auto_auth.py index acc17f19cb..484ddab13c 100644 --- a/common/djangoapps/student/tests/test_auto_auth.py +++ b/common/djangoapps/student/tests/test_auto_auth.py @@ -14,12 +14,18 @@ import ddt import json +class AutoAuthTestCase(UrlResetMixin, TestCase): + """ + Base class for AutoAuth Tests that properly resets the urls.py + """ + URLCONF_MODULES = ['student.urls'] + + @ddt.ddt -class AutoAuthEnabledTestCase(UrlResetMixin, TestCase): +class AutoAuthEnabledTestCase(AutoAuthTestCase): """ Tests for the Auto auth view that we have for load testing. """ - COURSE_ID_MONGO = 'edX/Test101/2014_Spring' COURSE_ID_SPLIT = 'course-v1:edX+Test101+2014_Spring' COURSE_IDS_DDT = ( @@ -256,7 +262,7 @@ class AutoAuthEnabledTestCase(UrlResetMixin, TestCase): return response -class AutoAuthDisabledTestCase(UrlResetMixin, TestCase): +class AutoAuthDisabledTestCase(AutoAuthTestCase): """ Test that the page is inaccessible with default settings """ diff --git a/common/djangoapps/student/urls.py b/common/djangoapps/student/urls.py new file mode 100644 index 0000000000..d9e7292352 --- /dev/null +++ b/common/djangoapps/student/urls.py @@ -0,0 +1,64 @@ +""" +URLs for student app +""" + +from django.conf import settings +from django.conf.urls import patterns, url + +from student.views import LogoutView + +urlpatterns = ( + 'student.views', + + url(r'^logout$', LogoutView.as_view(), name='logout'), + + # TODO: standardize login + + # login endpoint used by cms. + url(r'^login_post$', 'login_user', name='login_post'), + # login endpoints used by lms. + url(r'^login_ajax$', 'login_user', name="login"), + url(r'^login_ajax/(?P[^/]*)$', 'login_user'), + + url(r'^email_confirm/(?P[^/]*)$', 'confirm_email_change'), + + url(r'^create_account$', 'create_account', name='create_account'), + url(r'^activate/(?P[^/]*)$', 'activate_account', name="activate"), + + url(r'^accounts/disable_account_ajax$', 'disable_account_ajax', name="disable_account_ajax"), + url(r'^accounts/manage_user_standing', 'manage_user_standing', name='manage_user_standing'), + + url(r'^change_setting$', 'change_setting', name='change_setting'), + url(r'^change_email_settings$', 'change_email_settings', name='change_email_settings'), +) + +# enable automatic login +if settings.FEATURES.get('AUTOMATIC_AUTH_FOR_TESTING'): + urlpatterns += ( + url(r'^auto_auth$', 'auto_auth'), + ) + +urlpatterns = patterns(*urlpatterns) + +# password reset mixes student.views with django views +urlpatterns += ( + url(r'^password_reset/$', 'student.views.password_reset', name='password_reset'), + + # Obsolete Django views for password resets + + # TODO: Replace with Mako-ized views + + url(r'^password_change/$', 'django.contrib.auth.views.password_change', name='password_change'), + url(r'^password_change_done/$', 'django.contrib.auth.views.password_change_done', name='password_change_done'), + url( + r'^password_reset_complete/$', + 'django.contrib.auth.views.password_reset_complete', + name='password_reset_complete', + ), + url( + r'^password_reset_confirm/(?P[0-9A-Za-z]+)-(?P.+)/$', + 'student.views.password_reset_confirm_wrapper', + name='password_reset_confirm', + ), + url(r'^password_reset_done/$', 'django.contrib.auth.views.password_reset_done', name='password_reset_done'), +) diff --git a/common/djangoapps/student/views.py b/common/djangoapps/student/views.py index 6511b4372c..8302b4b283 100644 --- a/common/djangoapps/student/views.py +++ b/common/djangoapps/student/views.py @@ -556,6 +556,18 @@ def is_course_blocked(request, redeemed_registration_codes, course_key): @login_required @ensure_csrf_cookie def dashboard(request): + """ + Provides the LMS dashboard view + + TODO: This is lms specific and does not belong in common code. + + Arguments: + request: The request object. + + Returns: + The dashboard response. + + """ user = request.user platform_name = configuration_helpers.get_value("platform_name", settings.PLATFORM_NAME) @@ -998,6 +1010,8 @@ def change_enrollment(request, check_access=True): """ Modify the enrollment status for the logged-in user. + TODO: This is lms specific and does not belong in common code. + The request parameter must be a POST request (other methods return 405) that specifies course_id and enrollment_action parameters. If course_id or enrollment_action is not specified, if course_id is not valid, if diff --git a/lms/urls.py b/lms/urls.py index 78a6f2d352..922eb72cdc 100644 --- a/lms/urls.py +++ b/lms/urls.py @@ -16,7 +16,6 @@ from openedx.core.djangoapps.catalog.models import CatalogIntegration from openedx.core.djangoapps.programs.models import ProgramsApiConfig from openedx.core.djangoapps.self_paced.models import SelfPacedConfiguration from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers -from student.views import LogoutView # Uncomment the next two lines to enable the admin: if settings.DEBUG or settings.FEATURES.get('ENABLE_DJANGO_ADMIN_SITE'): @@ -27,11 +26,12 @@ urlpatterns = ( '', url(r'^$', 'branding.views.index', name="root"), # Main marketing page, or redirect to courseware - url(r'^dashboard$', 'student.views.dashboard', name="dashboard"), - url(r'^login_ajax$', 'student.views.login_user', name="login"), - url(r'^login_ajax/(?P[^/]*)$', 'student.views.login_user'), - url(r'^email_confirm/(?P[^/]*)$', 'student.views.confirm_email_change'), + url(r'', include('student.urls')), + # TODO: Move lms specific student views out of common code + url(r'^dashboard$', 'student.views.dashboard', name="dashboard"), + url(r'^change_enrollment$', 'student.views.change_enrollment', name='change_enrollment'), + url(r'^event$', 'track.views.user_track'), url(r'^performance$', 'openedx.core.djangoapps.performance.views.performance_log'), url(r'^segmentio/event$', 'track.views.segmentio.segmentio_event'), @@ -39,30 +39,6 @@ urlpatterns = ( # TODO: Is this used anymore? What is STATIC_GRAB? url(r'^t/(?P