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