From e644e5c86a70b1e60b5c1d6a70bcbc92e47eac55 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Tue, 13 Feb 2018 12:06:40 +0530 Subject: [PATCH] locale: Refactor language selection form - Use properly base class overrides - Implement feature to go back to the page user was on before language selection. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- plinth/templates/base.html | 5 +++-- plinth/views.py | 45 ++++++++++++++++++++++---------------- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/plinth/templates/base.html b/plinth/templates/base.html index 64cf7a050..f4e5810ee 100644 --- a/plinth/templates/base.html +++ b/plinth/templates/base.html @@ -173,8 +173,9 @@ {% else %}
  • - - + +
  • diff --git a/plinth/views.py b/plinth/views.py index 1544884bf..b0887581a 100644 --- a/plinth/views.py +++ b/plinth/views.py @@ -23,11 +23,10 @@ from django.core.exceptions import ImproperlyConfigured from django.template.response import TemplateResponse from django.views.generic import TemplateView from django.views.generic.edit import FormView -from django.http import HttpResponseRedirect from django.conf import settings -from django.shortcuts import render from django.urls import reverse from django.utils import translation +from django.utils.http import is_safe_url from django.utils.translation import ugettext as _ from stronghold.decorators import public import time @@ -37,6 +36,8 @@ import plinth from plinth import package from plinth.modules.storage import views as disk_views +REDIRECT_FIELD_NAME = 'next' + @public def index(request): @@ -73,26 +74,32 @@ class LanguageSelectionView(FormView): form_class = forms.LanguageSelectionForm template_name = 'language-selection.html' - def get(self, request, *args, **kwargs): - current_values = {'language': translation.get_language()} - form = self.form_class(initial=current_values) - return render(request, self.template_name, {'form': form}) - - def post(self, request, *args, **kwargs): - form = self.form_class(request.POST) - if form.is_valid(): - selected_language = form.cleaned_data['language'] - if not selected_language: - response = HttpResponseRedirect(reverse('language-selection')) - response.delete_cookie(settings.LANGUAGE_COOKIE_NAME) - return response + def get_initial(self): + """Return the initial values for the form.""" + return {'language': translation.get_language()} + def form_valid(self, form): + """Set or reset the current language.""" + selected_language = form.cleaned_data['language'] + response = super().form_valid(form) + if not selected_language: + response.delete_cookie(settings.LANGUAGE_COOKIE_NAME) + else: translation.activate(selected_language) - response = HttpResponseRedirect(reverse('language-selection')) # send a cookie for selected language - response.set_cookie(settings.LANGUAGE_COOKIE_NAME, selected_language) - return response - return render(request, self.template_name, {'form': form}) + response.set_cookie(settings.LANGUAGE_COOKIE_NAME, + selected_language) + + return response + + def get_success_url(self): + """Return the URL in the next parameter or home page.""" + redirect_to = self.request.GET.get(REDIRECT_FIELD_NAME, '') + redirect_to = self.request.POST.get(REDIRECT_FIELD_NAME, redirect_to) + if is_safe_url(url=redirect_to, host=self.request.get_host()): + return redirect_to + + return reverse('index') class ServiceView(FormView):