diff --git a/cms/templates/darklang/preview_lang.html b/cms/templates/darklang/preview_lang.html deleted file mode 100644 index 0efadc53bc..0000000000 --- a/cms/templates/darklang/preview_lang.html +++ /dev/null @@ -1,15 +0,0 @@ -## Override the default styles_version to the Pattern Library version (version 2) -<%! main_css = "style-main-v2" %> -<%page expression_filter="h"/> -<%! -from django.utils.translation import ugettext as _ -%> - -<%inherit file="../base.html" /> -<%block name="title">${_("Preview Language Setting")} -<%block name="bodyclass">is-signedin pattern-library - -<%block name="content"> - <%include file="/dark_lang/preview_lang_include.html" /> - - diff --git a/lms/djangoapps/courseware/tests/test_i18n.py b/lms/djangoapps/courseware/tests/test_i18n.py index cafa3ed478..4281456f65 100644 --- a/lms/djangoapps/courseware/tests/test_i18n.py +++ b/lms/djangoapps/courseware/tests/test_i18n.py @@ -128,7 +128,7 @@ class I18nRegressionTests(BaseI18nTestCase): self.assert_tag_has_attr(response.content, "html", "lang", "fa") # Now try to access with dark lang - self.client.post(self.preview_language_url, {'preview_lang': 'fa-ir', 'set_language': 'set_language'}) + self.client.post(self.preview_language_url, {'preview_language': 'fa-ir', 'action': 'set_preview_language'}) response = self.client.get(self.url) self.assert_tag_has_attr(response.content, "html", "lang", "fa-ir") @@ -144,17 +144,17 @@ class I18nRegressionTests(BaseI18nTestCase): # Verify we can switch language using the preview-lang query param # Set the language - self.client.post(self.preview_language_url, {'preview_lang': 'eo', 'set_language': 'set_language'}) + self.client.post(self.preview_language_url, {'preview_language': 'eo', 'action': 'set_preview_language'}) response = self.client.get(self.url) self.assert_tag_has_attr(response.content, "html", "lang", "eo") # We should be able to see released languages using preview-lang, too - self.client.post(self.preview_language_url, {'preview_lang': 'es-419', 'set_language': 'set_language'}) + self.client.post(self.preview_language_url, {'preview_language': 'es-419', 'action': 'set_preview_language'}) response = self.client.get(self.url) self.assert_tag_has_attr(response.content, "html", "lang", "es-419") # Clearing the language should go back to site default - self.client.post(self.preview_language_url, {'reset': 'reset'}) + self.client.post(self.preview_language_url, {'action': 'reset_preview_language'}) response = self.client.get(self.url) self.assert_tag_has_attr(response.content, "html", "lang", site_lang) @@ -205,7 +205,7 @@ class I18nLangPrefTests(BaseI18nTestCase): # Set user language preference self.set_lang_preference('ar') # Verify preview-lang takes precedence - self.client.post(self.preview_language_url, {'preview_lang': 'eo', 'set_language': 'set_language'}) + self.client.post(self.preview_language_url, {'preview_language': 'eo', 'action': 'set_preview_language'}) response = self.client.get(self.url) self.assert_tag_has_attr(response.content, "html", "lang", 'eo') @@ -214,7 +214,7 @@ class I18nLangPrefTests(BaseI18nTestCase): self.assert_tag_has_attr(response.content, "html", "lang", "eo") # Clearing language must set language back to preference language - self.client.post(self.preview_language_url, {'reset': 'reset'}) + self.client.post(self.preview_language_url, {'action': 'reset_preview_language'}) response = self.client.get(self.url) self.assert_tag_has_attr(response.content, "html", "lang", 'ar') diff --git a/lms/templates/darklang/preview_lang.html b/lms/templates/darklang/preview_lang.html deleted file mode 100644 index 02a05f17f2..0000000000 --- a/lms/templates/darklang/preview_lang.html +++ /dev/null @@ -1,15 +0,0 @@ -## Override the default styles_version to the Pattern Library version (version 2) -<%! main_css = "style-main-v2" %> -<%page expression_filter="h"/> -<%! -from django.utils.translation import ugettext as _ -%> - -<%inherit file="/main.html" /> -<%block name="pagetitle">${_("Preview Language Setting")} -<%block name="nav_skip"> -<%block name="bodyclass">pattern-library - -<%block name="content"> - <%include file="/dark_lang/preview_lang_include.html" /> - diff --git a/openedx/core/djangoapps/dark_lang/templates/dark_lang/preview-language-fragment.html b/openedx/core/djangoapps/dark_lang/templates/dark_lang/preview-language-fragment.html new file mode 100644 index 0000000000..28c5ff841c --- /dev/null +++ b/openedx/core/djangoapps/dark_lang/templates/dark_lang/preview-language-fragment.html @@ -0,0 +1,31 @@ +## mako + +<%page expression_filter="h"/> + +<%namespace name='static' file='../static_content.html'/> + +<%! +from django.utils.translation import ugettext as _ +%> + +

