Merge lp:~maxiberta/canonical-identity-provider/fix-set-language into lp:canonical-identity-provider/release

Proposed by Maximiliano Bertacchini
Status: Merged
Approved by: Maximiliano Bertacchini
Approved revision: no longer in the source branch.
Merge reported by: Otto Co-Pilot
Merged at revision: not available
Proposed branch: lp:~maxiberta/canonical-identity-provider/fix-set-language
Merge into: lp:canonical-identity-provider/release
Diff against target: 104 lines (+15/-12)
4 files modified
src/identityprovider/middleware/useraccount.py (+2/-1)
src/identityprovider/tests/test_views_server.py (+8/-10)
src/identityprovider/views/server.py (+1/-1)
src/webui/tests/test_views_ui.py (+4/-0)
To merge this branch: bzr merge lp:~maxiberta/canonical-identity-provider/fix-set-language
Reviewer Review Type Date Requested Status
Daniel Manrique (community) Approve
Review via email: mp+354487@code.launchpad.net

Commit message

Fix explicitly setting the active language.

Description of the change

Set the active language in the session as described in Django docs (https://docs.djangoproject.com/en/1.11/topics/i18n/translation/#explicitly-setting-the-active-language).

Curiously, two tests were explicitly validating the current (wrong) behaviour. Some archaeology:
- webui.tests.test_views_ui.LogoutTestCase.test_preferred_language_is_kept_after_logout(): introduced in r1255 "Redirect to return_url on logout for known rpconfigs, when the query string return_now was given".
- identityprovider.tests.test_views_server.MultiLangOpenIDTestCase.test_language_persists_in_session(): modified in r1392 "Move to django-1.8 from 1.7 and fix the test fallouts".

To post a comment you must log in.
Revision history for this message
Daniel Manrique (roadmr) wrote :

WOw, thanks! LGTM.

review: Approve
Revision history for this message
Otto Co-Pilot (otto-copilot) wrote :
Revision history for this message
Maximiliano Bertacchini (maxiberta) wrote :

<maxiberta> roadmr: hm, I think the failing test needs a previous "make compilemessages"... o just not look for a German string
<maxiberta> roadmr: ftr, jenkaas runs `make bootstrap makemessages` for setup
<maxiberta> I'd make that `make bootstrap makemessages compilemessages`... ?
<maxiberta> uhm... that somehow messes with `make test`!!
<maxiberta> okey, I'll just skip the German string comparison
<maxiberta> there's still a check for 'de' in the cookie
<roadmr> sounds good, I think we're fairly certain that if the cookie has the right value, we do the right thing
<roadmr> if the translation is present
<maxiberta> yup

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/identityprovider/middleware/useraccount.py'
2--- src/identityprovider/middleware/useraccount.py 2018-05-28 21:18:30 +0000
3+++ src/identityprovider/middleware/useraccount.py 2018-09-07 21:30:32 +0000
4@@ -4,6 +4,7 @@
5 from django.conf import settings
6 from django.contrib.auth import logout
7 from django.contrib.auth.models import User
8+from django.utils.translation import LANGUAGE_SESSION_KEY
9
10 from identityprovider.const import SESSION_TOKEN_KEY
11 from identityprovider.models import Account
12@@ -61,5 +62,5 @@
13 if isinstance(request.user, Account):
14 lang = request.user.preferredlanguage
15 if lang is not None:
16- request.session['django_language'] = lang
17+ request.session[LANGUAGE_SESSION_KEY] = lang
18 self._validate_session(request, request.user)
19
20=== modified file 'src/identityprovider/tests/test_views_server.py'
21--- src/identityprovider/tests/test_views_server.py 2018-09-05 14:17:55 +0000
22+++ src/identityprovider/tests/test_views_server.py 2018-09-07 21:30:32 +0000
23@@ -17,6 +17,7 @@
24 from django.test.utils import override_settings, patch_logger
25 from django.urls import reverse
26 from django.utils.timezone import now
27+from django.utils.translation import LANGUAGE_SESSION_KEY
28 from gargoyle.testutils import switches
29 from mock import Mock
30 from openid.extensions.ax import (
31@@ -538,38 +539,35 @@
32 quote_plus(openid_identity_url))
33
34
35-@override_settings(LANGUAGE_CODE='en', SUPPORTED_LANGUAGES=['en', 'de'])
36+@override_settings(SUPPORTED_LANGUAGES=['en', 'de'])
37 class MultiLangOpenIDTestCase(SSOBaseTestCase):
38
39 def test_no_lang_specified(self):
40 response = self.client.get(reverse('server-openid'))
41 expected = "This is Ubuntu One, built on OpenID"
42 self.assertContains(response, expected)
43- self.assertEqual('en', self.client.session['django_language'])
44+ self.assertEqual('en', self.client.session[LANGUAGE_SESSION_KEY])
45
46 def test_german(self):
47 self.client.get(reverse('server-openid', kwargs=dict(lang='de')))
48- self.assertEqual('de', self.client.session['django_language'])
49+ self.assertEqual('de', self.client.session[LANGUAGE_SESSION_KEY])
50
51 def test_german_with_country_code(self):
52 # This should default back to 'de'.
53 self.client.get(reverse('server-openid', kwargs=dict(lang='de_CH')))
54- self.assertEqual('de', self.client.session['django_language'])
55+ self.assertEqual('de', self.client.session[LANGUAGE_SESSION_KEY])
56
57 def test_unsupported_language(self):
58 self.client.get(reverse('server-openid', kwargs=dict(lang='sw')))
59- self.assertEqual('en', self.client.session['django_language'])
60+ self.assertEqual('en', self.client.session[LANGUAGE_SESSION_KEY])
61
62 def test_language_persists_in_session(self):
63 self.client.get(reverse('server-openid', kwargs=dict(lang='de')))
64- self.assertEqual('de', self.client.session['django_language'])
65+ self.assertEqual('de', self.client.session[LANGUAGE_SESSION_KEY])
66 # Requesting a second time will still bring back German
67 # if no other setting takes precedence (like the user's preference).
68- # XXX: 2016-01-07 psivaa: But from django-1.8, `When a translation
69- # doesn’t exist for a specific literal, the fallback is now taken
70- # from the LANGUAGE_CODE`
71 self.client.get(reverse('server-openid'))
72- self.assertEqual('en', self.client.session['django_language'])
73+ self.assertEqual('de', self.client.session[LANGUAGE_SESSION_KEY])
74
75
76 class ValidOpenIDTestCase(SSOBaseTestCase):
77
78=== modified file 'src/identityprovider/views/server.py'
79--- src/identityprovider/views/server.py 2018-09-04 13:40:22 +0000
80+++ src/identityprovider/views/server.py 2018-09-07 21:30:32 +0000
81@@ -113,7 +113,7 @@
82 if lang not in settings.SUPPORTED_LANGUAGES:
83 lang = 'en'
84 if hasattr(request, 'session'):
85- request.session['django_language'] = lang
86+ request.session[translation.LANGUAGE_SESSION_KEY] = lang
87 else:
88 response.set_cookie(settings.LANGUAGE_COOKIE_NAME, lang)
89
90
91=== modified file 'src/webui/tests/test_views_ui.py'
92--- src/webui/tests/test_views_ui.py 2018-05-28 21:00:28 +0000
93+++ src/webui/tests/test_views_ui.py 2018-09-07 21:30:32 +0000
94@@ -636,6 +636,10 @@
95 self.set_language('de')
96 response = self.logout()
97
98+ # The logout page should be rendered in German in real life, but
99+ # the CI environment lacks the needed translations at the moment.
100+ # Thus, right here the message defaults to "You have been logged out"
101+ # instead of "Sie haben sich abgemeldet".
102 self.assert_logged_out_in_sso(response)
103 self.assertEqual(
104 response.cookies[settings.LANGUAGE_COOKIE_NAME].value, 'de')