urls.py 10.9 KB
Newer Older
Piotr Mitros committed
1
from django.conf import settings
2
from django.conf.urls import patterns, include, url
Piotr Mitros committed
3
from django.contrib import admin
4
from django.conf.urls.static import static
5
import django.contrib.auth.views
Piotr Mitros committed
6 7

# Uncomment the next two lines to enable the admin:
8 9 10
if settings.DEBUG:
    from django.contrib import admin
    admin.autodiscover()
Piotr Mitros committed
11

Piotr Mitros committed
12
urlpatterns = ('',
13
    url(r'^$', 'student.views.index', name="root"), # Main marketing page, or redirect to courseware
14
    url(r'^dashboard$', 'student.views.dashboard', name="dashboard"),
15

16
    url(r'^admin_dashboard$', 'dashboard.views.dashboard'),
17

18 19
    url(r'^change_email$', 'student.views.change_email_request'),
    url(r'^email_confirm/(?P<key>[^/]*)$', 'student.views.confirm_email_change'),
20 21 22 23
    url(r'^change_name$', 'student.views.change_name_request'),
    url(r'^accept_name_change$', 'student.views.accept_name_change'),
    url(r'^reject_name_change$', 'student.views.reject_name_change'),
    url(r'^pending_name_changes$', 'student.views.pending_name_changes'),
24

25
    url(r'^event$', 'track.views.user_track'),
26
    url(r'^t/(?P<template>[^/]*)$', 'static_template_view.views.index'), # TODO: Is this used anymore? What is STATIC_GRAB?
27 28

    url(r'^login$', 'student.views.login_user', name="login"),
29
    url(r'^login/(?P<error>[^/]*)$', 'student.views.login_user'),
30
    url(r'^logout$', 'student.views.logout_user', name='logout'),
31
    url(r'^create_account$', 'student.views.create_account'),
32 33
    url(r'^activate/(?P<key>[^/]*)$', 'student.views.activate_account', name="activate"),

34
    url(r'^password_reset/$', 'student.views.password_reset', name='password_reset'),
35 36
    ## Obsolete Django views for password resets
    ## TODO: Replace with Mako-ized views
37 38 39 40 41 42
    url(r'^password_change/$', django.contrib.auth.views.password_change,
        name='auth_password_change'),
    url(r'^password_change_done/$', django.contrib.auth.views.password_change_done,
        name='auth_password_change_done'),
    url(r'^password_reset_confirm/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$',
        django.contrib.auth.views.password_reset_confirm,
Piotr Mitros committed
43
        name='auth_password_reset_confirm'),
44
    url(r'^password_reset_complete/$', django.contrib.auth.views.password_reset_complete,
Piotr Mitros committed
45
        name='auth_password_reset_complete'),
46
    url(r'^password_reset_done/$', django.contrib.auth.views.password_reset_done,
Piotr Mitros committed
47
        name='auth_password_reset_done'),
48

49
    url(r'^heartbeat$', include('heartbeat.urls')),
50

51
    url(r'^university_profile/(?P<org_id>[^/]+)$', 'courseware.views.university_profile', name="university_profile"),
52

53
    #Semi-static views (these need to be rendered and have the login bar, but don't change)
54
    url(r'^404$', 'static_template_view.views.render',
55
        {'template': '404.html'}, name="404"),
56
    url(r'^about$', 'static_template_view.views.render',
57
        {'template': 'about.html'}, name="about_edx"),
58
    url(r'^jobs$', 'static_template_view.views.render',
59
        {'template': 'jobs.html'}, name="jobs"),
60
    url(r'^contact$', 'static_template_view.views.render',
61
        {'template': 'contact.html'}, name="contact"),
62
    url(r'^press$', 'student.views.press', name="press"),
63
    url(r'^faq$', 'static_template_view.views.render',
64
        {'template': 'faq.html'}, name="faq_edx"),
65
    url(r'^help$', 'static_template_view.views.render',
66
        {'template': 'help.html'}, name="help_edx"),
67

68
    url(r'^tos$', 'static_template_view.views.render',
69
        {'template': 'tos.html'}, name="tos"),
70
    url(r'^privacy$', 'static_template_view.views.render',
71
        {'template': 'privacy.html'}, name="privacy_edx"),
72
    # TODO: (bridger) The copyright has been removed until it is updated for edX
73
    # url(r'^copyright$', 'static_template_view.views.render',
74
    #     {'template': 'copyright.html'}, name="copyright"),
75
    url(r'^honor$', 'static_template_view.views.render',
76
        {'template': 'honor.html'}, name="honor"),
77 78 79

    #Press releases
    url(r'^press/mit-and-harvard-announce-edx$', 'static_template_view.views.render',
80
        {'template': 'press_releases/MIT_and_Harvard_announce_edX.html'}, name="press/mit-and-harvard-announce-edx"),
81
    url(r'^press/uc-berkeley-joins-edx$', 'static_template_view.views.render',
82
        {'template': 'press_releases/UC_Berkeley_joins_edX.html'}, name="press/uc-berkeley-joins-edx"),
83
    # Should this always update to point to the latest press release?
84 85 86
    (r'^pressrelease$', 'django.views.generic.simple.redirect_to', {'url': '/press/uc-berkeley-joins-edx'}),


Bridger Maxwell committed
87
    (r'^favicon\.ico$', 'django.views.generic.simple.redirect_to', {'url': '/static/images/favicon.ico'}),
88

89 90 91
    # TODO: These urls no longer work. They need to be updated before they are re-enabled
    # url(r'^send_feedback$', 'util.views.send_feedback'),
    # url(r'^reactivate/(?P<key>[^/]*)$', 'student.views.reactivation_email'),
Piotr Mitros committed
92 93
)