+ ${_("Preview Language Setting")} +

+
+
+
+
+ +
+
+
+ + +
+ + +
+
diff --git a/openedx/core/djangoapps/dark_lang/templates/dark_lang/preview_lang_include.html b/openedx/core/djangoapps/dark_lang/templates/dark_lang/preview_lang_include.html deleted file mode 100644 index 1fc2ccb020..0000000000 --- a/openedx/core/djangoapps/dark_lang/templates/dark_lang/preview_lang_include.html +++ /dev/null @@ -1,36 +0,0 @@ -<%! -from django.utils.translation import ugettext as _ -%> -<%page expression_filter="h"/> - -

- ${_("Preview Language Setting")} -

-
-
-
-
- -
-
-
- - -
- - -
- -
- % if not form_submit_message is UNDEFINED: -

${form_submit_message}

- % if success: -

- ${_("Please refresh the page to see the changes applied.")} -

- % endif - % endif -
diff --git a/openedx/core/djangoapps/dark_lang/tests.py b/openedx/core/djangoapps/dark_lang/tests.py index 328bb1e71d..dd91ad7659 100644 --- a/openedx/core/djangoapps/dark_lang/tests.py +++ b/openedx/core/djangoapps/dark_lang/tests.py @@ -243,13 +243,13 @@ class DarkLangMiddlewareTests(TestCase): """ Sends a post request to set the preview language """ - return self.client.post('/update_lang/', {'preview_lang': preview_language, 'set_language': 'set_language'}) + return self.client.post('/update_lang/', {'preview_language': preview_language, 'action': 'set_preview_language'}) def _post_clear_preview_lang(self): """ Sends a post request to Clear the preview language """ - return self.client.post('/update_lang/', {'reset': 'reset'}) + return self.client.post('/update_lang/', {'action': 'reset_preview_language'}) def _set_client_session_language(self, session_language): """ diff --git a/openedx/core/djangoapps/dark_lang/urls.py b/openedx/core/djangoapps/dark_lang/urls.py index 9572f11797..9025da6d49 100644 --- a/openedx/core/djangoapps/dark_lang/urls.py +++ b/openedx/core/djangoapps/dark_lang/urls.py @@ -8,5 +8,5 @@ from openedx.core.djangoapps.dark_lang import views urlpatterns = patterns( '', - url(r'^$', views.DarkLangView.as_view(), name='preview_lang'), + url(r'^$', views.PreviewLanguageFragmentView.as_view(), name='preview_lang'), ) diff --git a/openedx/core/djangoapps/dark_lang/views.py b/openedx/core/djangoapps/dark_lang/views.py index 69c4d484e9..ff9a70367e 100644 --- a/openedx/core/djangoapps/dark_lang/views.py +++ b/openedx/core/djangoapps/dark_lang/views.py @@ -2,27 +2,26 @@ Views file for the Darklang Django App """ from django.contrib.auth.decorators import login_required +from django.http import Http404 +from django.shortcuts import redirect +from django.template.loader import render_to_string from django.utils.decorators import method_decorator -from django.utils.translation import ugettext as _ -from django.utils.translation import LANGUAGE_SESSION_KEY -from django.views.generic.base import View +from django.utils.translation import LANGUAGE_SESSION_KEY, ugettext as _ -from edxmako.shortcuts import render_to_response from openedx.core.djangoapps.dark_lang import DARK_LANGUAGE_KEY from openedx.core.djangoapps.dark_lang.models import DarkLangConfig -from openedx.core.djangoapps.lang_pref import LANGUAGE_KEY +from openedx.core.djangoapps.plugin_api.views import EdxFragmentView from openedx.core.djangoapps.user_api.preferences.api import ( delete_user_preference, - get_user_preference, set_user_preference ) -from openedx.core.lib.api.view_utils import view_auth_classes +from openedx.core.djangoapps.util.user_messages import PageLevelMessages +from web_fragments.fragment import Fragment -LANGUAGE_INPUT_FIELD = 'preview_lang' +LANGUAGE_INPUT_FIELD = 'preview_language' -@view_auth_classes() -class DarkLangView(View): +class PreviewLanguageFragmentView(EdxFragmentView): """ View used when a user is attempting to change the preview language using Darklang. @@ -30,136 +29,84 @@ class DarkLangView(View): GET - returns a form for setting/resetting the user's dark language POST - updates or clears the setting to the given dark language """ - template_name = 'darklang/preview_lang.html' + + def render_to_fragment(self, request, course_id=None, **kwargs): + """ + Renders the language preview view as a fragment. + """ + html = render_to_string('dark_lang/preview-language-fragment.html', {}) + return Fragment(html) + + def create_base_standalone_context(self, request, fragment, **kwargs): + """ + Creates the base context for rendering a fragment as a standalone page. + """ + return { + 'uses_bootstrap': True, + } + + def standalone_page_title(self, request, fragment, **kwargs): + """ + Returns the page title for the standalone update page. + """ + return _('Preview Language Administration') @method_decorator(login_required) - def get(self, request): + def get(self, request, *args, **kwargs): """ - Returns the Form for setting/resetting a User's dark language setting - - Arguments: - request (Request): The Django Request Object - - Returns: - HttpResponse: View containing the form for setting the preview lang + Renders the fragment to control the preview language. """ - context = { - 'disable_courseware_js': True, - 'uses_pattern_library': True - } - return render_to_response(self.template_name, context) + if not self._user_can_preview_languages(request.user): + raise Http404 + return super(PreviewLanguageFragmentView, self).get(request, *args, **kwargs) @method_decorator(login_required) - def post(self, request): + def post(self, request, **kwargs): """ - Sets or clears the DarkLang depending on the incoming post data. - - Arguments: - request (Request): The Django Request Object - - Returns: - HttpResponse: View containing the form for setting the preview lang with the status - included in the context + Accept requests to update the preview language. """ - return self.process_darklang_request(request) + if not self._user_can_preview_languages(request.user): + raise Http404 + action = request.POST.get('action', None) + if action == 'set_preview_language': + self._set_preview_language(request) + elif action == 'reset_preview_language': + self._clear_preview_language(request) + return redirect(request.path) - def process_darklang_request(self, request): + def _user_can_preview_languages(self, user): """ - Proccess the request to Set or clear the DarkLang depending on the incoming request. - - Arguments: - request (Request): The Django Request Object - - Returns: - HttpResponse: View containing the form for setting the preview lang with the status - included in the context + Returns true if the specified user can preview languages. """ - context = { - 'disable_courseware_js': True, - 'uses_pattern_library': True - } - response = None if not DarkLangConfig.current().enabled: - message = _('Preview Language is currently disabled') - context.update({'form_submit_message': message}) - context.update({'success': False}) - response = render_to_response(self.template_name, context, request=request) + return False + return user and not user.is_anonymous() - elif 'set_language' in request.POST: - # Set the Preview Language - response = self._set_preview_language(request, context) - elif 'reset' in request.POST: - # Reset and clear the language preference - response = self._clear_preview_language(request, context) - return response - - def _set_preview_language(self, request, context): + def _set_preview_language(self, request): """ - Set the Preview language - - Arguments: - request (Request): The incoming Django Request - context dict: The basic context for the Response - - Returns: - HttpResponse: View containing the form for setting the preview lang with the status - included in the context + Sets the preview language for the current user. """ - message = None - show_refresh_message = False + preview_language = request.POST.get(LANGUAGE_INPUT_FIELD, '') + if not preview_language.strip(): + PageLevelMessages.register_error_message(request, _('Language not provided')) + return - preview_lang = request.POST.get(LANGUAGE_INPUT_FIELD, '') - if not preview_lang.strip(): - message = _('Language code not provided') - else: - # Set the session key to the requested preview lang - request.session[LANGUAGE_SESSION_KEY] = preview_lang - - # Make sure that we set the requested preview lang as the dark lang preference for the - # user, so that the lang_pref middleware doesn't clobber away the dark lang preview. - auth_user = request.user - if auth_user: - set_user_preference(request.user, DARK_LANGUAGE_KEY, preview_lang) - - message = _('Language set to language code: {preview_language_code}').format( - preview_language_code=preview_lang + set_user_preference(request.user, DARK_LANGUAGE_KEY, preview_language) + PageLevelMessages.register_success_message( + request, + _('Language set to {preview_language}').format( + preview_language=preview_language ) - show_refresh_message = True - context.update({'form_submit_message': message}) - context.update({'success': show_refresh_message}) - response = render_to_response(self.template_name, context) - return response + ) - def _clear_preview_language(self, request, context): + def _clear_preview_language(self, request): """ - Clears the dark language preview - - Arguments: - request (Request): The incoming Django Request - context dict: The basic context for the Response - Returns: - HttpResponse: View containing the form for setting the preview lang with the status - included in the context + Clears the preview language for the current user. """ - # delete the session language key (if one is set) + delete_user_preference(request.user, DARK_LANGUAGE_KEY) if LANGUAGE_SESSION_KEY in request.session: del request.session[LANGUAGE_SESSION_KEY] - - user_pref = '' - auth_user = request.user - if auth_user: - # Reset user's dark lang preference to null - delete_user_preference(auth_user, DARK_LANGUAGE_KEY) - # Get & set user's preferred language - user_pref = get_user_preference(auth_user, LANGUAGE_KEY) - if user_pref: - request.session[LANGUAGE_SESSION_KEY] = user_pref - if user_pref is None: - message = _('Language reset to the default language code') - else: - message = _("Language reset to user's preference: {preview_language_code}").format( - preview_language_code=user_pref - ) - context.update({'form_submit_message': message}) - context.update({'success': True}) - return render_to_response(self.template_name, context) + PageLevelMessages.register_success_message( + request, + _('Language reset to the default') + )