def _create_courseware_context(self, request): """ Returns and creates the rendering context for the courseware. Also returns the table of contents for the courseware. """ course_url_name = default_course_url_name(self.course.id) course_url = reverse(course_url_name, kwargs={'course_id': unicode(self.course.id)}) courseware_context = { 'csrf': csrf(self.request)['csrf_token'], 'course': self.course, 'course_url': course_url, 'chapter': self.chapter, 'section': self.section, 'init': '', 'fragment': Fragment(), 'staff_access': self.is_staff, 'masquerade': self.masquerade, 'supports_preview_menu': True, 'studio_url': get_studio_url(self.course, 'course'), 'xqa_server': settings.FEATURES.get('XQA_SERVER', "http://your_xqa_server.com"), 'bookmarks_api_url': reverse('bookmarks'), 'language_preference': self._get_language_preference(), 'disable_optimizely': not WaffleSwitchNamespace('RET').is_enabled( 'enable_optimizely_in_courseware'), 'section_title': None, 'sequence_title': None, 'disable_accordion': COURSE_OUTLINE_PAGE_FLAG.is_enabled(self.course.id), } courseware_context.update( get_experiment_user_metadata_context( self.course, self.effective_user, )) table_of_contents = toc_for_course( self.effective_user, self.request, self.course, self.chapter_url_name, self.section_url_name, self.field_data_cache, ) courseware_context['accordion'] = render_accordion( self.request, self.course, table_of_contents['chapters'], ) courseware_context['course_sock_fragment'] = CourseSockFragmentView( ).render_to_fragment(request, course=self.course) # entrance exam data self._add_entrance_exam_to_context(courseware_context) if self.section: # chromeless data if self.section.chrome: chrome = [ s.strip() for s in self.section.chrome.lower().split(",") ] if 'accordion' not in chrome: courseware_context['disable_accordion'] = True if 'tabs' not in chrome: courseware_context['disable_tabs'] = True # default tab if self.section.default_tab: courseware_context['default_tab'] = self.section.default_tab # section data courseware_context[ 'section_title'] = self.section.display_name_with_default section_context = self._create_section_context( table_of_contents['previous_of_active_section'], table_of_contents['next_of_active_section'], ) courseware_context['fragment'] = self.section.render( self.view, section_context) if self.section.position and self.section.has_children: self._add_sequence_title_to_context(courseware_context) return courseware_context
def _create_courseware_context(self, request): """ Returns and creates the rendering context for the courseware. Also returns the table of contents for the courseware. """ course_url_name = default_course_url_name(self.course.id) course_url = reverse(course_url_name, kwargs={'course_id': unicode(self.course.id)}) courseware_context = { 'csrf': csrf(self.request)['csrf_token'], 'course': self.course, 'course_url': course_url, 'chapter': self.chapter, 'section': self.section, 'init': '', 'fragment': Fragment(), 'staff_access': self.is_staff, 'masquerade': self.masquerade, 'supports_preview_menu': True, 'studio_url': get_studio_url(self.course, 'course'), 'xqa_server': settings.FEATURES.get('XQA_SERVER', "http://your_xqa_server.com"), 'bookmarks_api_url': reverse('bookmarks'), 'language_preference': self._get_language_preference(), 'disable_optimizely': not WaffleSwitchNamespace('RET').is_enabled('enable_optimizely_in_courseware'), 'section_title': None, 'sequence_title': None, 'disable_accordion': COURSE_OUTLINE_PAGE_FLAG.is_enabled(self.course.id), } courseware_context.update( get_experiment_user_metadata_context( self.course, self.effective_user, ) ) table_of_contents = toc_for_course( self.effective_user, self.request, self.course, self.chapter_url_name, self.section_url_name, self.field_data_cache, ) courseware_context['accordion'] = render_accordion( self.request, self.course, table_of_contents['chapters'], ) courseware_context['course_sock_fragment'] = CourseSockFragmentView().render_to_fragment( request, course=self.course) # entrance exam data self._add_entrance_exam_to_context(courseware_context) if self.section: # chromeless data if self.section.chrome: chrome = [s.strip() for s in self.section.chrome.lower().split(",")] if 'accordion' not in chrome: courseware_context['disable_accordion'] = True if 'tabs' not in chrome: courseware_context['disable_tabs'] = True # default tab if self.section.default_tab: courseware_context['default_tab'] = self.section.default_tab # section data courseware_context['section_title'] = self.section.display_name_with_default section_context = self._create_section_context( table_of_contents['previous_of_active_section'], table_of_contents['next_of_active_section'], ) courseware_context['fragment'] = self.section.render(self.view, section_context) if self.section.position and self.section.has_children: self._add_sequence_title_to_context(courseware_context) return courseware_context
def _create_courseware_context(self, request): """ Returns and creates the rendering context for the courseware. Also returns the table of contents for the courseware. """ course_url_name = default_course_url_name(self.course.id) course_url = reverse(course_url_name, kwargs={'course_id': unicode(self.course.id)}) courseware_context = { 'csrf': csrf(self.request)['csrf_token'], 'course': self.course, 'course_url': course_url, 'chapter': self.chapter, 'section': self.section, 'init': '', 'fragment': Fragment(), 'staff_access': self.is_staff, 'masquerade': self.masquerade, 'supports_preview_menu': True, 'studio_url': get_studio_url(self.course, 'course'), 'xqa_server': settings.FEATURES.get('XQA_SERVER', "http://your_xqa_server.com"), 'bookmarks_api_url': reverse('bookmarks'), 'language_preference': self._get_language_preference(), 'disable_optimizely': not WaffleSwitchNamespace('RET').is_enabled( 'enable_optimizely_in_courseware'), 'section_title': None, 'sequence_title': None, 'disable_accordion': COURSE_OUTLINE_PAGE_FLAG.is_enabled(self.course.id), } courseware_context.update( get_experiment_user_metadata_context( self.course, self.effective_user, )) table_of_contents = toc_for_course( self.effective_user, self.request, self.course, self.chapter_url_name, self.section_url_name, self.field_data_cache, ) courseware_context['accordion'] = render_accordion( self.request, self.course, table_of_contents['chapters'], ) courseware_context['course_sock_fragment'] = CourseSockFragmentView( ).render_to_fragment(request, course=self.course) # entrance exam data self._add_entrance_exam_to_context(courseware_context) # staff masquerading data if not check_course_open_for_learner(self.effective_user, self.course): # Disable student view button if user is staff and # course is not yet visible to students. courseware_context['disable_student_access'] = True courseware_context['supports_preview_menu'] = False if self.section: # chromeless data if self.section.chrome: chrome = [ s.strip() for s in self.section.chrome.lower().split(",") ] if 'accordion' not in chrome: courseware_context['disable_accordion'] = True if 'tabs' not in chrome: courseware_context['disable_tabs'] = True # default tab if self.section.default_tab: courseware_context['default_tab'] = self.section.default_tab # section data courseware_context[ 'section_title'] = self.section.display_name_with_default section_context = self._create_section_context( table_of_contents['previous_of_active_section'], table_of_contents['next_of_active_section'], ) courseware_context['fragment'] = self.section.render( STUDENT_VIEW, section_context) if self.section.position and self.section.has_children: display_items = self.section.get_display_items() if display_items: try: courseware_context['sequence_title'] = display_items[self.section.position - 1] \ .display_name_with_default except IndexError: log.exception( "IndexError loading courseware for user %s, course %s, section %s, position %d. Total items: %d. URL: %s", self.real_user.username, self.course.id, self.section.display_name_with_default, self.section.position, len(display_items), self.url, ) raise return courseware_context
def _create_courseware_context(self, request): """ Returns and creates the rendering context for the courseware. Also returns the table of contents for the courseware. """ from lms.urls import RESET_COURSE_DEADLINES_NAME course_url_name = default_course_url_name(self.course.id) course_url = reverse( course_url_name, kwargs={'course_id': six.text_type(self.course.id)}) show_search = ( settings.FEATURES.get('ENABLE_COURSEWARE_SEARCH') or (settings.FEATURES.get('ENABLE_COURSEWARE_SEARCH_FOR_COURSE_STAFF') and self.is_staff)) staff_access = self.is_staff allow_anonymous = check_public_access(self.course, [COURSE_VISIBILITY_PUBLIC]) display_reset_dates_banner = False if not allow_anonymous and RELATIVE_DATES_FLAG.is_enabled( self.course.id): display_reset_dates_banner = reset_deadlines_banner_should_display( self.course_key, request) reset_deadlines_url = reverse(RESET_COURSE_DEADLINES_NAME ) if display_reset_dates_banner else None reset_deadlines_redirect_url_base = COURSE_HOME_VIEW_NAME if reset_deadlines_url else None courseware_context = { 'csrf': csrf(self.request)['csrf_token'], 'course': self.course, 'course_url': course_url, 'chapter': self.chapter, 'section': self.section, 'init': '', 'fragment': Fragment(), 'staff_access': staff_access, 'can_masquerade': self.can_masquerade, 'masquerade': self.masquerade, 'supports_preview_menu': True, 'studio_url': get_studio_url(self.course, 'course'), 'xqa_server': settings.FEATURES.get('XQA_SERVER', "http://your_xqa_server.com"), 'bookmarks_api_url': reverse('bookmarks'), 'language_preference': self._get_language_preference(), 'disable_optimizely': not WaffleSwitchNamespace('RET').is_enabled( 'enable_optimizely_in_courseware'), 'section_title': None, 'sequence_title': None, 'disable_accordion': COURSE_OUTLINE_PAGE_FLAG.is_enabled(self.course.id), 'show_search': show_search, 'relative_dates_is_enabled': RELATIVE_DATES_FLAG.is_enabled(self.course.id), 'display_reset_dates_banner': display_reset_dates_banner, 'reset_deadlines_url': reset_deadlines_url, 'reset_deadlines_redirect_url_base': reset_deadlines_redirect_url_base, 'reset_deadlines_redirect_url_id_dict': { 'course_id': str(self.course.id) }, } courseware_context.update( get_experiment_user_metadata_context( self.course, self.effective_user, )) table_of_contents = toc_for_course( self.effective_user, self.request, self.course, self.chapter_url_name, self.section_url_name, self.field_data_cache, ) courseware_context['accordion'] = render_accordion( self.request, self.course, table_of_contents['chapters'], ) courseware_context['course_sock_fragment'] = CourseSockFragmentView( ).render_to_fragment(request, course=self.course) # entrance exam data self._add_entrance_exam_to_context(courseware_context) if self.section: # chromeless data if self.section.chrome: chrome = [ s.strip() for s in self.section.chrome.lower().split(",") ] if 'accordion' not in chrome: courseware_context['disable_accordion'] = True if 'tabs' not in chrome: courseware_context['disable_tabs'] = True # default tab if self.section.default_tab: courseware_context['default_tab'] = self.section.default_tab # section data courseware_context[ 'section_title'] = self.section.display_name_with_default section_context = self._create_section_context( table_of_contents['previous_of_active_section'], table_of_contents['next_of_active_section'], ) courseware_context['fragment'] = self.section.render( self.view, section_context) if self.section.position and self.section.has_children: self._add_sequence_title_to_context(courseware_context) # Courseware MFE link if show_courseware_mfe_link(request.user, staff_access, self.course.id): courseware_context['microfrontend_link'] = self.microfrontend_url else: courseware_context['microfrontend_link'] = None return courseware_context
def _create_courseware_context(self, request): """ Returns and creates the rendering context for the courseware. Also returns the table of contents for the courseware. """ course_url_name = default_course_url_name(self.course.id) course_url = reverse( course_url_name, kwargs={'course_id': six.text_type(self.course.id)}) show_search = ( settings.FEATURES.get('ENABLE_COURSEWARE_SEARCH') or (settings.FEATURES.get('ENABLE_COURSEWARE_SEARCH_FOR_COURSE_STAFF') and self.is_staff)) staff_access = self.is_staff reset_deadlines_url = reverse( 'openedx.course_experience.reset_course_deadlines', kwargs={'course_id': six.text_type(self.course.id)}) allow_anonymous = allow_public_access(self.course, [COURSE_VISIBILITY_PUBLIC]) display_reset_dates_banner = False if not allow_anonymous and RELATIVE_DATES_FLAG.is_enabled( self.course.id): # pylint: disable=too-many-nested-blocks course_overview = CourseOverview.objects.get( id=str(self.course_key)) end_date = getattr(course_overview, 'end_date') if course_overview.self_paced and (not end_date or timezone.now() < end_date): if (CourseEnrollment.objects.filter( course=course_overview, user=request.user, mode=CourseMode.VERIFIED).exists()): course_block_tree = get_course_outline_block_tree( request, str(self.course_key), request.user) course_sections = course_block_tree.get('children', []) for section in course_sections: if display_reset_dates_banner: break for subsection in section.get('children', []): if (not subsection.get('complete', True) and subsection.get( 'due', timezone.now() + timedelta(1)) < timezone.now()): display_reset_dates_banner = True break courseware_context = { 'csrf': csrf(self.request)['csrf_token'], 'course': self.course, 'course_url': course_url, 'chapter': self.chapter, 'section': self.section, 'init': '', 'fragment': Fragment(), 'staff_access': staff_access, 'can_masquerade': self.can_masquerade, 'masquerade': self.masquerade, 'supports_preview_menu': True, 'studio_url': get_studio_url(self.course, 'course'), 'xqa_server': settings.FEATURES.get('XQA_SERVER', "http://your_xqa_server.com"), 'bookmarks_api_url': reverse('bookmarks'), 'language_preference': self._get_language_preference(), 'disable_optimizely': not WaffleSwitchNamespace('RET').is_enabled( 'enable_optimizely_in_courseware'), 'section_title': None, 'sequence_title': None, 'disable_accordion': COURSE_OUTLINE_PAGE_FLAG.is_enabled(self.course.id), 'show_search': show_search, 'relative_dates_is_enabled': RELATIVE_DATES_FLAG.is_enabled(self.course.id), 'reset_deadlines_url': reset_deadlines_url, 'display_reset_dates_banner': display_reset_dates_banner, } courseware_context.update( get_experiment_user_metadata_context( self.course, self.effective_user, )) table_of_contents = toc_for_course( self.effective_user, self.request, self.course, self.chapter_url_name, self.section_url_name, self.field_data_cache, ) courseware_context['accordion'] = render_accordion( self.request, self.course, table_of_contents['chapters'], ) courseware_context['course_sock_fragment'] = CourseSockFragmentView( ).render_to_fragment(request, course=self.course_overview) # entrance exam data self._add_entrance_exam_to_context(courseware_context) if self.section: # chromeless data if self.section.chrome: chrome = [ s.strip() for s in self.section.chrome.lower().split(",") ] if 'accordion' not in chrome: courseware_context['disable_accordion'] = True if 'tabs' not in chrome: courseware_context['disable_tabs'] = True # default tab if self.section.default_tab: courseware_context['default_tab'] = self.section.default_tab # section data courseware_context[ 'section_title'] = self.section.display_name_with_default section_context = self._create_section_context( table_of_contents['previous_of_active_section'], table_of_contents['next_of_active_section'], ) courseware_context['fragment'] = self.section.render( self.view, section_context) if self.section.position and self.section.has_children: self._add_sequence_title_to_context(courseware_context) # Courseware MFE link if show_courseware_mfe_link(request.user, staff_access, self.course.id): if self.section: try: unit_key = UsageKey.from_string( request.GET.get('activate_block_id', '')) # `activate_block_id` is typically a Unit (a.k.a. Vertical), # but it can technically be any block type. Do a check to # make sure it's really a Unit before we use it for the MFE. if unit_key.block_type != 'vertical': unit_key = None except InvalidKeyError: unit_key = None courseware_context[ 'microfrontend_link'] = get_microfrontend_url( self.course.id, self.section.location, unit_key) else: courseware_context[ 'microfrontend_link'] = get_microfrontend_url( self.course.id) else: courseware_context['microfrontend_link'] = None return courseware_context
def render_body(context,**pageargs): __M_caller = context.caller_stack._push_frame() try: __M_locals = __M_dict_builtin(pageargs=pageargs) disable_accordion = context.get('disable_accordion', UNDEFINED) int = context.get('int', UNDEFINED) course = context.get('course', UNDEFINED) static = _mako_get_namespace(context, 'static') unicode = context.get('unicode', UNDEFINED) default_tab = context.get('default_tab', UNDEFINED) def course_name(): return render_course_name(context._locals(__M_locals)) def bodyclass(): return render_bodyclass(context._locals(__M_locals)) def title(): return render_title(context._locals(__M_locals)) section = context.get('section', UNDEFINED) def js_extra(): return render_js_extra(context._locals(__M_locals)) getattr = context.get('getattr', UNDEFINED) language_preference = context.get('language_preference', UNDEFINED) entrance_exam_passed = context.get('entrance_exam_passed', UNDEFINED) fragment = context.get('fragment', UNDEFINED) sequence_title = context.get('sequence_title', UNDEFINED) staff_access = context.get('staff_access', UNDEFINED) chapter = context.get('chapter', UNDEFINED) section_title = context.get('section_title', UNDEFINED) accordion = context.get('accordion', UNDEFINED) request = context.get('request', UNDEFINED) course_url = context.get('course_url', UNDEFINED) entrance_exam_current_score = context.get('entrance_exam_current_score', UNDEFINED) course_sock_fragment = context.get('course_sock_fragment', UNDEFINED) def headextra(): return render_headextra(context._locals(__M_locals)) def header_extras(): return render_header_extras(context._locals(__M_locals)) round = context.get('round', UNDEFINED) __M_writer = context.writer() __M_writer(u'\n') __M_writer(u'\n') __M_writer(u'\n') __M_writer(u'\n') __M_writer(u'\n') include_special_exams = settings.FEATURES.get('ENABLE_SPECIAL_EXAMS', False) and (course.enable_proctored_exams or course.enable_timed_exams) __M_locals_builtin_stored = __M_locals_builtin() __M_locals.update(__M_dict_builtin([(__M_key, __M_locals_builtin_stored[__M_key]) for __M_key in ['include_special_exams'] if __M_key in __M_locals_builtin_stored])) __M_writer(u'\n') __M_writer(u'\n\n') if 'parent' not in context._data or not hasattr(context._data['parent'], 'bodyclass'): context['self'].bodyclass(**pageargs) __M_writer(u'\n\n') if 'parent' not in context._data or not hasattr(context._data['parent'], 'title'): context['self'].title(**pageargs) __M_writer(u'\n\n') if 'parent' not in context._data or not hasattr(context._data['parent'], 'header_extras'): context['self'].header_extras(**pageargs) __M_writer(u'\n\n') if 'parent' not in context._data or not hasattr(context._data['parent'], 'headextra'): context['self'].headextra(**pageargs) __M_writer(u'\n\n') if 'parent' not in context._data or not hasattr(context._data['parent'], 'js_extra'): context['self'].js_extra(**pageargs) __M_writer(u'\n\n<div class="message-banner" aria-live="polite"></div>\n\n') if default_tab: runtime._include_file(context, u'/courseware/course_navigation.html', _template_uri) __M_writer(u'\n') else: runtime._include_file(context, u'/courseware/course_navigation.html', _template_uri, active_page='courseware') __M_writer(u'\n') __M_writer(u'\n<div class="container"\n') if getattr(course, 'language'): __M_writer(u'lang="') __M_writer(filters.html_escape(filters.decode.utf8(course.language))) __M_writer(u'"\n') __M_writer(u'>\n<div class="course-wrapper" role="presentation">\n\n') if disable_accordion is UNDEFINED or not disable_accordion: __M_writer(u' <div class="course-index">\n\n <div class="wrapper-course-modes">\n\n <div class="courseware-bookmarks-button">\n <a class="bookmarks-list-button" href="') __M_writer(filters.html_escape(filters.decode.utf8(reverse('openedx.course_bookmarks.home', args=[course.id])))) __M_writer(u'">\n ') __M_writer(filters.html_escape(filters.decode.utf8(_("Bookmarks")))) __M_writer(u'\n </a>\n </div>\n\n') if settings.FEATURES.get('ENABLE_COURSEWARE_SEARCH'): __M_writer(u' <div id="courseware-search-bar" class="search-bar courseware-search-bar" role="search" aria-label="Course">\n <form class="search-form">\n <label for="course-search-input" class="sr">') __M_writer(filters.html_escape(filters.decode.utf8(_("Course Search")))) __M_writer(u'</label>\n <div class="search-field-wrapper">\n <input id="course-search-input" type="text" class="search-field"/>\n <button type="submit" class="search-button">') __M_writer(filters.html_escape(filters.decode.utf8(_("Search")))) __M_writer(u'</button>\n <button type="button" class="cancel-button" title="') __M_writer(filters.html_escape(filters.decode.utf8(_('Clear search')))) __M_writer(u'">\n <span class="icon fa fa-remove" aria-hidden="true"></span>\n </button>\n </div>\n </form>\n </div>\n') __M_writer(u'\n </div>\n\n <div class="accordion">\n <nav class="course-navigation" aria-label="') __M_writer(filters.html_escape(filters.decode.utf8(_('Course')))) __M_writer(u'">\n') if accordion.strip(): __M_writer(u' ') __M_writer(filters.html_escape(filters.decode.utf8(HTML(accordion)))) __M_writer(u'\n') else: __M_writer(u' <div class="chapter">') __M_writer(filters.html_escape(filters.decode.utf8(_("No content has been added to this course")))) __M_writer(u'</div>\n') __M_writer(u' </nav>\n </div>\n\n </div>\n') __M_writer(u' <section class="course-content" id="course-content">\n <header class="page-header has-secondary">\n <div class="page-header-main">\n <nav aria-label="') __M_writer(filters.html_escape(filters.decode.utf8(_('Course')))) __M_writer(u'" class="sr-is-focusable" tabindex="-1">\n <div class="has-breadcrumbs">\n <div class="breadcrumbs">\n') if COURSE_OUTLINE_PAGE_FLAG.is_enabled(course.id): __M_writer(u' <span class="nav-item nav-item-course">\n <a href="') __M_writer(filters.html_escape(filters.decode.utf8(course_url))) __M_writer(u'">') __M_writer(filters.html_escape(filters.decode.utf8(course_home_page_title(course)))) __M_writer(u'</a>\n </span>\n <span class="icon fa fa-angle-right" aria-hidden="true"></span>\n') if chapter: __M_writer(u' <span class="nav-item nav-item-chapter" data-course-position="') __M_writer(filters.html_escape(filters.decode.utf8(course.position))) __M_writer(u'" data-chapter-position="') __M_writer(filters.html_escape(filters.decode.utf8(chapter.position))) __M_writer(u'">\n <a href="') __M_writer(filters.html_escape(filters.decode.utf8(course_url))) __M_writer(u'#') __M_writer(filters.html_escape(filters.decode.utf8(unicode(chapter.location)))) __M_writer(u'">') __M_writer(filters.html_escape(filters.decode.utf8(chapter.display_name_with_default))) __M_writer(u'</a>\n </span>\n <span class="icon fa fa-angle-right" aria-hidden="true"></span>\n') if section: __M_writer(u' <span class="nav-item nav-item-section">\n <a href="') __M_writer(filters.html_escape(filters.decode.utf8(course_url))) __M_writer(u'#') __M_writer(filters.html_escape(filters.decode.utf8(unicode(section.location)))) __M_writer(u'">') __M_writer(filters.html_escape(filters.decode.utf8(section.display_name_with_default))) __M_writer(u'</a>\n </span>\n <span class="icon fa fa-angle-right" aria-hidden="true"></span>\n') __M_writer(u' <span class="nav-item nav-item-sequence">') __M_writer(filters.html_escape(filters.decode.utf8(sequence_title))) __M_writer(u'</span>\n </div>\n <i class="fullscreen-button fs-expand" aria-hidden="true" id="fullscreen">\n <svg>\n <use xlink:href="#ico-fs-expand"></use>\n </svg>\n </i>\n </div>\n </nav>\n </div>\n </header>\n\n <main id="main" tabindex="-1" aria-label="Content">\n') if getattr(course, 'entrance_exam_enabled') and \ getattr(course, 'entrance_exam_minimum_score_pct') and \ entrance_exam_current_score is not UNDEFINED: if not entrance_exam_passed: __M_writer(u' <p class="sequential-status-message">\n ') __M_writer(filters.html_escape(filters.decode.utf8(_('To access course materials, you must score {required_score}% or higher on this \ exam. Your current score is {current_score}%.').format( required_score=int(round(course.entrance_exam_minimum_score_pct * 100)), current_score=int(round(entrance_exam_current_score * 100)) )))) __M_writer(u'\n </p>\n <script type="text/javascript">\n $(document).ajaxSuccess(function(event, xhr, settings) {\n if (settings.url.indexOf("xmodule_handler/problem_check") > -1) {\n var data = JSON.parse(xhr.responseText);\n if (data.entrance_exam_passed){\n location.reload();\n }\n }\n });\n </script>\n') else: __M_writer(u' <p class="sequential-status-message">\n ') __M_writer(filters.html_escape(filters.decode.utf8(_('Your score is {current_score}%. You have passed the entrance exam.').format( current_score=int(round(entrance_exam_current_score * 100)) )))) __M_writer(u'\n </p>\n') __M_writer(u'\n ') __M_writer(filters.html_escape(filters.decode.utf8(HTML(fragment.body_html())))) __M_writer(u'\n </main>\n </section>\n\n <section class="courseware-results-wrapper">\n <div id="loading-message" aria-live="polite" aria-relevant="all"></div>\n <div id="error-message" aria-live="polite"></div>\n <div class="courseware-results search-results" data-course-id="') __M_writer(filters.html_escape(filters.decode.utf8(course.id))) __M_writer(u'" data-lang-code="') __M_writer(filters.html_escape(filters.decode.utf8(language_preference))) __M_writer(u'"></div>\n </section>\n\n</div>\n') __M_writer(filters.html_escape(filters.decode.utf8(HTML(course_sock_fragment.body_html())))) __M_writer(u'\n</div>\n<div class="container-footer">\n') if settings.FEATURES.get("LICENSING", False): __M_writer(u' <div class="course-license">\n') if getattr(course, "license", None): __M_writer(u' ') runtime._include_file(context, u'../license.html', _template_uri, license=course.license) __M_writer(u'\n') else: __M_writer(u' ') runtime._include_file(context, u'../license.html', _template_uri, license='all-rights-reserved') __M_writer(u'\n') __M_writer(u' </div>\n') __M_writer(u'</div>\n') if course.show_calculator or is_edxnotes_enabled(course, request.user): __M_writer(u'<nav class="nav-utilities ') __M_writer(filters.html_escape(filters.decode.utf8("has-utility-calculator" if course.show_calculator else ""))) __M_writer(u'" aria-label="') __M_writer(filters.html_escape(filters.decode.utf8(_('Course Utilities')))) __M_writer(u'">\n') if is_edxnotes_enabled(course, request.user): runtime._include_file(context, u'/edxnotes/toggle_notes.html', _template_uri, course=course) __M_writer(u'\n') __M_writer(u'\n') if course.show_calculator: runtime._include_file(context, u'/calculator/toggle_calculator.html', _template_uri) __M_writer(u'\n') __M_writer(u'</nav>\n') __M_writer(u'\n<script src="') __M_writer(filters.html_escape(filters.decode.utf8(static.url('js/fullscreenButton.js')))) __M_writer(u'"></script>\n') return '' finally: context.caller_stack._pop_frame()
def _create_courseware_context(self, request): """ Returns and creates the rendering context for the courseware. Also returns the table of contents for the courseware. """ course_url_name = default_course_url_name(self.course.id) course_url = reverse(course_url_name, kwargs={'course_id': unicode(self.course.id)}) courseware_context = { 'csrf': csrf(self.request)['csrf_token'], 'course': self.course, 'course_url': course_url, 'chapter': self.chapter, 'section': self.section, 'init': '', 'fragment': Fragment(), 'staff_access': self.is_staff, 'masquerade': self.masquerade, 'supports_preview_menu': True, 'studio_url': get_studio_url(self.course, 'course'), 'xqa_server': settings.FEATURES.get('XQA_SERVER', "http://your_xqa_server.com"), 'bookmarks_api_url': reverse('bookmarks'), 'language_preference': self._get_language_preference(), 'disable_optimizely': not WaffleSwitchNamespace('RET').is_enabled('enable_optimizely_in_courseware'), 'section_title': None, 'sequence_title': None, 'disable_accordion': COURSE_OUTLINE_PAGE_FLAG.is_enabled(self.course.id), } courseware_context.update( get_experiment_user_metadata_context( self.course, self.effective_user, ) ) table_of_contents = toc_for_course( self.effective_user, self.request, self.course, self.chapter_url_name, self.section_url_name, self.field_data_cache, ) courseware_context['accordion'] = render_accordion( self.request, self.course, table_of_contents['chapters'], ) courseware_context['course_sock_fragment'] = CourseSockFragmentView().render_to_fragment( request, course=self.course) # entrance exam data self._add_entrance_exam_to_context(courseware_context) # staff masquerading data if not check_course_open_for_learner(self.effective_user, self.course): # Disable student view button if user is staff and # course is not yet visible to students. courseware_context['disable_student_access'] = True courseware_context['supports_preview_menu'] = False if self.section: # chromeless data if self.section.chrome: chrome = [s.strip() for s in self.section.chrome.lower().split(",")] if 'accordion' not in chrome: courseware_context['disable_accordion'] = True if 'tabs' not in chrome: courseware_context['disable_tabs'] = True # default tab if self.section.default_tab: courseware_context['default_tab'] = self.section.default_tab # section data courseware_context['section_title'] = self.section.display_name_with_default section_context = self._create_section_context( table_of_contents['previous_of_active_section'], table_of_contents['next_of_active_section'], ) courseware_context['fragment'] = self.section.render(STUDENT_VIEW, section_context) if self.section.position and self.section.has_children: display_items = self.section.get_display_items() if display_items: try: courseware_context['sequence_title'] = display_items[self.section.position - 1] \ .display_name_with_default except IndexError: log.exception( "IndexError loading courseware for user %s, course %s, section %s, position %d. Total items: %d. URL: %s", self.real_user.username, self.course.id, self.section.display_name_with_default, self.section.position, len(display_items), self.url, ) raise return courseware_context
def _create_courseware_context(self, request): """ Returns and creates the rendering context for the courseware. Also returns the table of contents for the courseware. """ course_url_name = default_course_url_name(self.course.id) course_url = reverse( course_url_name, kwargs={'course_id': six.text_type(self.course.id)}) show_search = ( settings.FEATURES.get('ENABLE_COURSEWARE_SEARCH') or (settings.FEATURES.get('ENABLE_COURSEWARE_SEARCH_FOR_COURSE_STAFF') and self.is_staff)) staff_access = self.is_staff courseware_context = { 'csrf': csrf(self.request)['csrf_token'], 'course': self.course, 'course_url': course_url, 'chapter': self.chapter, 'section': self.section, 'init': '', 'fragment': Fragment(), 'staff_access': staff_access, 'can_masquerade': self.can_masquerade, 'masquerade': self.masquerade, 'supports_preview_menu': True, 'studio_url': get_studio_url(self.course, 'course'), 'xqa_server': settings.FEATURES.get('XQA_SERVER', "http://your_xqa_server.com"), 'bookmarks_api_url': reverse('bookmarks'), 'language_preference': self._get_language_preference(), 'disable_optimizely': not WaffleSwitchNamespace('RET').is_enabled( 'enable_optimizely_in_courseware'), 'section_title': None, 'sequence_title': None, 'disable_accordion': COURSE_OUTLINE_PAGE_FLAG.is_enabled(self.course.id), 'show_search': show_search, } courseware_context.update( get_experiment_user_metadata_context( self.course, self.effective_user, )) table_of_contents = toc_for_course( self.effective_user, self.request, self.course, self.chapter_url_name, self.section_url_name, self.field_data_cache, ) courseware_context['accordion'] = render_accordion( self.request, self.course, table_of_contents['chapters'], ) courseware_context['course_sock_fragment'] = CourseSockFragmentView( ).render_to_fragment(request, course=self.course_overview) # entrance exam data self._add_entrance_exam_to_context(courseware_context) if self.section: # chromeless data if self.section.chrome: chrome = [ s.strip() for s in self.section.chrome.lower().split(",") ] if 'accordion' not in chrome: courseware_context['disable_accordion'] = True if 'tabs' not in chrome: courseware_context['disable_tabs'] = True # default tab if self.section.default_tab: courseware_context['default_tab'] = self.section.default_tab # section data courseware_context[ 'section_title'] = self.section.display_name_with_default section_context = self._create_section_context( table_of_contents['previous_of_active_section'], table_of_contents['next_of_active_section'], ) courseware_context['fragment'] = self.section.render( self.view, section_context) if self.section.position and self.section.has_children: self._add_sequence_title_to_context(courseware_context) # Courseware MFE link if show_courseware_mfe_link(request.user, staff_access, self.course.id): if self.section: try: unit_key = UsageKey.from_string( request.GET.get('activate_block_id', '')) # `activate_block_id` is typically a Unit (a.k.a. Vertical), # but it can technically be any block type. Do a check to # make sure it's really a Unit before we use it for the MFE. if unit_key.block_type != 'vertical': unit_key = None except InvalidKeyError: unit_key = None courseware_context[ 'microfrontend_link'] = get_microfrontend_url( self.course.id, self.section.location, unit_key) else: courseware_context[ 'microfrontend_link'] = get_microfrontend_url( self.course.id) else: courseware_context['microfrontend_link'] = None return courseware_context