Merge pull request #479 from MITx/feature/arjun/syllabus
Adding a syllabus page (accessible via course navigation)
This commit is contained in:
@@ -141,6 +141,35 @@ def get_course_info_section(course, section_key):
|
||||
|
||||
raise KeyError("Invalid about key " + str(section_key))
|
||||
|
||||
# TODO: Fix this such that these are pulled in as extra course-specific tabs.
|
||||
# arjun will address this by the end of October if no one does so prior to
|
||||
# then.
|
||||
def get_course_syllabus_section(course, section_key):
|
||||
"""
|
||||
This returns the snippet of html to be rendered on the syllabus page,
|
||||
given the key for the section.
|
||||
|
||||
Valid keys:
|
||||
- syllabus
|
||||
- guest_syllabus
|
||||
"""
|
||||
|
||||
# Many of these are stored as html files instead of some semantic
|
||||
# markup. This can change without effecting this interface when we find a
|
||||
# good format for defining so many snippets of text/html.
|
||||
|
||||
if section_key in ['syllabus', 'guest_syllabus']:
|
||||
try:
|
||||
with course.system.resources_fs.open(path("syllabus") / section_key + ".html") as htmlFile:
|
||||
return replace_urls(htmlFile.read().decode('utf-8'),
|
||||
course.metadata['data_dir'])
|
||||
except ResourceNotFoundError:
|
||||
log.exception("Missing syllabus section {key} in course {url}".format(
|
||||
key=section_key, url=course.location.url()))
|
||||
return "! Syllabus missing !"
|
||||
|
||||
raise KeyError("Invalid about key " + str(section_key))
|
||||
|
||||
|
||||
def get_courses_by_university(user, domain=None):
|
||||
'''
|
||||
|
||||
@@ -232,6 +232,19 @@ def course_info(request, course_id):
|
||||
return render_to_response('courseware/info.html', {'course': course,
|
||||
'staff_access': staff_access,})
|
||||
|
||||
# TODO arjun: remove when custom tabs in place, see courseware/syllabus.py
|
||||
@ensure_csrf_cookie
|
||||
def syllabus(request, course_id):
|
||||
"""
|
||||
Display the course's syllabus.html, or 404 if there is no such course.
|
||||
|
||||
Assumes the course_id is in a valid format.
|
||||
"""
|
||||
course = get_course_with_access(request.user, course_id, 'load')
|
||||
staff_access = has_access(request.user, course, 'staff')
|
||||
|
||||
return render_to_response('courseware/syllabus.html', {'course': course,
|
||||
'staff_access': staff_access,})
|
||||
|
||||
def registered_for_course(course, user):
|
||||
'''Return CourseEnrollment if user is registered for course, else False'''
|
||||
|
||||
@@ -55,6 +55,10 @@ MITX_FEATURES = {
|
||||
# course_ids (see dev_int.py for an example)
|
||||
'SUBDOMAIN_COURSE_LISTINGS' : False,
|
||||
|
||||
# TODO: This will be removed once course-specific tabs are in place. see
|
||||
# courseware/courses.py
|
||||
'ENABLE_SYLLABUS' : True,
|
||||
|
||||
'ENABLE_TEXTBOOK' : True,
|
||||
'ENABLE_DISCUSSION' : False,
|
||||
'ENABLE_DISCUSSION_SERVICE': True,
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
|
||||
// pages
|
||||
@import "course/info";
|
||||
@import "course/syllabus"; // TODO arjun replace w/ custom tabs, see courseware/courses.py
|
||||
@import "course/textbook";
|
||||
@import "course/profile";
|
||||
@import "course/gradebook";
|
||||
|
||||
64
lms/static/sass/course/_syllabus.scss
Normal file
64
lms/static/sass/course/_syllabus.scss
Normal file
@@ -0,0 +1,64 @@
|
||||
div.syllabus {
|
||||
|
||||
padding: 0px 10px;
|
||||
|
||||
text-align: center;
|
||||
|
||||
h1 {
|
||||
@extend .top-header
|
||||
}
|
||||
|
||||
.notes {
|
||||
width: 740px;
|
||||
margin: 0px auto 10px;
|
||||
}
|
||||
|
||||
table {
|
||||
|
||||
text-align: left;
|
||||
|
||||
margin: 10px auto;
|
||||
|
||||
thead {
|
||||
font-weight: bold;
|
||||
border-bottom: 1px solid black;
|
||||
}
|
||||
|
||||
tr.first {
|
||||
td {
|
||||
padding-top: 15px;
|
||||
}
|
||||
}
|
||||
|
||||
td {
|
||||
|
||||
vertical-align: middle;
|
||||
|
||||
padding: 5px 10px;
|
||||
|
||||
&.day, &.due {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
&.no_class {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
&.important {
|
||||
color: red;
|
||||
}
|
||||
|
||||
&.week_separator {
|
||||
padding: 0px;
|
||||
|
||||
hr {
|
||||
margin: 10px;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -19,6 +19,9 @@ def url_class(url):
|
||||
<ol class="course-tabs">
|
||||
<li class="courseware"><a href="${reverse('courseware', args=[course.id])}" class="${url_class('courseware')}">Courseware</a></li>
|
||||
<li class="info"><a href="${reverse('info', args=[course.id])}" class="${url_class('info')}">Course Info</a></li>
|
||||
% if settings.MITX_FEATURES.get('ENABLE_SYLLABUS'):
|
||||
<li class="syllabus"><a href="${reverse('syllabus', args=[course.id])}" class="${url_class('syllabus')}">Syllabus</a></li>
|
||||
% endif
|
||||
% if user.is_authenticated():
|
||||
% if settings.MITX_FEATURES.get('ENABLE_TEXTBOOK'):
|
||||
% for index, textbook in enumerate(course.textbooks):
|
||||
|
||||
24
lms/templates/courseware/syllabus.html
Normal file
24
lms/templates/courseware/syllabus.html
Normal file
@@ -0,0 +1,24 @@
|
||||
<%inherit file="/main.html" />
|
||||
<%namespace name='static' file='/static_content.html'/>
|
||||
|
||||
<%block name="headextra">
|
||||
<%static:css group='course'/>
|
||||
</%block>
|
||||
|
||||
<%block name="title"><title>${course.number} Course Info</title></%block>
|
||||
|
||||
<%include file="/courseware/course_navigation.html" args="active_page='syllabus'" />
|
||||
<%!
|
||||
from courseware.courses import get_course_syllabus_section
|
||||
%>
|
||||
|
||||
<section class="container">
|
||||
<div class="syllabus">
|
||||
<h1> Syllabus </h1>
|
||||
% if user.is_authenticated():
|
||||
${get_course_syllabus_section(course, 'syllabus')}
|
||||
% else:
|
||||
${get_course_syllabus_section(course, 'guest_syllabus')}
|
||||
% endif
|
||||
</div>
|
||||
</section>
|
||||
@@ -126,6 +126,8 @@ if settings.COURSEWARE_ENABLED:
|
||||
#Inside the course
|
||||
url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/info$',
|
||||
'courseware.views.course_info', name="info"),
|
||||
url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/syllabus$',
|
||||
'courseware.views.syllabus', name="syllabus"), # TODO arjun remove when custom tabs in place, see courseware/courses.py
|
||||
url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/book/(?P<book_index>[^/]*)/$',
|
||||
'staticbook.views.index', name="book"),
|
||||
url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/book/(?P<book_index>[^/]*)/(?P<page>[^/]*)$',
|
||||
|
||||
Reference in New Issue
Block a user