94
if settings.PERFSTATS:
95
    urlpatterns += (url(r'^reprofile$','perfstats.views.end_profile'),)
96

Piotr Mitros committed
97
if settings.COURSEWARE_ENABLED:
98
    urlpatterns += (
99
        # Hook django-masquerade, allowing staff to view site as other users
Piotr Mitros committed
100
        url(r'^masquerade/', include('masquerade.urls')),
101 102
        url(r'^jump_to/(?P<location>.*)$', 'courseware.views.jump_to', name="jump_to"),

103 104 105
        url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/modx/(?P<id>.*?)/(?P<dispatch>[^/]*)$',
            'courseware.module_render.modx_dispatch',
            name='modx_dispatch'),
106 107 108
        url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/xqueue/(?P<userid>[^/]*)/(?P<id>.*?)/(?P<dispatch>[^/]*)$',
            'courseware.module_render.xqueue_callback',
            name='xqueue_callback'),
109 110
        url(r'^change_setting$', 'student.views.change_setting',
            name='change_setting'),
111

112 113 114 115 116
        # TODO: These views need to be updated before they work
        # url(r'^calculate$', 'util.views.calculate'),
        # TODO: We should probably remove the circuit package. I believe it was only used in the old way of saving wiki circuits for the wiki
        # url(r'^edit_circuit/(?P<circuit>[^/]*)$', 'circuit.views.edit_circuit'),
        # url(r'^save_circuit/(?P<circuit>[^/]*)$', 'circuit.views.save_circuit'),
117 118 119

        url(r'^courses/?$', 'courseware.views.courses', name="courses"),
        url(r'^change_enrollment$',
120
            'student.views.change_enrollment_view', name="change_enrollment"),
121

122
        #About the course
123
        url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/about$',
124
            'courseware.views.course_about', name="about_course"),
125

126
        #Inside the course
127
        url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/info$',
128
            'courseware.views.course_info', name="info"),
129
        url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/book$',
130
            'staticbook.views.index', name="book"),
131
        url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/book/(?P<page>[^/]*)$',
Bridger Maxwell committed
132
            'staticbook.views.index'),
133
        url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/book-shifted/(?P<page>[^/]*)$',
Bridger Maxwell committed
134
            'staticbook.views.index_shifted'),
135
        url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/courseware/?$',
136
            'courseware.views.index', name="courseware"),
137 138
        url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/courseware/(?P<chapter>[^/]*)/$',
            'courseware.views.index', name="courseware_chapter"),
