From 8e0e286bc417b0825653d532667aa4e2dbdc800f Mon Sep 17 00:00:00 2001 From: lebaudantoine Date: Tue, 22 Apr 2025 19:15:05 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8(backend)=20serialize=20user=20languag?= =?UTF-8?q?e=20and=20timezone=20for=20frontend=20use?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add user language and timezone to serialized user data to enable frontend customization. Allows backend email notifications to respect user's localization preferences for improved communication relevance. --- src/backend/core/api/serializers.py | 5 ++++- .../core/tests/rooms/test_api_rooms_retrieve.py | 16 ++++++++++++++-- src/backend/core/tests/test_api_users.py | 6 +++++- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/backend/core/api/serializers.py b/src/backend/core/api/serializers.py index 2e8ae574..a32773c9 100644 --- a/src/backend/core/api/serializers.py +++ b/src/backend/core/api/serializers.py @@ -4,6 +4,7 @@ from django.utils.translation import gettext_lazy as _ from rest_framework import serializers from rest_framework.exceptions import PermissionDenied +from timezone_field.rest_framework import TimeZoneSerializerField from core import models, utils @@ -11,9 +12,11 @@ from core import models, utils class UserSerializer(serializers.ModelSerializer): """Serialize users.""" + timezone = TimeZoneSerializerField() + class Meta: model = models.User - fields = ["id", "email", "full_name", "short_name"] + fields = ["id", "email", "full_name", "short_name", "timezone", "language"] read_only_fields = ["id", "email", "full_name", "short_name"] diff --git a/src/backend/core/tests/rooms/test_api_rooms_retrieve.py b/src/backend/core/tests/rooms/test_api_rooms_retrieve.py index 308e65c2..ad5a53ad 100644 --- a/src/backend/core/tests/rooms/test_api_rooms_retrieve.py +++ b/src/backend/core/tests/rooms/test_api_rooms_retrieve.py @@ -336,10 +336,11 @@ def test_api_rooms_retrieve_authenticated(): "url": "test_url_value", } ) -def test_api_rooms_retrieve_members(mock_token, django_assert_num_queries): +def test_api_rooms_retrieve_members(mock_token, django_assert_num_queries, settings): """ Users who are members of a room should be allowed to see related users. """ + settings.TIME_ZONE = "UTC" user = UserFactory() other_user = UserFactory() @@ -369,6 +370,8 @@ def test_api_rooms_retrieve_members(mock_token, django_assert_num_queries): "email": user_access.user.email, "full_name": user_access.user.full_name, "short_name": user_access.user.short_name, + "timezone": "UTC", + "language": user_access.user.language, }, "resource": str(room.id), "role": user_access.role, @@ -380,6 +383,8 @@ def test_api_rooms_retrieve_members(mock_token, django_assert_num_queries): "email": other_user_access.user.email, "full_name": other_user_access.user.full_name, "short_name": other_user_access.user.short_name, + "timezone": "UTC", + "language": other_user_access.user.language, }, "resource": str(room.id), "role": other_user_access.role, @@ -415,11 +420,14 @@ def test_api_rooms_retrieve_members(mock_token, django_assert_num_queries): "url": "test_url_value", } ) -def test_api_rooms_retrieve_administrators(mock_token, django_assert_num_queries): +def test_api_rooms_retrieve_administrators( + mock_token, django_assert_num_queries, settings +): """ A user who is an administrator or owner of a room should be allowed to see related users. """ + settings.TIME_ZONE = "UTC" user = UserFactory() other_user = UserFactory() room = RoomFactory() @@ -448,6 +456,8 @@ def test_api_rooms_retrieve_administrators(mock_token, django_assert_num_queries "email": other_user_access.user.email, "full_name": other_user_access.user.full_name, "short_name": other_user_access.user.short_name, + "timezone": "UTC", + "language": other_user_access.user.language, }, "resource": str(room.id), "role": other_user_access.role, @@ -459,6 +469,8 @@ def test_api_rooms_retrieve_administrators(mock_token, django_assert_num_queries "email": user_access.user.email, "full_name": user_access.user.full_name, "short_name": user_access.user.short_name, + "timezone": "UTC", + "language": user_access.user.language, }, "resource": str(room.id), "role": user_access.role, diff --git a/src/backend/core/tests/test_api_users.py b/src/backend/core/tests/test_api_users.py index 10374fb8..37fb32b7 100644 --- a/src/backend/core/tests/test_api_users.py +++ b/src/backend/core/tests/test_api_users.py @@ -103,8 +103,10 @@ def test_api_users_retrieve_me_anonymous(): } -def test_api_users_retrieve_me_authenticated(): +def test_api_users_retrieve_me_authenticated(settings): """Authenticated users should be able to retrieve their own user via the "/users/me" path.""" + + settings.TIME_ZONE = "UTC" user = factories.UserFactory() client = APIClient() @@ -121,6 +123,8 @@ def test_api_users_retrieve_me_authenticated(): "email": user.email, "full_name": user.full_name, "short_name": user.short_name, + "language": user.language, + "timezone": "UTC", }