3 # Copyright (C) 2012 FinalsClub Foundation
4 """ Controller for the KarmaNotes website """
6 from django.contrib import admin
7 from django.conf import settings
8 from django.conf.urls import patterns, include, url
9 from django.views.generic.base import TemplateView
11 from karmaworld.apps.courses.models import Course
12 from karmaworld.apps.courses.views import AboutView, flag_course, edit_course
13 from karmaworld.apps.courses.views import CourseDetailView
14 from karmaworld.apps.courses.views import CourseListView
15 from karmaworld.apps.courses.views import school_list
16 from karmaworld.apps.courses.views import school_course_list
17 from karmaworld.apps.courses.views import school_course_instructor_list
18 from karmaworld.apps.notes.views import NoteView, thank_note, NoteSearchView, flag_note, downloaded_note, edit_note_tags
19 from karmaworld.apps.notes.views import RawNoteDetailView
20 from karmaworld.apps.moderation import moderator
21 from karmaworld.apps.document_upload.views import save_fp_upload
22 from karmaworld.apps.quizzes.views import QuizView, KeywordEditView, quiz_answer
23 from karmaworld.apps.users.views import ProfileView
24 from karmaworld.apps.users.views import ControlView
26 # See: https://docs.djangoproject.com/en/dev/ref/contrib/admin/#hooking-adminsite-instances-into-your-urlconf
31 # reused named regex capture groups
32 SLUG = r'(?P<{0}slug>[-A-Za-z0-9_]+)'
35 # ex: SLUG.format('') :> (?P<slug>[-A-Za-z0-9_]+)
36 # ex: SLUG.format('school_') :> (?P<school_slug>[-A-Za-z0-9_]+)
39 url(r'^' + SLUG.format('school_') + '/' + SLUG.format('') + '/'
40 CourseDetailView.as_view(), name='course_detail'),
42 (?P<school_slug>[^/]+)/(?P<course_slug>[^/]+)/(?P<pk>[\d^/]+)$', \
43 NoteView.as_view(), name='note_detail_pk'),
46 SCHOOL_SLUG = r'(?P<school_slug>[-A-Za-z0-9_]+)'
47 COURSE_SLUG = r'(?P<course_slug>[-A-Za-z0-9_]+)'
48 NOTE_SLUG = r'(?P<slug>[-A-Za-z0-9_]+)'
50 # See: https://docs.djangoproject.com/en/dev/topics/http/urls/
51 urlpatterns = patterns('',
52 ## Administrative URLpatterns
53 # Admin panel and documentation:
54 url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
55 url(r'^admin/', include(admin.site.urls)),
56 # Grappelli django-admin improvment suite
57 url(r'^grappelli/', include('grappelli.urls')),
58 # Moderator panel and documentation:
59 url(r'^moderator/doc/', include('django.contrib.admindocs.urls')),
60 url(r'^moderator/', include(moderator.site.urls)),
62 ## Single-serving page URLpatterns
63 url(r'^terms/$', TemplateView.as_view(template_name='terms.html'), name='terms'),
64 url(r'^about/$', AboutView.as_view(), name='about'),
67 url(r'^accounts/', include('allauth.urls')),
68 url(r'^accounts/profile/', ProfileView.as_view(), name='accounts_profile'),
69 url(r'^accounts/control_panel', ControlView.as_view(), name='control_panel'),
72 url(r'^media/(?P<path>.*)$', 'django.views.static.serve',
73 {'document_root': settings.MEDIA_ROOT, }),
76 url(r'^api/upload$', save_fp_upload, name='upload_post'),
78 # ---- JSON views ----#
79 # return json list of schools
80 url(r'^school/list/$', school_list, name='json_school_list'),
81 # return json list of courses for a given school
82 url(r'^school/course/list/$', school_course_list, name='json_school_course_list'),
83 # return json list of instructors for a given school and course
84 url(r'^school/course/instructors/list/$', school_course_instructor_list, name='json_school_course_instructor_list'),
85 # ---- end JSON views ----#
87 url(r'^search/$', NoteSearchView.as_view(), name='note_search'),
89 # VIEW for displaying a single Course
90 url(r'^course/' + SLUG.format('') + '/$',
91 CourseDetailView.as_view(), name='course_detail'),
94 # Ajax endpoint to thank a note
95 url(r'^ajax/note/thank/(?P<pk>[\d]+)/$', thank_note, name='thank_note'),
96 # Ajax endpoint to flag a note
97 url(r'^ajax/note/flag/(?P<pk>[\d]+)/$', flag_note, name='flag_note'),
98 # Ajax endpoint to update a notes tags
99 url(r'^ajax/note/tags/(?P<pk>[\d]+)/$', edit_note_tags, name='edit_note_tags'),
100 # Ajax endpoint to record that somebody downloaded a note
101 url(r'^ajax/note/downloaded/(?P<pk>[\d]+)/$', downloaded_note, name='downloaded_note'),
102 # Ajax endpoint to flag a course
103 url(r'^ajax/course/flag/(?P<pk>[\d]+)/$', flag_course, name='flag_course'),
104 # Ajax endpoint to edit a course
105 url(r'^ajax/course/edit/(?P<pk>[\d]+)/$', edit_course, name='edit_course'),
107 # Check if a quiz answer is correct
108 url(r'^ajax/quiz/check/$', quiz_answer, name='quiz_answer'),
110 # Valid url cases to the Note page
111 # a: school/course/id
112 # b: school/course/id/slug
114 # note file as id, for notes without titles yet
115 url(r'^note/(?P<school_slug>[^/]+)/(?P<course_slug>[^/]+)/(?P<pk>[\d^/]+)$', \
116 NoteView.as_view(), name='note_detail_pk'),
117 # note file by note.slug
118 url(r'^note/' + SLUG.format('school_') + '/' + SLUG.format('course_') +'/'+ SLUG.format('') +'$',
119 NoteView.as_view(), name='note_detail'),
122 url(r'^quiz/(?P<pk>[\d]+)/$',
123 QuizView.as_view(), name='quiz'),
124 url(r'^keywords/' + SLUG.format('') + '/$',
125 KeywordEditView.as_view(), name='keyword_edit'),
127 url(r'^$', CourseListView.as_view(model=Course), name='home'),