139
        url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/courseware/(?P<chapter>[^/]*)/(?P<section>[^/]*)/$',
140
            'courseware.views.index', name="courseware_section"),
141
        url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/profile$',
142
            'courseware.views.profile', name="profile"),
143
        # Takes optional student_id for instructor use--shows profile as that student sees it.
144
        url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/profile/(?P<student_id>[^/]*)/$',
145
            'courseware.views.profile', name="student_profile"),
146

147
        # For the instructor
148 149
        url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/instructor$',
            'courseware.views.instructor_dashboard', name="instructor_dashboard"),
150
        url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/gradebook$',
151 152 153 154
            'courseware.views.gradebook', name='gradebook'),
        url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/grade_summary$',
            'courseware.views.grade_summary', name='grade_summary'),

155
    )
156

157
    # Multicourse wiki
158
if settings.WIKI_ENABLED:
159 160 161
    from wiki.urls import get_pattern as wiki_pattern
    from django_notify.urls import get_pattern as notify_pattern
    
162 163
    # Note that some of these urls are repeated in course_wiki.course_nav. Make sure to update
    # them together.
164
    urlpatterns += (        
165 166
        # 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
167 168
        url('^wiki/create-root/$', 'course_wiki.views.root_create', name='root_create'),

169
        
170
        url(r'^wiki/', include(wiki_pattern())),
171
        url(r'^notify/', include(notify_pattern())),
172 173 174
        
        # 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
175
        url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/course_wiki/?$',
176
            'course_wiki.views.course_wiki_redirect', name="course_wiki"),
177
        url(r'^courses/(?:[^/]+/[^/]+/[^/]+)/wiki/', include(wiki_pattern())),
178
    )
Piotr Mitros committed
179

180
if settings.QUICKEDIT:
181
	urlpatterns += (url(r'^quickedit/(?P<id>[^/]*)$', 'dogfood.views.quickedit'),)
182
	urlpatterns += (url(r'^dogfood/(?P<id>[^/]*)$', 'dogfood.views.df_capa_problem'),)
183

Piotr Mitros committed
184
if settings.ASKBOT_ENABLED:
185 186 187 188 189
    urlpatterns += (url(r'^%s' % settings.ASKBOT_URL, include('askbot.urls')), \
                    url(r'^admin/', include(admin.site.urls)), \
                    url(r'^settings/', include('askbot.deps.livesettings.urls')), \
                    url(r'^followit/', include('followit.urls')), \
#                       url(r'^robots.txt$', include('robots.urls')),
Piotr Mitros committed
190
                              )
191

192 193 194 195
if settings.DEBUG:
    ## Jasmine
    urlpatterns=urlpatterns + (url(r'^_jasmine/', include('django_jasmine.urls')),)

ichuang committed
196 197 198 199 200 201 202
if settings.MITX_FEATURES.get('AUTH_USE_OPENID'):
    urlpatterns += (
        url(r'^openid/login/$', 'django_openid_auth.views.login_begin', name='openid-login'),
        url(r'^openid/complete/$', 'external_auth.views.edXauth_openid_login_complete', name='openid-complete'),
        url(r'^openid/logo.gif$', 'django_openid_auth.views.logo', name='openid-logo'),
        )

203 204 205 206 207 208
if settings.MITX_FEATURES.get('ENABLE_LMS_MIGRATION'):
    urlpatterns += (
        url(r'^migrate/modules$', 'lms_migration.migrate.manage_modulestores'),
        url(r'^migrate/reload/(?P<reload_dir>[^/]+)$', 'lms_migration.migrate.manage_modulestores'),
        )

209 210 211 212 213
if settings.MITX_FEATURES.get('ENABLE_SQL_TRACKING_LOGS'):
    urlpatterns += (
        url(r'^event_logs$', 'track.views.view_tracking_log'),
        )

214 215
urlpatterns = patterns(*urlpatterns)

216
if settings.DEBUG:
217
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
218 219

#Custom error pages
220 221 222
handler404 = 'static_template_view.views.render_404'
handler500 = 'static_template_view.views.render_500'