Skip to content

Commit

Permalink
users,settings: add custom language middleware
Browse files Browse the repository at this point in the history
  • Loading branch information
m4ra authored and goapunk committed Apr 18, 2024
1 parent 484af51 commit a6e2518
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 1 deletion.
1 change: 1 addition & 0 deletions adhocracy-plus/config/settings/base.py
Expand Up @@ -119,6 +119,7 @@
"csp.middleware.CSPMiddleware",
"django_cloudflare_push.middleware.push_middleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"apps.users.middleware.SetUserLanguageCookieMiddleware",
"django.middleware.locale.LocaleMiddleware",
"django.middleware.common.CommonMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
Expand Down
2 changes: 1 addition & 1 deletion apps/users/__init__.py
Expand Up @@ -13,7 +13,7 @@
def set_language(sender, user, **kwargs):
from .utils import set_session_language

set_session_language(user, None)
set_session_language(user.email)


user_logged_in.connect(set_language)
18 changes: 18 additions & 0 deletions apps/users/middleware.py
@@ -0,0 +1,18 @@
from django.conf import settings
from django.utils import translation


class SetUserLanguageCookieMiddleware:
def __init__(self, get_response):
self.get_response = get_response

def __call__(self, request):
response = self.get_response(request)
cookie = request.COOKIES.get(settings.LANGUAGE_COOKIE_NAME)
if hasattr(request.user, "language"):
translation.activate(request.user.language)
if cookie != request.user.language:
response.set_cookie(
settings.LANGUAGE_COOKIE_NAME, request.user.language
)
return response
7 changes: 7 additions & 0 deletions changelog/2658.md
@@ -0,0 +1,7 @@
### Added

- custom middleware for user language

### Fixed

- language not changing to user preference after login
8 changes: 8 additions & 0 deletions tests/users/test_views.py
Expand Up @@ -4,22 +4,30 @@
from allauth.account.models import EmailAddress
from django.contrib import auth
from django.core import mail
from django.test import override_settings
from django.urls import reverse
from django.utils import translation

from adhocracy4.test.helpers import redirect_target
from apps.users import models

User = auth.get_user_model()


@override_settings(LANGUAGE_CODE="de")
@pytest.mark.django_db
def test_login(client, user, login_url):
assert user.language == "en" # english is set by default
assert translation.get_language() == "de"
assert translation.get_language() != user.language

response = client.get(login_url)
assert response.status_code == 200

response = client.post(login_url, {"login": user.email, "password": "password"})
assert response.status_code == 302
assert int(client.session["_auth_user_id"]) == user.pk
assert translation.get_language() == user.language


@pytest.mark.django_db
Expand Down

0 comments on commit a6e2518

Please sign in to comment.