diff --git a/common/lib/xmodule/xmodule/course_module.py b/common/lib/xmodule/xmodule/course_module.py index 2c69c449ba..8b2d5a6c92 100644 --- a/common/lib/xmodule/xmodule/course_module.py +++ b/common/lib/xmodule/xmodule/course_module.py @@ -352,6 +352,13 @@ class CourseDescriptor(SequenceDescriptor): """ return self.metadata.get('tabs') + @property + def pdf_textbooks(self): + """ + Return the pdf_textbooks config, as a python object, or None if not specified. + """ + return self.metadata.get('pdf_textbooks') + @tabs.setter def tabs(self, value): self.metadata['tabs'] = value diff --git a/lms/djangoapps/courseware/tabs.py b/lms/djangoapps/courseware/tabs.py index a47141b183..b31aeb6b5a 100644 --- a/lms/djangoapps/courseware/tabs.py +++ b/lms/djangoapps/courseware/tabs.py @@ -119,6 +119,16 @@ def _textbooks(tab, user, course, active_page): for index, textbook in enumerate(course.textbooks)] return [] +def _pdf_textbooks(tab, user, course, active_page): + """ + Generates one tab per textbook. Only displays if user is authenticated. + """ + if user.is_authenticated(): + # since there can be more than one textbook, active_page is e.g. "book/0". + return [CourseTab(textbook['tab_title'], reverse('pdf_book', args=[course.id, index]), + active_page == "pdftextbook/{0}".format(index)) + for index, textbook in enumerate(course.pdf_textbooks)] + return [] def _staff_grading(tab, user, course, active_page): if has_access(user, course, 'staff'): @@ -198,6 +208,7 @@ VALID_TAB_TYPES = { 'discussion': TabImpl(need_name, _discussion), 'external_link': TabImpl(key_checker(['name', 'link']), _external_link), 'textbooks': TabImpl(null_validator, _textbooks), + 'pdf_textbooks': TabImpl(null_validator, _pdf_textbooks), 'progress': TabImpl(need_name, _progress), 'static_tab': TabImpl(key_checker(['name', 'url_slug']), _static_tab), 'peer_grading': TabImpl(null_validator, _peer_grading), diff --git a/lms/djangoapps/staticbook/views.py b/lms/djangoapps/staticbook/views.py index 6750d151ce..24f3964713 100644 --- a/lms/djangoapps/staticbook/views.py +++ b/lms/djangoapps/staticbook/views.py @@ -30,3 +30,23 @@ def index(request, course_id, book_index, page=None): def index_shifted(request, course_id, page): return index(request, course_id=course_id, page=int(page) + 24) + + +@login_required +def pdf_index(request, course_id, book_index, chapter=None, page=None): + course = get_course_with_access(request.user, course_id, 'load') + staff_access = has_access(request.user, course, 'staff') + + book_index = int(book_index) + textbook = course.pdf_textbooks[book_index] + +# if page is None: +# page = textbook.start_page + + return render_to_response('static_pdfbook.html', + {'book_index': book_index, + 'course': course, + 'textbook': textbook, + 'page': page, + 'chapter': chapter, + 'staff_access': staff_access}) diff --git a/lms/templates/static_pdfbook.html b/lms/templates/static_pdfbook.html new file mode 100644 index 0000000000..29cf00d83f --- /dev/null +++ b/lms/templates/static_pdfbook.html @@ -0,0 +1,111 @@ +<%inherit file="main.html" /> +<%namespace name='static' file='static_content.html'/> +<%block name="title">${course.number} Textbook + +<%block name="headextra"> +<%static:css group='course'/> +<%static:js group='courseware'/> + + +<%block name="js_extra"> + + + + + + + + +<%include file="/courseware/course_navigation.html" args="active_page='textbook/{0}'.format(book_index)" /> + +
+
+ +
+
+
+ + +     + Page: / +
+ +
+ +
+ +
+
+
+
diff --git a/lms/urls.py b/lms/urls.py index a203d468e7..de71366cda 100644 --- a/lms/urls.py +++ b/lms/urls.py @@ -233,6 +233,17 @@ if settings.COURSEWARE_ENABLED: 'staticbook.views.index'), url(r'^courses/(?P[^/]+/[^/]+/[^/]+)/book-shifted/(?P[^/]*)$', 'staticbook.views.index_shifted'), + + url(r'^courses/(?P[^/]+/[^/]+/[^/]+)/pdfbook/(?P[^/]*)/$', + 'staticbook.views.pdf_index', name="pdf_book"), + url(r'^courses/(?P[^/]+/[^/]+/[^/]+)/pdfbook/(?P[^/]*)/(?P[^/]*)$', + 'staticbook.views.pdf_index'), + + url(r'^courses/(?P[^/]+/[^/]+/[^/]+)/pdfbook/(?P[^/]*)/chapter/(?P[^/]*)/$', + 'staticbook.views.pdf_index'), + url(r'^courses/(?P[^/]+/[^/]+/[^/]+)/pdfbook/(?P[^/]*)/chapter/(?P[^/]*)/(?P[^/]*)$', + 'staticbook.views.pdf_index'), + url(r'^courses/(?P[^/]+/[^/]+/[^/]+)/courseware/?$', 'courseware.views.index', name="courseware"), url(r'^courses/(?P[^/]+/[^/]+/[^/]+)/courseware/(?P[^/]*)/$', @@ -241,6 +252,7 @@ if settings.COURSEWARE_ENABLED: 'courseware.views.index', name="courseware_section"), url(r'^courses/(?P[^/]+/[^/]+/[^/]+)/courseware/(?P[^/]*)/(?P
[^/]*)/(?P[^/]*)/?$', 'courseware.views.index', name="courseware_position"), + url(r'^courses/(?P[^/]+/[^/]+/[^/]+)/progress$', 'courseware.views.progress', name="progress"), # Takes optional student_id for instructor use--shows profile as that student sees it.