def process_request(self, request): """ If a user's UserPreference contains a language preference, use the user's preference. """ languages = released_languages() system_released_languages = [seq[0] for seq in languages] # If the user is logged in, check for their language preference if request.user.is_authenticated(): # Get the user's language preference user_pref = get_user_preference(request.user, LANGUAGE_KEY) # Set it to the LANGUAGE_SESSION_KEY (Django-specific session setting governing language pref) if user_pref: if user_pref in system_released_languages: request.session[LANGUAGE_SESSION_KEY] = user_pref else: delete_user_preference(request.user, LANGUAGE_KEY) else: preferred_language = request.META.get("HTTP_ACCEPT_LANGUAGE", "") lang_headers = [seq[0] for seq in parse_accept_lang_header(preferred_language)] # Setting the session language to the browser language, if it is supported. for browser_lang in lang_headers: if browser_lang in system_released_languages: if request.session.get(LANGUAGE_SESSION_KEY, None) is None: request.session[LANGUAGE_SESSION_KEY] = unicode(browser_lang) break
def process_request(self, request): """ If a user's UserPreference contains a language preference, use the user's preference. """ languages = released_languages() system_released_languages = [seq[0] for seq in languages] # If the user is logged in, check for their language preference if request.user.is_authenticated(): # Get the user's language preference user_pref = get_user_preference(request.user, LANGUAGE_KEY) # Set it to the LANGUAGE_SESSION_KEY (Django-specific session setting governing language pref) if user_pref: if user_pref in system_released_languages: request.session[LANGUAGE_SESSION_KEY] = user_pref else: delete_user_preference(request.user, LANGUAGE_KEY) else: preferred_language = request.META.get('HTTP_ACCEPT_LANGUAGE', '') lang_headers = [ seq[0] for seq in parse_accept_lang_header(preferred_language) ] # Setting the session language to the browser language, if it is supported. for browser_lang in lang_headers: if browser_lang in system_released_languages: if request.session.get(LANGUAGE_SESSION_KEY, None) is None: request.session[LANGUAGE_SESSION_KEY] = unicode( browser_lang) break
def is_enabled_language(lang): """ Return True if lang in settings LANGUAGES """ released_langs = released_languages() return lang in dict(released_langs)
def _verify_language_selector(self, content, selected_language): """ Verify that the language selector is present and correctly configured.""" # Verify the selector is included self.assertIn('footer-language-selector', content) # Verify the correct language is selected self.assertIn('<option value="{}" selected="selected">'.format(selected_language), content) # Verify the language choices for language in released_languages(): if language.code == selected_language: continue self.assertIn('<option value="{}">'.format(language.code), content)
def test_released_languages(self, default_lang, languages, dark_lang_released, expected_languages): """ Tests for the released languages. """ with override_settings(LANGUAGES=languages, LANGUAGE_CODE=default_lang): user = User() user.save() DarkLangConfig(released_languages=', '.join(dark_lang_released), changed_by=user, enabled=True).save() released_languages = language_api.released_languages() self.assertEqual(released_languages, expected_languages)
def test_released_languages(self, default_lang, languages, dark_lang_released, expected_languages): """ Tests for the released languages. """ with override_settings(LANGUAGES=languages, LANGUAGE_CODE=default_lang): user = User() user.save() DarkLangConfig( released_languages=', '.join(dark_lang_released), changed_by=user, enabled=True ).save() released_languages = language_api.released_languages() self.assertEqual(released_languages, expected_languages)
def _verify_language_selector(self, response, selected_language): """ Verify that the language selector is present and correctly configured.""" # Verify the selector is included content = response.content.decode(response.charset) assert 'footer-language-selector' in content # Verify the correct language is selected assert f'<option value="{selected_language}" selected="selected">' in content # Verify the language choices for language in released_languages(): if language.code == selected_language: continue assert f'<option value="{language.code}">' in content
def process_request(self, request): languages = released_languages() system_released_languages = [seq[0] for seq in languages] # If the user is logged in, check for their language preference if request.user.is_authenticated(): # Get the user's language preference user_pref = get_user_preference(request.user, LANGUAGE_KEY) # Set it to the LANGUAGE_SESSION_KEY (Django-specific session setting governing language pref) if user_pref: if user_pref in system_released_languages: request.session[LANGUAGE_SESSION_KEY] = user_pref else: delete_user_preference(request.user, LANGUAGE_KEY) else: check = False current_microsite = configuration_helpers.get_value( 'language_code') if current_microsite or current_microsite != '': Language = namedtuple('Language', 'code name') request.session[LANGUAGE_SESSION_KEY] = unicode( current_microsite) check = True if not check: preferred_language = request.META.get('HTTP_ACCEPT_LANGUAGE', '') lang_headers = [ seq[0] for seq in parse_accept_lang_header(preferred_language) ] prefixes = [ prefix.split("-")[0] for prefix in system_released_languages ] # Setting the session language to the browser language, if it is supported. for browser_lang in lang_headers: if browser_lang in system_released_languages: pass elif browser_lang in prefixes: browser_lang = system_released_languages[ prefixes.index(browser_lang)] else: continue if request.session.get(LANGUAGE_SESSION_KEY, None) is None: request.session[LANGUAGE_SESSION_KEY] = unicode( browser_lang) break
def _get_closest_released_language(target): """ Return the language code that most closely matches the target and is fully supported by the LMS, or None if there are no fully supported languages that match the target. """ match = None languages = released_languages() for language in languages: if language.code == target: match = language.code break elif (match is None) and (language.code[:2] == target[:2]): match = language.code return match
def test_beta_languages(self): """ Tests for the beta languages. """ with override_settings(LANGUAGES=[EN, ES_419, LT_LT], LANGUAGE_CODE='en'): user = User() user.save() DarkLangConfig(released_languages='es-419', changed_by=user, enabled=True, beta_languages='lt-lt', enable_beta_languages=True).save() released_languages = language_api.released_languages() expected_languages = [EN, ES_419, LT_LT] self.assertEqual(released_languages, expected_languages)
def process_request(self, request): """ If a user's UserPreference contains a language preference, use the user's preference. """ languages = released_languages() system_released_languages = [seq[0] for seq in languages] # If the user is logged in, check for their language preference if request.user.is_authenticated(): # Get the user's language preference user_pref = get_user_preference(request.user, LANGUAGE_KEY) # Set it to the LANGUAGE_SESSION_KEY (Django-specific session setting governing language pref) if user_pref: if user_pref in system_released_languages: request.session[LANGUAGE_SESSION_KEY] = user_pref else: delete_user_preference(request.user, LANGUAGE_KEY)
def test_beta_languages(self): """ Tests for the beta languages. """ with override_settings(LANGUAGES=[EN, ES_419, LT_LT], LANGUAGE_CODE='en'): user = User() user.save() DarkLangConfig( released_languages='es-419', changed_by=user, enabled=True, beta_languages='lt-lt', enable_beta_languages=True ).save() released_languages = language_api.released_languages() expected_languages = [EN, ES_419, LT_LT] self.assertEqual(released_languages, expected_languages)
def render_body(context,online_help_token,**pageargs): __M_caller = context.caller_stack._push_frame() try: __M_locals = __M_dict_builtin(pageargs=pageargs,online_help_token=online_help_token) csrf_token = context.get('csrf_token', UNDEFINED) context_course = context.get('context_course', UNDEFINED) context_library = context.get('context_library', UNDEFINED) current_url = context.get('current_url', UNDEFINED) get_online_help_info = context.get('get_online_help_info', UNDEFINED) dict = context.get('dict', UNDEFINED) len = context.get('len', UNDEFINED) unicode = context.get('unicode', UNDEFINED) LANGUAGE_CODE = context.get('LANGUAGE_CODE', UNDEFINED) static = _mako_get_namespace(context, 'static') user = context.get('user', UNDEFINED) __M_writer = context.writer() __M_writer(u'\n') __M_writer(u'\n') __M_writer(u'\n<div class="wrapper-header wrapper" id="view-top">\n <header class="primary" role="banner">\n\n <div class="wrapper wrapper-l">\n <h1 class="branding">\n <a class="brand-link" href="/">\n <img class="brand-image" src="') __M_writer(filters.html_escape(filters.decode.utf8(static.url('images/studio-logo.png')))) __M_writer(u'" alt="') __M_writer(filters.html_escape(filters.decode.utf8(settings.STUDIO_NAME))) __M_writer(u'" />\n </a>\n </h1>\n\n') if context_course: __M_writer(u' ') course_key = context_course.id index_url = reverse('course_handler', kwargs={'course_key_string': unicode(course_key)}) course_team_url = reverse('course_team_handler', kwargs={'course_key_string': unicode(course_key)}) assets_url = reverse('assets_handler', kwargs={'course_key_string': unicode(course_key)}) textbooks_url = reverse('textbooks_list_handler', kwargs={'course_key_string': unicode(course_key)}) videos_url = reverse('videos_handler', kwargs={'course_key_string': unicode(course_key)}) import_url = reverse('import_handler', kwargs={'course_key_string': unicode(course_key)}) course_info_url = reverse('course_info_handler', kwargs={'course_key_string': unicode(course_key)}) export_url = reverse('export_handler', kwargs={'course_key_string': unicode(course_key)}) settings_url = reverse('settings_handler', kwargs={'course_key_string': unicode(course_key)}) grading_url = reverse('grading_handler', kwargs={'course_key_string': unicode(course_key)}) advanced_settings_url = reverse('advanced_settings_handler', kwargs={'course_key_string': unicode(course_key)}) tabs_url = reverse('tabs_handler', kwargs={'course_key_string': unicode(course_key)}) certificates_url = '' if settings.FEATURES.get("CERTIFICATES_HTML_VIEW") and context_course.cert_html_view_enabled: certificates_url = reverse('certificates_list_handler', kwargs={'course_key_string': unicode(course_key)}) checklists_url = reverse('checklists_handler', kwargs={'course_key_string': unicode(course_key)}) __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 ['assets_url','index_url','import_url','course_team_url','course_key','export_url','settings_url','textbooks_url','course_info_url','certificates_url','checklists_url','videos_url','grading_url','advanced_settings_url','tabs_url'] if __M_key in __M_locals_builtin_stored])) __M_writer(u'\n <h2 class="info-course">\n <span class="sr">') __M_writer(filters.html_escape(filters.decode.utf8(_("Current Course:")))) __M_writer(u'</span>\n <a class="course-link" href="') __M_writer(filters.html_escape(filters.decode.utf8(index_url))) __M_writer(u'">\n <span class="course-org">') __M_writer(filters.html_escape(filters.decode.utf8(context_course.display_org_with_default))) __M_writer(u'</span><span class="course-number">') __M_writer(filters.html_escape(filters.decode.utf8(context_course.display_number_with_default))) __M_writer(u'</span>\n <span class="course-title" title="') __M_writer(filters.html_escape(filters.decode.utf8(context_course.display_name_with_default))) __M_writer(u'">') __M_writer(filters.html_escape(filters.decode.utf8(context_course.display_name_with_default))) __M_writer(u'</span>\n </a>\n </h2>\n\n <nav class="nav-course nav-dd ui-left" aria-label="') __M_writer(filters.html_escape(filters.decode.utf8(_('Course')))) __M_writer(u'">\n <h2 class="sr">') __M_writer(filters.html_escape(filters.decode.utf8(_("Course Navigation")))) __M_writer(u'</h2>\n <ol>\n <li class="nav-item nav-course-courseware">\n <h3 class="title"><span class="label"><span class="label-prefix sr">') __M_writer(filters.html_escape(filters.decode.utf8(_("Course")))) __M_writer(u' </span>') __M_writer(filters.html_escape(filters.decode.utf8(_("Content")))) __M_writer(u'</span> <span class="icon fa fa-caret-down ui-toggle-dd" aria-hidden="true"></span></h3>\n\n <div class="wrapper wrapper-nav-sub">\n <div class="nav-sub">\n <ul>\n <li class="nav-item nav-course-courseware-outline">\n <a href="') __M_writer(filters.html_escape(filters.decode.utf8(index_url))) __M_writer(u'">') __M_writer(filters.html_escape(filters.decode.utf8(_("Outline")))) __M_writer(u'</a>\n </li>\n <li class="nav-item nav-course-courseware-updates">\n <a href="') __M_writer(filters.html_escape(filters.decode.utf8(course_info_url))) __M_writer(u'">') __M_writer(filters.html_escape(filters.decode.utf8(_("Updates")))) __M_writer(u'</a>\n </li>\n <li class="nav-item nav-course-courseware-pages">\n <a href="') __M_writer(filters.html_escape(filters.decode.utf8(tabs_url))) __M_writer(u'">') __M_writer(filters.html_escape(filters.decode.utf8(_("Pages")))) __M_writer(u'</a>\n </li>\n <li class="nav-item nav-course-courseware-uploads">\n <a href="') __M_writer(filters.html_escape(filters.decode.utf8(assets_url))) __M_writer(u'">') __M_writer(filters.html_escape(filters.decode.utf8(_("Files & Uploads")))) __M_writer(u'</a>\n </li>\n <li class="nav-item nav-course-courseware-textbooks">\n <a href="') __M_writer(filters.html_escape(filters.decode.utf8(textbooks_url))) __M_writer(u'">') __M_writer(filters.html_escape(filters.decode.utf8(_("Textbooks")))) __M_writer(u'</a>\n </li>\n') if context_course.video_pipeline_configured: __M_writer(u' <li class="nav-item nav-course-courseware-videos">\n <a href="') __M_writer(filters.html_escape(filters.decode.utf8(videos_url))) __M_writer(u'">') __M_writer(filters.html_escape(filters.decode.utf8(_("Video Uploads")))) __M_writer(u'</a>\n </li>\n') __M_writer(u' </ul>\n </div>\n </div>\n </li>\n\n <li class="nav-item nav-course-settings">\n <h3 class="title"><span class="label"><span class="label-prefix sr">') __M_writer(filters.html_escape(filters.decode.utf8(_("Course")))) __M_writer(u' </span>') __M_writer(filters.html_escape(filters.decode.utf8(_("Settings")))) __M_writer(u'</span> <span class="icon fa fa-caret-down ui-toggle-dd" aria-hidden="true"></span></h3>\n\n <div class="wrapper wrapper-nav-sub">\n <div class="nav-sub">\n <ul>\n <li class="nav-item nav-course-settings-schedule">\n <a href="') __M_writer(filters.html_escape(filters.decode.utf8(settings_url))) __M_writer(u'">') __M_writer(filters.html_escape(filters.decode.utf8(_("Schedule & Details")))) __M_writer(u'</a>\n </li>\n <li class="nav-item nav-course-settings-grading">\n <a href="') __M_writer(filters.html_escape(filters.decode.utf8(grading_url))) __M_writer(u'">') __M_writer(filters.html_escape(filters.decode.utf8(_("Grading")))) __M_writer(u'</a>\n </li>\n <li class="nav-item nav-course-settings-team">\n <a href="') __M_writer(filters.html_escape(filters.decode.utf8(course_team_url))) __M_writer(u'">') __M_writer(filters.html_escape(filters.decode.utf8(_("Course Team")))) __M_writer(u'</a>\n </li>\n <li class="nav-item nav-course-settings-group-configurations">\n <a href="') __M_writer(filters.html_escape(filters.decode.utf8(reverse('group_configurations_list_handler', kwargs={'course_key_string': unicode(course_key)})))) __M_writer(u'">') __M_writer(filters.html_escape(filters.decode.utf8(_("Group Configurations")))) __M_writer(u'</a>\n </li>\n <li class="nav-item nav-course-settings-advanced">\n <a href="') __M_writer(filters.html_escape(filters.decode.utf8(advanced_settings_url))) __M_writer(u'">') __M_writer(filters.html_escape(filters.decode.utf8(_("Advanced Settings")))) __M_writer(u'</a>\n </li>\n') if certificates_url: __M_writer(u' <li class="nav-item nav-course-settings-certificates">\n <a href="') __M_writer(filters.html_escape(filters.decode.utf8(certificates_url))) __M_writer(u'">') __M_writer(filters.html_escape(filters.decode.utf8(_("Certificates")))) __M_writer(u'</a>\n </li>\n') __M_writer(u' </ul>\n </div>\n </div>\n </li>\n\n <li class="nav-item nav-course-tools">\n <h3 class="title"><span class="label">') __M_writer(filters.html_escape(filters.decode.utf8(_("Tools")))) __M_writer(u'</span> <span class="icon fa fa-caret-down ui-toggle-dd" aria-hidden="true"></span></h3>\n <div class="wrapper wrapper-nav-sub">\n <div class="nav-sub">\n <ul>\n <li class="nav-item nav-course-tools-import">\n <a href="') __M_writer(filters.html_escape(filters.decode.utf8(import_url))) __M_writer(u'">') __M_writer(filters.html_escape(filters.decode.utf8(_("Import")))) __M_writer(u'</a>\n </li>\n <li class="nav-item nav-course-tools-export">\n <a href="') __M_writer(filters.html_escape(filters.decode.utf8(export_url))) __M_writer(u'">') __M_writer(filters.html_escape(filters.decode.utf8(_("Export")))) __M_writer(u'</a>\n </li>\n') if settings.FEATURES.get('ENABLE_EXPORT_GIT') and context_course.giturl: __M_writer(u' <li class="nav-item nav-course-tools-export-git">\n <a href="') __M_writer(filters.html_escape(filters.decode.utf8(reverse('export_git', kwargs=dict(course_key_string=unicode(course_key)))))) __M_writer(u'">') __M_writer(filters.html_escape(filters.decode.utf8(_("Export to Git")))) __M_writer(u'</a>\n </li>\n') __M_writer(u' <li class="nav-item nav-course-tools-checklists">\n <a href="') __M_writer(filters.html_escape(filters.decode.utf8(checklists_url))) __M_writer(u'">') __M_writer(filters.html_escape(filters.decode.utf8(_("Checklists")))) __M_writer(u'</a>\n </li>\n </ul>\n </div>\n </div>\n </li>\n </ol>\n </nav>\n') elif context_library: __M_writer(u' ') library_key = context_library.location.course_key index_url = reverse('library_handler', kwargs={'library_key_string': unicode(library_key)}) import_url = reverse('import_handler', kwargs={'course_key_string': unicode(library_key)}) lib_users_url = reverse('manage_library_users', kwargs={'library_key_string': unicode(library_key)}) export_url = reverse('export_handler', kwargs={'course_key_string': unicode(library_key)}) __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 ['library_key','import_url','lib_users_url','export_url','index_url'] if __M_key in __M_locals_builtin_stored])) __M_writer(u'\n <h2 class="info-course">\n <span class="sr">') __M_writer(filters.html_escape(filters.decode.utf8(_("Current Library:")))) __M_writer(u'</span>\n <a class="course-link" href="') __M_writer(filters.html_escape(filters.decode.utf8(index_url))) __M_writer(u'">\n <span class="course-org">') __M_writer(filters.html_escape(filters.decode.utf8(context_library.display_org_with_default))) __M_writer(u'</span><span class="course-number">') __M_writer(filters.html_escape(filters.decode.utf8(context_library.display_number_with_default))) __M_writer(u'</span>\n <span class="course-title" title="') __M_writer(filters.html_escape(filters.decode.utf8(context_library.display_name_with_default))) __M_writer(u'">') __M_writer(filters.html_escape(filters.decode.utf8(context_library.display_name_with_default))) __M_writer(u'</span>\n </a>\n </h2>\n\n <nav class="nav-course nav-dd ui-left" aria-label="') __M_writer(filters.html_escape(filters.decode.utf8(_('Course')))) __M_writer(u'">\n <h2 class="sr">') __M_writer(filters.html_escape(filters.decode.utf8(_("Course Navigation")))) __M_writer(u'</h2>\n <ol>\n\n <li class="nav-item nav-library-settings">\n <h3 class="title"><span class="label"><span class="label-prefix sr">') __M_writer(filters.html_escape(filters.decode.utf8(_("Library")))) __M_writer(u' </span>') __M_writer(filters.html_escape(filters.decode.utf8(_("Settings")))) __M_writer(u'</span> <span class="icon fa fa-caret-down ui-toggle-dd" aria-hidden="true"></span></h3>\n <div class="wrapper wrapper-nav-sub">\n <div class="nav-sub">\n <ul>\n <li class="nav-item nav-library-settings-team">\n <a href="') __M_writer(filters.html_escape(filters.decode.utf8(lib_users_url))) __M_writer(u'">') __M_writer(filters.html_escape(filters.decode.utf8(_("User Access")))) __M_writer(u'</a>\n </li>\n </ul>\n </div>\n </div>\n </li>\n <li class="nav-item nav-course-tools">\n <h3 class="title"><span class="label">') __M_writer(filters.html_escape(filters.decode.utf8(_("Tools")))) __M_writer(u'</span> <span class="icon fa fa-caret-down ui-toggle-dd" aria-hidden="true"></span></h3>\n\n <div class="wrapper wrapper-nav-sub">\n <div class="nav-sub">\n <ul>\n <li class="nav-item nav-course-tools-import">\n <a href="') __M_writer(filters.html_escape(filters.decode.utf8(import_url))) __M_writer(u'">') __M_writer(filters.html_escape(filters.decode.utf8(_("Import")))) __M_writer(u'</a>\n </li>\n <li class="nav-item nav-course-tools-export">\n <a href="') __M_writer(filters.html_escape(filters.decode.utf8(export_url))) __M_writer(u'">') __M_writer(filters.html_escape(filters.decode.utf8(_("Export")))) __M_writer(u'</a>\n </li>\n </ul>\n </div>\n </div>\n </li>\n </ol>\n </nav>\n') __M_writer(u' </div>\n\n <div class="wrapper wrapper-r">\n') if header_language_selector_is_enabled(): __M_writer(u' ') languages = released_languages() __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 ['languages'] if __M_key in __M_locals_builtin_stored])) __M_writer(u'\n') if len(languages) > 1: __M_writer(u' <nav class="user-language-selector" aria-label="') __M_writer(filters.html_escape(filters.decode.utf8(_('Language preference')))) __M_writer(u'">\n <form action="/i18n/setlang/" method="post" class="settings-language-form" id="language-settings-form">\n <input type="hidden" id="csrf_token" name="csrfmiddlewaretoken" value="') __M_writer(filters.html_escape(filters.decode.utf8(csrf_token))) __M_writer(u'">\n') if user.is_authenticated: __M_writer(u' <input title="preference api" type="hidden" id="preference-api-url" class="url-endpoint" value="') __M_writer(filters.html_escape(filters.decode.utf8(reverse('preferences_api', kwargs={'username': user.username})))) __M_writer(u'" data-user-is-authenticated="true">\n') else: __M_writer(u' <input title="session update url" type="hidden" id="update-session-url" class="url-endpoint" value="') __M_writer(filters.html_escape(filters.decode.utf8(reverse('session_language')))) __M_writer(u'" data-user-is-authenticated="false">\n') __M_writer(u' <label><span class="sr">') __M_writer(filters.html_escape(filters.decode.utf8(_("Choose Language")))) __M_writer(u'</span>\n <select class="input select language-selector" id="settings-language-value" name="language">\n') for language in languages: if language[0] == LANGUAGE_CODE: __M_writer(u' <option value="') __M_writer(filters.html_escape(filters.decode.utf8(language[0]))) __M_writer(u'" selected="selected">') __M_writer(filters.html_escape(filters.decode.utf8(language[1]))) __M_writer(u'</option>\n') else: __M_writer(u' <option value="') __M_writer(filters.html_escape(filters.decode.utf8(language[0]))) __M_writer(u'" >') __M_writer(filters.html_escape(filters.decode.utf8(language[1]))) __M_writer(u'</option>\n') __M_writer(u' </select>\n </label>\n </form>\n </nav>\n') if user.is_authenticated: __M_writer(u' <nav class="nav-account nav-is-signedin nav-dd ui-right" aria-label="') __M_writer(filters.html_escape(filters.decode.utf8(_('Account')))) __M_writer(u'">\n <h2 class="sr-only">') __M_writer(filters.html_escape(filters.decode.utf8(_("Account Navigation")))) __M_writer(u'</h2>\n <ol>\n <li class="nav-item nav-account-help">\n <h3 class="title"><span class="label"><a href="') __M_writer(filters.html_escape(filters.decode.utf8(get_online_help_info(online_help_token)['doc_url']))) __M_writer(u'" title="') __M_writer(filters.html_escape(filters.decode.utf8(_('Contextual Online Help')))) __M_writer(u'" target="_blank">') __M_writer(filters.html_escape(filters.decode.utf8(_("Help")))) __M_writer(u'</a></span></h3>\n </li>\n <li class="nav-item nav-account-user">\n ') runtime._include_file(context, u'user_dropdown.html', _template_uri, online_help_token=online_help_token) __M_writer(u'\n </li>\n </ol>\n </nav>\n\n') else: __M_writer(u' ') register_url = settings.LMS_ROOT_URL + '/register' __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 ['register_url'] if __M_key in __M_locals_builtin_stored])) __M_writer(u'\n <nav class="nav-not-signedin nav-pitch" aria-label="') __M_writer(filters.html_escape(filters.decode.utf8(_('Account')))) __M_writer(u'">\n <h2 class="sr-only">') __M_writer(filters.html_escape(filters.decode.utf8(_("Account Navigation")))) __M_writer(u'</h2>\n <ol>\n <li class="nav-item nav-not-signedin-help">\n <a href="') __M_writer(filters.html_escape(filters.decode.utf8(get_online_help_info(online_help_token)['doc_url']))) __M_writer(u'" title="') __M_writer(filters.html_escape(filters.decode.utf8(_('Contextual Online Help')))) __M_writer(u'" target="_blank">') __M_writer(filters.html_escape(filters.decode.utf8(_("Help")))) __M_writer(u'</a>\n </li>\n') if static.get_value('ALLOW_PUBLIC_ACCOUNT_CREATION', settings.FEATURES.get('ALLOW_PUBLIC_ACCOUNT_CREATION')): __M_writer(u' <li class="nav-item nav-not-signedin-signup">\n <a class="action action-signup" href="') __M_writer(filters.html_escape(filters.decode.utf8(register_url))) __M_writer(u'?next=') __M_writer(filters.html_escape(filters.decode.utf8(current_url))) __M_writer(u'">') __M_writer(filters.html_escape(filters.decode.utf8(_("Sign Up")))) __M_writer(u'</a>\n </li>\n') __M_writer(u' <li class="nav-item nav-not-signedin-signin">\n <a class="action action-signin" href="') __M_writer(filters.html_escape(filters.decode.utf8(settings.FRONTEND_LOGIN_URL))) __M_writer(u'?next=') __M_writer(filters.html_escape(filters.decode.utf8(current_url))) __M_writer(u'">') __M_writer(filters.html_escape(filters.decode.utf8(_("Sign In")))) __M_writer(u'</a>\n </li>\n </ol>\n </nav>\n') __M_writer(u' </div>\n </header>\n</div>\n') return '' finally: context.caller_stack._pop_frame()
def account_settings_context(request): """ Context for the account settings page. Args: request: The request object. Returns: dict """ user = request.user year_of_birth_options = [(unicode(year), unicode(year)) for year in UserProfile.VALID_YEARS] try: user_orders = get_user_orders(user) except: # pylint: disable=bare-except log.exception('Error fetching order history from Otto.') # Return empty order list as account settings page expect a list and # it will be broken if exception raised user_orders = [] context = { 'auth': {}, 'duplicate_provider': None, 'nav_hidden': True, 'fields': { 'country': { 'options': list(countries), }, 'gender': { 'options': [(choice[0], _(choice[1])) for choice in UserProfile.GENDER_CHOICES], # pylint: disable=translation-of-non-string }, 'language': { 'options': released_languages(), }, 'level_of_education': { 'options': [(choice[0], _(choice[1])) for choice in UserProfile.LEVEL_OF_EDUCATION_CHOICES], # pylint: disable=translation-of-non-string }, 'password': { 'url': reverse('password_reset'), }, 'year_of_birth': { 'options': year_of_birth_options, }, 'preferred_language': { 'options': all_languages(), }, 'time_zone': { 'options': TIME_ZONE_CHOICES, } }, 'platform_name': configuration_helpers.get_value('PLATFORM_NAME', settings.PLATFORM_NAME), 'password_reset_support_link': configuration_helpers.get_value('PASSWORD_RESET_SUPPORT_LINK', settings.PASSWORD_RESET_SUPPORT_LINK) or settings.SUPPORT_SITE_LINK, 'user_accounts_api_url': reverse("accounts_api", kwargs={'username': user.username}), 'user_preferences_api_url': reverse('preferences_api', kwargs={'username': user.username}), 'disable_courseware_js': True, 'show_program_listing': ProgramsApiConfig.is_enabled(), 'show_dashboard_tabs': True, 'order_history': user_orders, 'enable_account_deletion': configuration_helpers.get_value( 'ENABLE_ACCOUNT_DELETION', settings.FEATURES.get('ENABLE_ACCOUNT_DELETION', False)), 'extended_profile_fields': _get_extended_profile_fields(), } enterprise_customer = get_enterprise_customer_for_learner( site=request.site, user=request.user) update_account_settings_context_for_enterprise(context, enterprise_customer) if third_party_auth.is_enabled(): # If the account on the third party provider is already connected with another edX account, # we display a message to the user. context['duplicate_provider'] = pipeline.get_duplicate_provider( messages.get_messages(request)) auth_states = pipeline.get_provider_user_states(user) context['auth']['providers'] = [ { 'id': state.provider.provider_id, 'name': state.provider.name, # The name of the provider e.g. Facebook 'connected': state. has_account, # Whether the user's edX account is connected with the provider. # If the user is not connected, they should be directed to this page to authenticate # with the particular provider, as long as the provider supports initiating a login. 'connect_url': pipeline.get_login_url( state.provider.provider_id, pipeline.AUTH_ENTRY_ACCOUNT_SETTINGS, # The url the user should be directed to after the auth process has completed. redirect_url=reverse('account_settings'), ), 'accepts_logins': state.provider.accepts_logins, # If the user is connected, sending a POST request to this url removes the connection # information for this provider from their edX account. 'disconnect_url': pipeline.get_disconnect_url(state.provider.provider_id, state.association_id), # We only want to include providers if they are either currently available to be logged # in with, or if the user is already authenticated with them. } for state in auth_states if state.provider.display_for_login or state.has_account ] return context
def render_body(context, online_help_token, use_cookie_banner=False, **pageargs): __M_caller = context.caller_stack._push_frame() try: __M_locals = __M_dict_builtin(use_cookie_banner=use_cookie_banner, pageargs=pageargs, online_help_token=online_help_token) _import_ns = {} _mako_get_namespace(context, '__anon_0x7f8feee166d0')._populate( _import_ns, [u'login_query']) csrf_token = _import_ns.get('csrf_token', context.get('csrf_token', UNDEFINED)) marketing_link = _import_ns.get( 'marketing_link', context.get('marketing_link', UNDEFINED)) settings = _import_ns.get('settings', context.get('settings', UNDEFINED)) request = _import_ns.get('request', context.get('request', UNDEFINED)) show_program_listing = _import_ns.get( 'show_program_listing', context.get('show_program_listing', UNDEFINED)) def navigation_top(): return render_navigation_top(context._locals(__M_locals)) def navigation_other_global_links(): return render_navigation_other_global_links( context._locals(__M_locals)) len = _import_ns.get('len', context.get('len', UNDEFINED)) course = _import_ns.get('course', context.get('course', UNDEFINED)) def js_extra(): return render_js_extra(context._locals(__M_locals)) static = _mako_get_namespace(context, 'static') user = _import_ns.get('user', context.get('user', UNDEFINED)) LANGUAGE_CODE = _import_ns.get('LANGUAGE_CODE', context.get('LANGUAGE_CODE', UNDEFINED)) uses_pattern_library = _import_ns.get( 'uses_pattern_library', context.get('uses_pattern_library', UNDEFINED)) def navigation_global_links_authenticated(): return render_navigation_global_links_authenticated( context._locals(__M_locals)) __M_writer = context.writer() __M_writer(u'\n') __M_writer(u'\n\n') __M_writer(u'\n') __M_writer(u'\n') __M_writer(u'\n\n') if 'parent' not in context._data or not hasattr( context._data['parent'], 'navigation_top'): context['self'].navigation_top(**pageargs) __M_writer(u'\n\n') if uses_pattern_library: __M_writer(u' ') if 'parent' not in context._data or not hasattr( context._data['parent'], 'js_extra'): context['self'].js_extra(**pageargs) __M_writer(u'\n') __M_writer(u'\n<header class="global-header theme-header ') __M_writer( filters.html_escape(filters.decode.utf8('slim' if course else ''))) __M_writer( u'">\n <div class="theme-header-info">\n <div class="theme-header-info_contact">\n <span class="theme-header-info_text">Have any question?</span>\n <span class="theme-header-info_phone"><i class="fa fa-phone" aria-hidden="true"></i> +1 857 4533328</span>\n <a class="theme-header-info_mail" href="mailto:[email protected]"><i class="fa fa-envelope" aria-hidden="true"></i>[email protected]</a>\n </div>\n <div class="theme-header-info_social">\n <span class="theme-header-info_text">Find us in social network</span>\n <ul class="social-list">\n <li class="social-list_item"><a class="social-list_link" href="https://twitter.com/raccoongangcom" target="_blank"><i class="fa fa-twitter" aria-hidden="true"></i></a></li>\n <li class="social-list_item"><a class="social-list_link" href="https://www.facebook.com/raccoongangco" target="_blank"><i class="fa fa-facebook" aria-hidden="true"></i></a></li>\n <li class="social-list_item"><a class="social-list_link" href="https://www.linkedin.com/company/raccoon-gang" target="_blank"><i class="fa fa-linkedin" aria-hidden="true"></i></a></li>\n </ul>\n </div>\n </div>\n <div class="holder">\n' ) if use_cookie_banner: __M_writer(u' ') __M_writer( filters.html_escape( filters.decode.utf8( static.renderReact(component="CookiePolicyBanner", id="cookie-policy-banner", props={})))) __M_writer(u'\n') __M_writer(u' <div class="main-header">\n ') runtime._include_file(context, u'navbar-logo-header.html', _template_uri, online_help_token=online_help_token) __M_writer(u'\n') if user.is_authenticated: __M_writer(u' ') runtime._include_file(context, u'navbar-authenticated.html', _template_uri, online_help_token=online_help_token) __M_writer(u'\n') else: __M_writer(u' ') runtime._include_file(context, u'navbar-not-authenticated.html', _template_uri, online_help_token=online_help_token) __M_writer(u'\n') __M_writer( u' </div>\n <div class="mobile-menu hidden" aria-label=' ) __M_writer(filters.html_escape(filters.decode.utf8(_("More Options")))) __M_writer( u' role="menu" id="mobile-menu"></div>\n </div>\n\n <div class="theme-main-nav">\n <div class="theme-main-nav_opener">\n <span class="line"></span>\n <span class="line"></span>\n <span class="line"></span>\n <span class="line"></span>\n </div>\n <div class="theme-main-nav_logo">\n <a href="' ) __M_writer( filters.html_escape(filters.decode.utf8(marketing_link('ROOT')))) __M_writer( u'">\n <span class="theme-nav-wrapper_logo-holder theme-nav-wrapper_logo-holder_small">\n <img src="/static/' ) __M_writer( filters.html_escape( filters.decode.utf8( settings.FEATURES.get( 'MARVEL_YELLOW_DEFAULT_HAWTHORN_SITE_THEME', settings.DEFAULT_SITE_THEME)))) __M_writer( u'/images/logo.png" alt="logo">\n </span>\n </a>\n </div>\n <nav class="theme-main-nav_holder">\n <ul class="theme-main-nav_list">\n <li class="theme-main-nav_item"><a href="/about" class="theme-main-nav_link">' ) __M_writer( filters.html_escape(filters.decode.utf8( _("About The CintanaTech")))) __M_writer( u'</a></li>\n <li class="theme-main-nav_item"><a href="/blog" class="theme-main-nav_link">' ) __M_writer(filters.html_escape(filters.decode.utf8(_("Blog")))) __M_writer( u'</a></li>\n <li class="theme-main-nav_item"><a href="/contact" class="theme-main-nav_link">' ) __M_writer(filters.html_escape(filters.decode.utf8(_("Contact Us")))) __M_writer(u'</a></li>\n') if user.is_authenticated(): __M_writer(u' ') if 'parent' not in context._data or not hasattr( context._data['parent'], 'navigation_global_links_authenticated'): context['self'].navigation_global_links_authenticated( **pageargs) __M_writer(u'\n') else: __M_writer(u' ') if 'parent' not in context._data or not hasattr( context._data['parent'], 'navigation_other_global_links'): context['self'].navigation_other_global_links(**pageargs) __M_writer(u'\n') __M_writer( u' </ul>\n </nav>\n </div>\n</header>\n\n<script>\n $(".theme-main-nav_opener").on("click", function open(){\n if ($(this).parent().hasClass("theme-main-nav__open")){\n $(this).parent().removeClass("theme-main-nav__open");\n } else {\n $(this).parent().addClass("theme-main-nav__open");\n }\n });\n</script>\n\n' ) if course: __M_writer( u'<!--[if lte IE 9]>\n<div class="ie-banner" aria-hidden="true">' ) __M_writer( filters.html_escape( filters.decode.utf8( Text( _('{begin_strong}Warning:{end_strong} Your browser is not fully supported. We strongly recommend using {chrome_link} or {ff_link}.' )). format( begin_strong=HTML('<strong>'), end_strong=HTML('</strong>'), chrome_link=HTML( '<a href="https://www.google.com/chrome" target="_blank">Chrome</a>' ), ff_link=HTML( '<a href="http://www.mozilla.org/firefox" target="_blank">Firefox</a>' ), )))) __M_writer(u'</div>\n<![endif]-->\n') __M_writer(u'\n') if settings.FEATURES.get('ENABLE_COOKIE_CONSENT', False): __M_writer(u' ') runtime._include_file(context, u'../widgets/cookie-consent.html', _template_uri) __M_writer(u'\n') __M_writer(u'\n') if header_language_selector_is_enabled(): __M_writer(u' ') languages = released_languages() __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 ['languages'] if __M_key in __M_locals_builtin_stored])) __M_writer(u'\n') if len(languages) > 1: __M_writer( u' <form action="/i18n/setlang/" method="post" class="settings-language-form" id="language-settings-form">\n <input type="hidden" id="csrf_token" name="csrfmiddlewaretoken" value="' ) __M_writer(filters.html_escape( filters.decode.utf8(csrf_token))) __M_writer(u'">\n') if user.is_authenticated: __M_writer( u' <input title="preference api" type="hidden" class="url-endpoint" value="' ) __M_writer( filters.html_escape( filters.decode.utf8( reverse('preferences_api', kwargs={'username': user.username})))) __M_writer(u'" data-user-is-authenticated="true">\n') else: __M_writer( u' <input title="session update url" type="hidden" class="url-endpoint" value="' ) __M_writer( filters.html_escape( filters.decode.utf8(reverse('session_language')))) __M_writer(u'" data-user-is-authenticated="false">\n') __M_writer(u' <label><span class="sr">') __M_writer( filters.html_escape( filters.decode.utf8(_("Choose Language")))) __M_writer( u'</span>\n <select class="input select language-selector" id="settings-language-value" name="language">\n' ) for language in languages: if language[0] == LANGUAGE_CODE: __M_writer(u' <option value="') __M_writer( filters.html_escape( filters.decode.utf8(language[0]))) __M_writer(u'" selected="selected">') __M_writer( filters.html_escape( filters.decode.utf8(language[1]))) __M_writer(u'</option>\n') else: __M_writer(u' <option value="') __M_writer( filters.html_escape( filters.decode.utf8(language[0]))) __M_writer(u'" >') __M_writer( filters.html_escape( filters.decode.utf8(language[1]))) __M_writer(u'</option>\n') __M_writer( u' </select>\n </label>\n </form>\n' ) return '' finally: context.caller_stack._pop_frame()
def footer(request): """Retrieve the branded footer. This end-point provides information about the site footer, allowing for consistent display of the footer across other sites (for example, on the marketing site and blog). It can be used in one of two ways: 1) A client renders the footer from a JSON description. 2) A browser loads an HTML representation of the footer and injects it into the DOM. The HTML includes CSS and JavaScript links. In case (2), we assume that the following dependencies are included on the page: a) JQuery (same version as used in edx-platform) b) font-awesome (same version as used in edx-platform) c) Open Sans web fonts Example: Retrieving the footer as JSON GET /api/branding/v1/footer Accepts: application/json { "navigation_links": [ { "url": "http://example.com/about", "name": "about", "title": "About" }, # ... ], "social_links": [ { "url": "http://example.com/social", "name": "facebook", "icon-class": "fa-facebook-square", "title": "Facebook", "action": "Sign up on Facebook!" }, # ... ], "mobile_links": [ { "url": "http://example.com/android", "name": "google", "image": "http://example.com/google.png", "title": "Google" }, # ... ], "legal_links": [ { "url": "http://example.com/terms-of-service.html", "name": "terms_of_service", "title': "Terms of Service" }, # ... ], "openedx_link": { "url": "http://open.edx.org", "title": "Powered by Open edX", "image": "http://example.com/openedx.png" }, "logo_image": "http://example.com/static/images/logo.png", "copyright": "edX, Open edX and their respective logos are registered trademarks of edX Inc." } Example: Retrieving the footer as HTML GET /api/branding/v1/footer Accepts: text/html Example: Including the footer with the "Powered by Open edX" logo GET /api/branding/v1/footer?show-openedx-logo=1 Accepts: text/html Example: Retrieving the footer in a particular language GET /api/branding/v1/footer?language=en Accepts: text/html Example: Retrieving the footer with a language selector GET /api/branding/v1/footer?include-language-selector=1 Accepts: text/html Example: Retrieving the footer with all JS and CSS dependencies (for testing) GET /api/branding/v1/footer?include-dependencies=1 Accepts: text/html """ if not branding_api.is_enabled(): raise Http404 # Use the content type to decide what representation to serve accepts = request.META.get('HTTP_ACCEPT', '*/*') # Show the OpenEdX logo in the footer show_openedx_logo = bool(request.GET.get('show-openedx-logo', False)) # Include JS and CSS dependencies # This is useful for testing the end-point directly. include_dependencies = bool(request.GET.get('include-dependencies', False)) # Override the language if necessary language = request.GET.get('language', translation.get_language()) try: language = get_supported_language_variant(language) except LookupError: language = settings.LANGUAGE_CODE # Include a language selector include_language_selector = request.GET.get('include-language-selector', '') == '1' # Render the footer information based on the extension if 'text/html' in accepts or '*/*' in accepts: cache_params = { 'language': language, 'show_openedx_logo': show_openedx_logo, 'include_dependencies': include_dependencies } if include_language_selector: cache_params['language_selector_options'] = ','.join( sorted([lang.code for lang in released_languages()])) cache_key = u"branding.footer.{params}.html".format( params=six.moves.urllib.parse.urlencode(cache_params)) content = cache.get(cache_key) if content is None: with translation.override(language): content = _render_footer_html(request, show_openedx_logo, include_dependencies, include_language_selector, language) cache.set(cache_key, content, settings.FOOTER_CACHE_TIMEOUT) return HttpResponse(content, status=200, content_type="text/html; charset=utf-8") elif 'application/json' in accepts: cache_key = u"branding.footer.{params}.json".format( params=six.moves.urllib.parse.urlencode( { 'language': language, 'is_secure': request.is_secure(), })) footer_dict = cache.get(cache_key) if footer_dict is None: with translation.override(language): footer_dict = branding_api.get_footer( is_secure=request.is_secure()) cache.set(cache_key, footer_dict, settings.FOOTER_CACHE_TIMEOUT) return JsonResponse(footer_dict, 200, content_type="application/json; charset=utf-8") else: return HttpResponse(status=406)
def render_body(context, online_help_token, use_cookie_banner=False, **pageargs): __M_caller = context.caller_stack._push_frame() try: __M_locals = __M_dict_builtin(use_cookie_banner=use_cookie_banner, pageargs=pageargs, online_help_token=online_help_token) _import_ns = {} _mako_get_namespace(context, '__anon_0x7f4938752a50')._populate( _import_ns, [u'login_query']) csrf_token = _import_ns.get('csrf_token', context.get('csrf_token', UNDEFINED)) settings = _import_ns.get('settings', context.get('settings', UNDEFINED)) def navigation_top(): return render_navigation_top(context._locals(__M_locals)) len = _import_ns.get('len', context.get('len', UNDEFINED)) course = _import_ns.get('course', context.get('course', UNDEFINED)) def js_extra(): return render_js_extra(context._locals(__M_locals)) static = _mako_get_namespace(context, 'static') user = _import_ns.get('user', context.get('user', UNDEFINED)) LANGUAGE_CODE = _import_ns.get('LANGUAGE_CODE', context.get('LANGUAGE_CODE', UNDEFINED)) uses_pattern_library = _import_ns.get( 'uses_pattern_library', context.get('uses_pattern_library', UNDEFINED)) __M_writer = context.writer() __M_writer(u'\n') __M_writer(u'\n\n') __M_writer(u'\n') __M_writer(u'\n') __M_writer(u'\n\n') if 'parent' not in context._data or not hasattr( context._data['parent'], 'navigation_top'): context['self'].navigation_top(**pageargs) __M_writer(u'\n\n') if uses_pattern_library: __M_writer(u' ') if 'parent' not in context._data or not hasattr( context._data['parent'], 'js_extra'): context['self'].js_extra(**pageargs) __M_writer(u'\n') __M_writer(u'\n') unsupported_browser_alert_versions = configuration_helpers.get_value( 'UNSUPPORTED_BROWSER_ALERT_VERSIONS', settings.FEATURES.get('UNSUPPORTED_BROWSER_ALERT_VERSIONS')) __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 ['unsupported_browser_alert_versions'] if __M_key in __M_locals_builtin_stored ])) __M_writer(u'\n') if waffle.switch_is_active('enable_unsupported_browser_alert'): __M_writer(u' <script>\n var $buoop = {\n notify:') __M_writer(filters.decode.utf8(unsupported_browser_alert_versions)) __M_writer( u',\n api:5,\n reminder:0\n };\n function $buo_f() {\n var e = document.createElement("script");\n e.src = "//browser-update.org/update.min.js";\n document.body.appendChild(e);\n };\n try {document.addEventListener("DOMContentLoaded", $buo_f,false)}\n catch(e){window.attachEvent("onload", $buo_f)}\n </script>\n' ) __M_writer(u'\n<header class="global-header ') __M_writer( filters.html_escape(filters.decode.utf8('slim' if course else ''))) __M_writer(u'">\n') if use_cookie_banner: __M_writer(u' ') __M_writer( filters.html_escape( filters.decode.utf8( static.renderReact(component="CookiePolicyBanner", id="cookie-policy-banner", props={})))) __M_writer(u'\n') __M_writer(u' <div class="main-header">\n ') runtime._include_file(context, u'navbar-logo-header.html', _template_uri, online_help_token=online_help_token) __M_writer( u'\n <div class="hamburger-menu" role="button" aria-label=') __M_writer(filters.html_escape(filters.decode.utf8(_("Options Menu")))) __M_writer( u' aria-expanded="false" aria-controls="mobile-menu" tabindex="0">\n <span class="line"></span>\n <span class="line"></span>\n <span class="line"></span>\n <span class="line"></span>\n </div>\n' ) if user.is_authenticated: __M_writer(u' ') runtime._include_file(context, u'navbar-authenticated.html', _template_uri, online_help_token=online_help_token) __M_writer(u'\n') else: __M_writer(u' ') runtime._include_file(context, u'navbar-not-authenticated.html', _template_uri, online_help_token=online_help_token) __M_writer(u'\n') __M_writer( u' </div>\n <div class="mobile-menu hidden" aria-label=') __M_writer(filters.html_escape(filters.decode.utf8(_("More Options")))) __M_writer(u' role="menu" id="mobile-menu"></div>\n</header>\n\n') if course: __M_writer( u'<!--[if lte IE 9]>\n<div class="ie-banner" aria-hidden="true">' ) __M_writer( filters.html_escape( filters.decode.utf8( Text( _('{begin_strong}Warning:{end_strong} Your browser is not fully supported. We strongly recommend using {chrome_link} or {ff_link}.' )). format( begin_strong=HTML('<strong>'), end_strong=HTML('</strong>'), chrome_link=HTML( '<a href="https://www.google.com/chrome" target="_blank">Chrome</a>' ), ff_link=HTML( '<a href="http://www.mozilla.org/firefox" target="_blank">Firefox</a>' ), )))) __M_writer(u'</div>\n<![endif]-->\n') __M_writer(u'\n') if settings.FEATURES.get('ENABLE_COOKIE_CONSENT', False): __M_writer(u' ') runtime._include_file(context, u'../widgets/cookie-consent.html', _template_uri) __M_writer(u'\n') __M_writer(u'\n') if header_language_selector_is_enabled(): __M_writer(u' ') languages = released_languages() __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 ['languages'] if __M_key in __M_locals_builtin_stored])) __M_writer(u'\n') if len(languages) > 1: __M_writer( u' <form action="/i18n/setlang/" method="post" class="settings-language-form" id="language-settings-form">\n <input type="hidden" id="csrf_token" name="csrfmiddlewaretoken" value="' ) __M_writer(filters.html_escape( filters.decode.utf8(csrf_token))) __M_writer(u'">\n') if user.is_authenticated: __M_writer( u' <input title="preference api" type="hidden" class="url-endpoint" value="' ) __M_writer( filters.html_escape( filters.decode.utf8( reverse('preferences_api', kwargs={'username': user.username})))) __M_writer(u'" data-user-is-authenticated="true">\n') else: __M_writer( u' <input title="session update url" type="hidden" class="url-endpoint" value="' ) __M_writer( filters.html_escape( filters.decode.utf8(reverse('session_language')))) __M_writer(u'" data-user-is-authenticated="false">\n') __M_writer(u' <label><span class="sr">') __M_writer( filters.html_escape( filters.decode.utf8(_("Choose Language")))) __M_writer( u'</span>\n <select class="input select language-selector" id="settings-language-value" name="language">\n' ) for language in languages: if language[0] == LANGUAGE_CODE: __M_writer(u' <option value="') __M_writer( filters.html_escape( filters.decode.utf8(language[0]))) __M_writer(u'" selected="selected">') __M_writer( filters.html_escape( filters.decode.utf8(language[1]))) __M_writer(u'</option>\n') else: __M_writer(u' <option value="') __M_writer( filters.html_escape( filters.decode.utf8(language[0]))) __M_writer(u'" >') __M_writer( filters.html_escape( filters.decode.utf8(language[1]))) __M_writer(u'</option>\n') __M_writer( u' </select>\n </label>\n </form>\n' ) return '' finally: context.caller_stack._pop_frame()
def account_settings_context(request): """ Context for the account settings page. Args: request: The request object. Returns: dict """ user = request.user year_of_birth_options = [(unicode(year), unicode(year)) for year in UserProfile.VALID_YEARS] try: user_orders = get_user_orders(user) except: # pylint: disable=bare-except log.exception('Error fetching order history from Otto.') # Return empty order list as account settings page expect a list and # it will be broken if exception raised user_orders = [] context = { 'auth': {}, 'duplicate_provider': None, 'nav_hidden': True, 'fields': { 'country': { 'options': list(countries), }, 'gender': { 'options': [(choice[0], _(choice[1])) for choice in UserProfile.GENDER_CHOICES], # pylint: disable=translation-of-non-string }, 'language': { 'options': released_languages(), }, 'level_of_education': { 'options': [(choice[0], _(choice[1])) for choice in UserProfile.LEVEL_OF_EDUCATION_CHOICES], # pylint: disable=translation-of-non-string }, 'password': { 'url': reverse('password_reset'), }, 'year_of_birth': { 'options': year_of_birth_options, }, 'preferred_language': { 'options': all_languages(), }, 'time_zone': { 'options': TIME_ZONE_CHOICES, } }, 'is_shib_auth': False, 'platform_name': configuration_helpers.get_value('PLATFORM_NAME', settings.PLATFORM_NAME), 'user_accounts_api_url': reverse("accounts_api", kwargs={'username': user.username}), 'user_preferences_api_url': reverse('preferences_api', kwargs={'username': user.username}), 'disable_courseware_js': True, 'show_program_listing': ProgramsApiConfig.current().show_program_listing, 'order_history': user_orders } if third_party_auth.is_enabled(): # If the account on the third party provider is already connected with another edX account, # we display a message to the user. context['duplicate_provider'] = pipeline.get_duplicate_provider(messages.get_messages(request)) auth_states = pipeline.get_provider_user_states(user) context['auth']['providers'] = [{ 'id': state.provider.provider_id, 'name': state.provider.name, # The name of the provider e.g. Facebook 'connected': state.has_account, # Whether the user's edX account is connected with the provider. # If the user is not connected, they should be directed to this page to authenticate # with the particular provider, as long as the provider supports initiating a login. 'connect_url': pipeline.get_login_url( state.provider.provider_id, pipeline.AUTH_ENTRY_ACCOUNT_SETTINGS, # The url the user should be directed to after the auth process has completed. redirect_url=reverse('account_settings'), ), 'accepts_logins': state.provider.accepts_logins, # If the user is connected, sending a POST request to this url removes the connection # information for this provider from their edX account. 'disconnect_url': pipeline.get_disconnect_url(state.provider.provider_id, state.association_id), # We only want to include providers if they are either currently available to be logged # in with, or if the user is already authenticated with them. } for state in auth_states if state.provider.display_for_login or state.has_account] if any(state.provider.provider_id == 'saml-sunet' for state in auth_states if state.has_account): context['is_shib_auth'] = True return context
def account_settings_context(request): """ Context for the account settings page. Args: request: The request object. Returns: dict """ user = request.user year_of_birth_options = [(unicode(year), unicode(year)) for year in UserProfile.VALID_YEARS] try: user_orders = get_user_orders(user) except: # pylint: disable=bare-except log.exception('Error fetching order history from Otto.') # Return empty order list as account settings page expect a list and # it will be broken if exception raised user_orders = [] beta_language = {} dark_lang_config = DarkLangConfig.current() if dark_lang_config.enable_beta_languages: user_preferences = get_user_preferences(user) pref_language = user_preferences.get('pref-lang') if pref_language in dark_lang_config.beta_languages_list: beta_language['code'] = pref_language beta_language['name'] = settings.LANGUAGE_DICT.get(pref_language) context = { 'auth': {}, 'duplicate_provider': None, 'nav_hidden': True, 'fields': { 'country': { 'options': list(countries), }, 'gender': { 'options': [(choice[0], _(choice[1])) for choice in UserProfile.GENDER_CHOICES], }, 'language': { 'options': released_languages(), }, 'level_of_education': { 'options': [(choice[0], _(choice[1])) for choice in UserProfile.LEVEL_OF_EDUCATION_CHOICES], }, 'password': { 'url': reverse('password_reset'), }, 'year_of_birth': { 'options': year_of_birth_options, }, 'preferred_language': { 'options': all_languages(), }, 'time_zone': { 'options': TIME_ZONE_CHOICES, } }, 'platform_name': configuration_helpers.get_value('PLATFORM_NAME', settings.PLATFORM_NAME), 'password_reset_support_link': configuration_helpers.get_value( 'PASSWORD_RESET_SUPPORT_LINK', settings.PASSWORD_RESET_SUPPORT_LINK ) or settings.SUPPORT_SITE_LINK, 'user_accounts_api_url': reverse("accounts_api", kwargs={'username': user.username}), 'user_preferences_api_url': reverse('preferences_api', kwargs={'username': user.username}), 'disable_courseware_js': True, 'show_program_listing': ProgramsApiConfig.is_enabled(), 'show_dashboard_tabs': True, 'order_history': user_orders, 'disable_order_history_tab': should_redirect_to_order_history_microfrontend(), 'enable_account_deletion': configuration_helpers.get_value( 'ENABLE_ACCOUNT_DELETION', settings.FEATURES.get('ENABLE_ACCOUNT_DELETION', False) ), 'extended_profile_fields': _get_extended_profile_fields(), 'beta_language': beta_language, } enterprise_customer = get_enterprise_customer_for_learner(user=request.user) update_account_settings_context_for_enterprise(context, enterprise_customer) if third_party_auth.is_enabled(): # If the account on the third party provider is already connected with another edX account, # we display a message to the user. context['duplicate_provider'] = pipeline.get_duplicate_provider(messages.get_messages(request)) auth_states = pipeline.get_provider_user_states(user) context['auth']['providers'] = [{ 'id': state.provider.provider_id, 'name': state.provider.name, # The name of the provider e.g. Facebook 'connected': state.has_account, # Whether the user's edX account is connected with the provider. # If the user is not connected, they should be directed to this page to authenticate # with the particular provider, as long as the provider supports initiating a login. 'connect_url': pipeline.get_login_url( state.provider.provider_id, pipeline.AUTH_ENTRY_ACCOUNT_SETTINGS, # The url the user should be directed to after the auth process has completed. redirect_url=reverse('account_settings'), ), 'accepts_logins': state.provider.accepts_logins, # If the user is connected, sending a POST request to this url removes the connection # information for this provider from their edX account. 'disconnect_url': pipeline.get_disconnect_url(state.provider.provider_id, state.association_id), # We only want to include providers if they are either currently available to be logged # in with, or if the user is already authenticated with them. } for state in auth_states if state.provider.display_for_login or state.has_account] return context
def footer(request): """Retrieve the branded footer. This end-point provides information about the site footer, allowing for consistent display of the footer across other sites (for example, on the marketing site and blog). It can be used in one of two ways: 1) A client renders the footer from a JSON description. 2) A browser loads an HTML representation of the footer and injects it into the DOM. The HTML includes CSS and JavaScript links. In case (2), we assume that the following dependencies are included on the page: a) JQuery (same version as used in edx-platform) b) font-awesome (same version as used in edx-platform) c) Open Sans web fonts Example: Retrieving the footer as JSON GET /api/branding/v1/footer Accepts: application/json { "navigation_links": [ { "url": "http://example.com/about", "name": "about", "title": "About" }, # ... ], "social_links": [ { "url": "http://example.com/social", "name": "facebook", "icon-class": "fa-facebook-square", "title": "Facebook", "action": "Sign up on Facebook!" }, # ... ], "mobile_links": [ { "url": "http://example.com/android", "name": "google", "image": "http://example.com/google.png", "title": "Google" }, # ... ], "legal_links": [ { "url": "http://example.com/terms-of-service.html", "name": "terms_of_service", "title': "Terms of Service" }, # ... ], "openedx_link": { "url": "http://open.edx.org", "title": "Powered by Open edX", "image": "http://example.com/openedx.png" }, "logo_image": "http://example.com/static/images/logo.png", "copyright": "edX, Open edX and their respective logos are registered trademarks of edX Inc." } Example: Retrieving the footer as HTML GET /api/branding/v1/footer Accepts: text/html Example: Including the footer with the "Powered by Open edX" logo GET /api/branding/v1/footer?show-openedx-logo=1 Accepts: text/html Example: Retrieving the footer in a particular language GET /api/branding/v1/footer?language=en Accepts: text/html Example: Retrieving the footer with a language selector GET /api/branding/v1/footer?include-language-selector=1 Accepts: text/html Example: Retrieving the footer with all JS and CSS dependencies (for testing) GET /api/branding/v1/footer?include-dependencies=1 Accepts: text/html """ if not branding_api.is_enabled(): raise Http404 # Use the content type to decide what representation to serve accepts = request.META.get('HTTP_ACCEPT', '*/*') # Show the OpenEdX logo in the footer show_openedx_logo = bool(request.GET.get('show-openedx-logo', False)) # Include JS and CSS dependencies # This is useful for testing the end-point directly. include_dependencies = bool(request.GET.get('include-dependencies', False)) # Override the language if necessary language = request.GET.get('language', translation.get_language()) try: language = get_supported_language_variant(language) except LookupError: language = settings.LANGUAGE_CODE # Include a language selector include_language_selector = request.GET.get('include-language-selector', '') == '1' # Render the footer information based on the extension if 'text/html' in accepts or '*/*' in accepts: cache_params = { 'language': language, 'show_openedx_logo': show_openedx_logo, 'include_dependencies': include_dependencies } if include_language_selector: cache_params['language_selector_options'] = ','.join(sorted([lang.code for lang in released_languages()])) cache_key = u"branding.footer.{params}.html".format(params=six.moves.urllib.parse.urlencode(cache_params)) content = cache.get(cache_key) if content is None: with translation.override(language): content = _render_footer_html( request, show_openedx_logo, include_dependencies, include_language_selector, language ) cache.set(cache_key, content, settings.FOOTER_CACHE_TIMEOUT) return HttpResponse(content, status=200, content_type="text/html; charset=utf-8") elif 'application/json' in accepts: cache_key = u"branding.footer.{params}.json".format( params=six.moves.urllib.parse.urlencode({ 'language': language, 'is_secure': request.is_secure(), }) ) footer_dict = cache.get(cache_key) if footer_dict is None: with translation.override(language): footer_dict = branding_api.get_footer(is_secure=request.is_secure()) cache.set(cache_key, footer_dict, settings.FOOTER_CACHE_TIMEOUT) return JsonResponse(footer_dict, 200, content_type="application/json; charset=utf-8") else: return HttpResponse(status=406)
def test_released_languages(self): """ Tests for the released languages. """ released_languages = language_api.released_languages() self.assertGreaterEqual(len(released_languages), 1)