From ae09598d9a388b261b1cc2b72e1d58942d4c5cf4 Mon Sep 17 00:00:00 2001 From: Matthew Mongeau <halogenandtoast@gmail.com> Date: Sun, 12 Aug 2012 20:10:34 -0400 Subject: [PATCH] Display textbooks in course navigation, handle in urls and views. --- common/lib/xmodule/setup.py | 1 + common/lib/xmodule/xmodule/course_module.py | 5 ++++ common/lib/xmodule/xmodule/textbook_module.py | 27 +++++++++++++++++++ lms/djangoapps/staticbook/views.py | 8 +++--- lms/templates/course_navigation.html | 8 +++--- lms/urls.py | 4 +-- 6 files changed, 43 insertions(+), 10 deletions(-) create mode 100644 common/lib/xmodule/xmodule/textbook_module.py diff --git a/common/lib/xmodule/setup.py b/common/lib/xmodule/setup.py index 8a0a6bb1396..31918c02500 100644 --- a/common/lib/xmodule/setup.py +++ b/common/lib/xmodule/setup.py @@ -31,6 +31,7 @@ setup( "section = xmodule.backcompat_module:SemanticSectionDescriptor", "sequential = xmodule.seq_module:SequenceDescriptor", "slides = xmodule.backcompat_module:TranslateCustomTagDescriptor", + "textbook = xmodule.textbook_module:TextbookDescriptor", "vertical = xmodule.vertical_module:VerticalDescriptor", "video = xmodule.video_module:VideoDescriptor", "videodev = xmodule.backcompat_module:TranslateCustomTagDescriptor", diff --git a/common/lib/xmodule/xmodule/course_module.py b/common/lib/xmodule/xmodule/course_module.py index 11d4e090f9b..8674b8b443c 100644 --- a/common/lib/xmodule/xmodule/course_module.py +++ b/common/lib/xmodule/xmodule/course_module.py @@ -7,6 +7,7 @@ from xmodule.graders import load_grading_policy from xmodule.modulestore import Location from xmodule.seq_module import SequenceDescriptor, SequenceModule from xmodule.timeparse import parse_time, stringify_time +from xmodule.textbook_module import TextbookDescriptor log = logging.getLogger(__name__) @@ -53,6 +54,10 @@ class CourseDescriptor(SequenceDescriptor): return grading_policy + @property + def textbooks(self): + return [child for child in self.get_children() if type(child) == TextbookDescriptor] + @lazyproperty def grading_context(self): diff --git a/common/lib/xmodule/xmodule/textbook_module.py b/common/lib/xmodule/xmodule/textbook_module.py new file mode 100644 index 00000000000..bd1c4226432 --- /dev/null +++ b/common/lib/xmodule/xmodule/textbook_module.py @@ -0,0 +1,27 @@ +from xmodule.x_module import XModule +from xmodule.xml_module import XmlDescriptor +from lxml import etree + +class TextbookModule(XModule): + def __init__(self, system, location, definition, instance_state=None, + shared_state=None, **kwargs): + XModule.__init__(self, system, location, definition, + instance_state, shared_state, **kwargs) + +class TextbookDescriptor(XmlDescriptor): + + module_class = TextbookModule + + def __init__(self, system, definition=None, **kwargs): + super(TextbookDescriptor, self).__init__(system, definition, **kwargs) + self.title = self.metadata["title"] + + @classmethod + def definition_from_xml(cls, xml_object, system): + return { 'children': [] } + + @property + def table_of_contents(self): + raw_table_of_contents = open(self.metadata['table_of_contents_url'], 'r') # TODO: This will need to come from S3 + table_of_contents = etree.parse(raw_table_of_contents).getroot() + return table_of_contents diff --git a/lms/djangoapps/staticbook/views.py b/lms/djangoapps/staticbook/views.py index 2e19ab6425e..aaafb60dd84 100644 --- a/lms/djangoapps/staticbook/views.py +++ b/lms/djangoapps/staticbook/views.py @@ -6,19 +6,17 @@ from courseware.courses import get_course_with_access from lxml import etree @login_required -def index(request, course_id, page=0): +def index(request, course_id, book_index, page=0): course = get_course_with_access(request.user, course_id, 'load') staff_access = has_access(request.user, course, 'staff') - # TODO: This will need to come from S3 - raw_table_of_contents = open('lms/templates/book_toc.xml', 'r') - table_of_contents = etree.parse(raw_table_of_contents).getroot() + textbook = course.textbooks[int(book_index)] + table_of_contents = textbook.table_of_contents return render_to_response('staticbook.html', {'page': int(page), 'course': course, 'table_of_contents': table_of_contents, 'staff_access': staff_access}) - def index_shifted(request, course_id, page): return index(request, course_id=course_id, page=int(page) + 24) diff --git a/lms/templates/course_navigation.html b/lms/templates/course_navigation.html index 9e93b2fb142..b75c12064d5 100644 --- a/lms/templates/course_navigation.html +++ b/lms/templates/course_navigation.html @@ -16,8 +16,10 @@ def url_class(url): <li class="info"><a href="${reverse('info', args=[course.id])}" class="${url_class('info')}">Course Info</a></li> % if user.is_authenticated(): % if settings.MITX_FEATURES.get('ENABLE_TEXTBOOK'): - <li class="book"><a href="${reverse('book', args=[course.id])}" class="${url_class('book')}">Textbook</a></li> -% endif + % for index, textbook in enumerate(course.textbooks): + <li class="book"><a href="${reverse('book', args=[course.id, index])}" class="${url_class('book')}">${textbook.title}</a></li> + % endfor +% endif % if settings.MITX_FEATURES.get('ENABLE_DISCUSSION'): <li class="discussion"><a href="${reverse('questions')}">Discussion</a></li> % endif @@ -34,4 +36,4 @@ def url_class(url): </ol> </div> -</nav> \ No newline at end of file +</nav> diff --git a/lms/urls.py b/lms/urls.py index aaeba1b51e8..6850b65644d 100644 --- a/lms/urls.py +++ b/lms/urls.py @@ -126,9 +126,9 @@ 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>[^/]+/[^/]+/[^/]+)/book$', + url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/book/(?P<book_index>[^/]*)/$', 'staticbook.views.index', name="book"), - url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/book/(?P<page>[^/]*)$', + url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/book/(?P<book_index>[^/]*)/(?P<page>[^/]*)$', 'staticbook.views.index'), url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/book-shifted/(?P<page>[^/]*)$', 'staticbook.views.index_shifted'), -- GitLab