Skip to content

Commit 982248d

Browse files
author
Martin J. Laubach
committed
Avoid setting the language in session if it's the site's primary language, so we don't have session hanging around that just (pointlessly) tell us "primary language".
Add samesite attribute for language cookie. Add some annotations. Remove dj1.6 support.
1 parent 76c376c commit 982248d

1 file changed

Lines changed: 19 additions & 20 deletions

File tree

feincms/extensions/translations.py

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,13 @@
1717

1818
# ------------------------------------------------------------------------
1919
import logging
20+
from typing import Optional
2021

2122
from django.conf import settings as django_settings
2223
from django.db import models
23-
from django.http import HttpResponseRedirect
24+
from django.http import HttpResponseRedirect, HttpRequest
2425
from django.utils import translation
25-
from django.utils.html import mark_safe
26+
from django.utils.safestring import mark_safe
2627
from django.utils.translation import gettext_lazy as _
2728

2829
from feincms import extensions, settings
@@ -33,16 +34,12 @@
3334
# ------------------------------------------------------------------------
3435
logger = logging.getLogger(__name__)
3536

36-
LANGUAGE_COOKIE_NAME = django_settings.LANGUAGE_COOKIE_NAME
37-
if hasattr(translation, "LANGUAGE_SESSION_KEY"):
38-
LANGUAGE_SESSION_KEY = translation.LANGUAGE_SESSION_KEY
39-
else:
40-
# Django 1.6
41-
LANGUAGE_SESSION_KEY = LANGUAGE_COOKIE_NAME
42-
37+
LANGUAGE_COOKIE_NAME: str = django_settings.LANGUAGE_COOKIE_NAME
38+
LANGUAGE_SESSION_KEY = translation.LANGUAGE_SESSION_KEY
39+
PRIMARY_LANGUAGE: str = django_settings.LANGUAGES[0][0]
4340

4441
# ------------------------------------------------------------------------
45-
def user_has_language_set(request):
42+
def user_has_language_set(request: HttpRequest) -> bool:
4643
"""
4744
Determine whether the user has explicitely set a language earlier on.
4845
This is taken later on as an indication that we should not mess with the
@@ -59,18 +56,18 @@ def user_has_language_set(request):
5956

6057

6158
# ------------------------------------------------------------------------
62-
def translation_allowed_language(select_language):
59+
def translation_allowed_language(select_language: str) -> str:
6360
"Check for feincms specific set of allowed front end languages."
6461
if settings.FEINCMS_FRONTEND_LANGUAGES:
6562
language = select_language[:2]
6663
if language not in settings.FEINCMS_FRONTEND_LANGUAGES:
67-
select_language = django_settings.LANGUAGES[0][0]
64+
select_language = PRIMARY_LANGUAGE
6865

6966
return select_language
7067

7168

7269
# ------------------------------------------------------------------------
73-
def translation_set_language(request, select_language):
70+
def translation_set_language(request: HttpRequest, select_language: str) -> Optional[HttpResponseRedirect]:
7471
"""
7572
Set and activate a language, if that language is available.
7673
"""
@@ -85,15 +82,17 @@ def translation_set_language(request, select_language):
8582
# other messages and other applications. It is *highly* recommended to
8683
# create a new django.po for the language instead of
8784
# using this behaviour.
88-
select_language = django_settings.LANGUAGES[0][0]
85+
select_language = PRIMARY_LANGUAGE
8986
fallback = True
9087

9188
translation.activate(select_language)
92-
request.LANGUAGE_CODE = translation.get_language()
89+
request.LANGUAGE_CODE = translation.get_language() # type: ignore
9390

9491
if hasattr(request, "session"):
9592
# User has a session, then set this language there
96-
if select_language != request.session.get(LANGUAGE_SESSION_KEY):
93+
current_session_language = request.session.get(LANGUAGE_SESSION_KEY, PRIMARY_LANGUAGE)
94+
95+
if select_language != current_session_language:
9796
request.session[LANGUAGE_SESSION_KEY] = select_language
9897
elif request.method == "GET" and not fallback:
9998
# No session is active. We need to set a cookie for the language
@@ -102,7 +101,7 @@ def translation_set_language(request, select_language):
102101
# Only do this when request method is GET (mainly, do not abort
103102
# POST requests)
104103
response = HttpResponseRedirect(request.get_full_path())
105-
response.set_cookie(str(LANGUAGE_COOKIE_NAME), select_language)
104+
response.set_cookie(str(LANGUAGE_COOKIE_NAME), select_language, samesite="Lax")
106105
return response
107106

108107

@@ -161,7 +160,7 @@ def handle_model(self):
161160
_("language"),
162161
max_length=10,
163162
choices=django_settings.LANGUAGES,
164-
default=django_settings.LANGUAGES[0][0],
163+
default=PRIMARY_LANGUAGE,
165164
),
166165
)
167166
cls.add_to_class(
@@ -173,7 +172,7 @@ def handle_model(self):
173172
null=True,
174173
verbose_name=_("translation of"),
175174
related_name="translations",
176-
limit_choices_to={"language": django_settings.LANGUAGES[0][0]},
175+
limit_choices_to={"language": PRIMARY_LANGUAGE},
177176
help_text=_("Leave this empty for entries in the primary language."),
178177
),
179178
)
@@ -250,7 +249,7 @@ def get_original_translation(self, *args, **kwargs):
250249
"Page pk=%d (%s) has no primary language translation (%s)",
251250
self.pk,
252251
self.language,
253-
django_settings.LANGUAGES[0][0],
252+
PRIMARY_LANGUAGE,
254253
)
255254
return self
256255

0 commit comments

Comments
 (0)