Преглед на файлове

fix: Language chosen in user preferences persists on subsequent requests (#4310)

Bojan Mihelac преди 5 години
родител
ревизия
df1608b080
променени са 5 файла, в които са добавени 24 реда и са изтрити 8 реда
  1. 1 0
      CHANGELOG.txt
  2. 1 0
      docs/releases/2.7.rst
  3. 9 5
      wagtail/admin/auth.py
  4. 10 0
      wagtail/admin/tests/test_account_management.py
  5. 3 3
      wagtail/admin/views/account.py

+ 1 - 0
CHANGELOG.txt

@@ -31,6 +31,7 @@ Changelog
  * Fix: Remove ASCII conversion from Postgres search backend, to support stemming in non-Latin alphabets (Pavel Denisov)
  * Fix: Prevent tab labels on page edit view from being cut off on very narrow screens (Kevin Howbrook)
  * Fix: Very long words in page listings are now broken where necessary (Kevin Howbrook)
+ * Fix: Language chosen in user preferences no longer persists on subsequent requests (Bojan Mihelac)
 
 
 2.6.1 (05.08.2019)

+ 1 - 0
docs/releases/2.7.rst

@@ -55,6 +55,7 @@ Bug fixes
  * Remove ASCII conversion from Postgres search backend, to support stemming in non-Latin alphabets (Pavel Denisov)
  * Prevent tab labels on page edit view from being cut off on very narrow screens (Kevin Howbrook)
  * Very long words in page listings are now broken where necessary (Kevin Howbrook)
+ * Language chosen in user preferences no longer persists on subsequent requests (Bojan Mihelac)
 
 
 Upgrade considerations

+ 9 - 5
wagtail/admin/auth.py

@@ -7,8 +7,8 @@ from django.db.models import Q
 from django.shortcuts import redirect
 from django.urls import reverse
 from django.utils.timezone import activate as activate_tz
-from django.utils.translation import activate as activate_lang
 from django.utils.translation import ugettext as _
+from django.utils.translation import override
 
 from wagtail.admin import messages
 from wagtail.core.models import GroupPagePermission
@@ -154,13 +154,17 @@ def require_admin_access(view_func):
             return reject_request(request)
 
         if user.has_perms(['wagtailadmin.access_admin']):
+            preferred_language = None
             if hasattr(user, 'wagtail_userprofile'):
-                language = user.wagtail_userprofile.get_preferred_language()
-                l18n.set_language(language)
-                activate_lang(language)
+                preferred_language = user.wagtail_userprofile.get_preferred_language()
+                l18n.set_language(preferred_language)
                 time_zone = user.wagtail_userprofile.get_current_time_zone()
                 activate_tz(time_zone)
-            return view_func(request, *args, **kwargs)
+            if preferred_language:
+                with override(preferred_language):
+                    return view_func(request, *args, **kwargs)
+            else:
+                return view_func(request, *args, **kwargs)
 
         if not request.is_ajax():
             messages.error(request, _('You do not have permission to access the admin'))

+ 10 - 0
wagtail/admin/tests/test_account_management.py

@@ -11,6 +11,7 @@ from django.contrib.auth.tokens import PasswordResetTokenGenerator
 from django.core import mail
 from django.test import TestCase, override_settings
 from django.urls import reverse
+from django.utils.translation import get_language
 
 from wagtail.admin.locale import (
     WAGTAILADMIN_PROVIDED_LANGUAGES, get_available_admin_languages, get_available_admin_time_zones)
@@ -411,6 +412,15 @@ class TestAccountSection(TestCase, WagtailTestUtils):
         # Check that the current language is assumed as English
         self.assertEqual(profile.get_preferred_language(), "en")
 
+    def test_language_preferences_reapplies_original_language(self):
+        post_data = {
+            'preferred_language': 'es'
+        }
+        response = self.client.post(reverse('wagtailadmin_account_language_preferences'), post_data)
+        self.assertRedirects(response, reverse('wagtailadmin_account'))
+
+        self.assertEqual(get_language(), "en")
+
     def test_change_name(self):
         """
         This tests that the change name view responds with a change name page

+ 3 - 3
wagtail/admin/views/account.py

@@ -7,7 +7,7 @@ from django.http import Http404
 from django.shortcuts import redirect, render
 from django.urls import reverse, reverse_lazy
 from django.utils.translation import ugettext as _
-from django.utils.translation import activate
+from django.utils.translation import override
 
 from wagtail.admin.forms.auth import LoginForm, PasswordResetForm
 from wagtail.core import hooks
@@ -174,8 +174,8 @@ def language_preferences(request):
             user_profile = form.save()
             # This will set the language only for this request/thread
             # (so that the 'success' messages is in the right language)
-            activate(user_profile.get_preferred_language())
-            messages.success(request, _("Your preferences have been updated."))
+            with override(user_profile.get_preferred_language()):
+                messages.success(request, _("Your preferences have been updated."))
             return redirect('wagtailadmin_account')
     else:
         form = PreferredLanguageForm(instance=UserProfile.get_for_user(request.user))