From 690388d411c318329a0418c985cdf334d75a225c Mon Sep 17 00:00:00 2001 From: armanddidierjean <95971503+armanddidierjean@users.noreply.github.com> Date: Wed, 27 Aug 2025 22:22:40 +0200 Subject: [PATCH 1/7] Validate email for batch creation and invite --- app/core/users/schemas_users.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/core/users/schemas_users.py b/app/core/users/schemas_users.py index 7007574da6..2045489d3e 100644 --- a/app/core/users/schemas_users.py +++ b/app/core/users/schemas_users.py @@ -125,7 +125,7 @@ class CoreBatchUserCreateRequest(BaseModel): The schema is used for batch account creation requests. """ - email: str + email: EmailStr default_group_id: str | None = None # Email normalization, this will modify the email variable From 7b9aa89c2da53a939b3c01d0addeabd3f4a81a20 Mon Sep 17 00:00:00 2001 From: armanddidierjean <95971503+armanddidierjean@users.noreply.github.com> Date: Wed, 27 Aug 2025 22:22:57 +0200 Subject: [PATCH 2/7] Capitalize name and first name --- app/core/users/schemas_users.py | 4 ++-- app/utils/validators.py | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/app/core/users/schemas_users.py b/app/core/users/schemas_users.py index 2045489d3e..5bd27124b0 100644 --- a/app/core/users/schemas_users.py +++ b/app/core/users/schemas_users.py @@ -17,9 +17,9 @@ class CoreUserBase(BaseModel): firstname: str nickname: str | None = None - _normalize_name = field_validator("name")(validators.trailing_spaces_remover) + _normalize_name = field_validator("name")(validators.name_normalizer) _normalize_firstname = field_validator("firstname")( - validators.trailing_spaces_remover, + validators.name_normalizer, ) _normalize_nickname = field_validator("nickname")( validators.trailing_spaces_remover, diff --git a/app/utils/validators.py b/app/utils/validators.py index 7d57a3adb2..2ca95a3b41 100644 --- a/app/utils/validators.py +++ b/app/utils/validators.py @@ -46,6 +46,15 @@ def email_normalizer(email: str) -> str: return email.lower().strip() +def name_normalizer(name: str) -> str: + """ + Normalize a name by changing its capitalization. We also remove trailing spaces. + This function is intended to be used as a Pydantic validator: + https://pydantic-docs.helpmanual.io/usage/validators/#reuse-validators + """ + return name.strip().title() + + def trailing_spaces_remover(value: str | None) -> str | None: """ Remove trailing spaces. From 69a429416c2caac5de0caf5842929c12f5ac2084 Mon Sep 17 00:00:00 2001 From: armanddidierjean <95971503+armanddidierjean@users.noreply.github.com> Date: Thu, 28 Aug 2025 00:45:38 +0200 Subject: [PATCH 3/7] Fix tests --- tests/test_schools.py | 3 ++- tests/test_users.py | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/test_schools.py b/tests/test_schools.py index 351311dbb6..f1e30bebb6 100644 --- a/tests/test_schools.py +++ b/tests/test_schools.py @@ -215,7 +215,8 @@ def test_create_user_corresponding_to_school( user = next( user for user in users.json() - if user["firstname"] == "new_user_firstname" and user["name"] == "new_user_name" + if user["firstname"] == "new_user_firstname".title() + and user["name"] == "new_user_name".title() ) user_detail = client.get( diff --git a/tests/test_users.py b/tests/test_users.py index a4c0e26b19..de34022785 100644 --- a/tests/test_users.py +++ b/tests/test_users.py @@ -236,7 +236,9 @@ def test_create_and_activate_user( "/users/", headers={"Authorization": f"Bearer {token_admin_user}"}, ) - user = next(user for user in users.json() if user["name"] == email.split("@")[0]) + user = next( + user for user in users.json() if user["name"] == email.split("@")[0].title() + ) assert user is not None assert user["account_type"] == expected_account_type.value From 049579265c70f07dcb9a338e8359ecb6182f49ab Mon Sep 17 00:00:00 2001 From: armanddidierjean <95971503+armanddidierjean@users.noreply.github.com> Date: Thu, 28 Aug 2025 01:31:43 +0200 Subject: [PATCH 4/7] Fix tests --- tests/test_booking.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/test_booking.py b/tests/test_booking.py index db95c6704b..7278b1a28d 100644 --- a/tests/test_booking.py +++ b/tests/test_booking.py @@ -190,8 +190,10 @@ def test_get_user_bookings_manage_confirmed(client: TestClient) -> None: ) assert response.status_code == 200 assert booking_id in [booking["id"] for booking in response.json()] - assert response.json()[0]["applicant"].get("name", None) == simple_user.name - assert response.json()[0]["applicant"].get("email", None) == simple_user.email + assert response.json()[0]["applicant"].get("name", None) == simple_user.name.title() + assert ( + response.json()[0]["applicant"].get("email", None) == simple_user.email.title() + ) def test_get_bookings_confirmed(client: TestClient) -> None: From a387668c6e4ab6ab953f216f22f74ec104a89467 Mon Sep 17 00:00:00 2001 From: armanddidierjean <95971503+armanddidierjean@users.noreply.github.com> Date: Thu, 28 Aug 2025 01:39:28 +0200 Subject: [PATCH 5/7] Fix tests --- tests/test_booking.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/test_booking.py b/tests/test_booking.py index 7278b1a28d..a44ae8e883 100644 --- a/tests/test_booking.py +++ b/tests/test_booking.py @@ -191,9 +191,7 @@ def test_get_user_bookings_manage_confirmed(client: TestClient) -> None: assert response.status_code == 200 assert booking_id in [booking["id"] for booking in response.json()] assert response.json()[0]["applicant"].get("name", None) == simple_user.name.title() - assert ( - response.json()[0]["applicant"].get("email", None) == simple_user.email.title() - ) + assert response.json()[0]["applicant"].get("email", None) == simple_user.email def test_get_bookings_confirmed(client: TestClient) -> None: From 6ff0a721bd1518a6f60d1775dbb3446a6aad3242 Mon Sep 17 00:00:00 2001 From: armanddidierjean <95971503+armanddidierjean@users.noreply.github.com> Date: Thu, 28 Aug 2025 01:50:38 +0200 Subject: [PATCH 6/7] Fix tests --- tests/test_booking.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_booking.py b/tests/test_booking.py index a44ae8e883..c95dd25b29 100644 --- a/tests/test_booking.py +++ b/tests/test_booking.py @@ -200,7 +200,7 @@ def test_get_bookings_confirmed(client: TestClient) -> None: headers={"Authorization": f"Bearer {token_manager}"}, ) assert response.status_code == 200 - assert response.json()[0]["applicant"].get("name", None) == simple_user.name + assert response.json()[0]["applicant"].get("name", None) == simple_user.name.title() assert response.json()[0]["applicant"].get("email", None) is None From f6e9ae68fc95f0eeb608401afe12e7df8381244a Mon Sep 17 00:00:00 2001 From: armanddidierjean <95971503+armanddidierjean@users.noreply.github.com> Date: Thu, 28 Aug 2025 01:57:36 +0200 Subject: [PATCH 7/7] Fix tests --- tests/test_phonebook.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_phonebook.py b/tests/test_phonebook.py index 8ad8aa77ae..afa32ca1c3 100644 --- a/tests/test_phonebook.py +++ b/tests/test_phonebook.py @@ -523,8 +523,8 @@ def test_add_membership_admin_with_president_tag(client: TestClient): user_simple3 = members[0] assert user_simple3["id"] == phonebook_user_simple3.id - assert user_simple3["name"] == phonebook_user_simple3.name - assert user_simple3["firstname"] == phonebook_user_simple3.firstname + assert user_simple3["name"] == phonebook_user_simple3.name.title() + assert user_simple3["firstname"] == phonebook_user_simple3.firstname.title() assert user_simple3["email"] == phonebook_user_simple3.email assert len(user_simple3["memberships"]) == 1 assert user_simple3["memberships"][0]["association_id"] == association3.id