Skip to content

Commit 416a13c

Browse files
committed
autogenerate username > 4
1 parent b33cb8e commit 416a13c

File tree

4 files changed

+38
-15
lines changed

4 files changed

+38
-15
lines changed

packages/models-library/tests/test_api_schemas_webserver_users.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# pylint: disable=redefined-outer-name
2+
# pylint: disable=too-many-arguments
23
# pylint: disable=unused-argument
34
# pylint: disable=unused-variable
4-
# pylint: disable=too-many-arguments
55

66
from copy import deepcopy
77

packages/postgres-database/src/simcore_postgres_database/utils_users.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import secrets
77
import string
88
from datetime import datetime
9+
from typing import Final
910

1011
import sqlalchemy as sa
1112
from aiopg.sa.connection import SAConnection
@@ -25,19 +26,29 @@ class UserNotFoundInRepoError(BaseUserRepoError):
2526
pass
2627

2728

29+
# NOTE: see MyProfilePatch.user_name
30+
_MIN_USERNAME_LEN: Final[int] = 4
31+
32+
33+
def _generate_random_chars(length: int = _MIN_USERNAME_LEN) -> str:
34+
"""returns `length` random digit character"""
35+
return "".join(secrets.choice(string.digits) for _ in range(length))
36+
37+
2838
def _generate_username_from_email(email: str) -> str:
2939
username = email.split("@")[0]
3040

3141
# Remove any non-alphanumeric characters and convert to lowercase
32-
return re.sub(r"[^a-zA-Z0-9]", "", username).lower()
42+
username = re.sub(r"[^a-zA-Z0-9]", "", username).lower()
3343

44+
# Ensure the username is at least 4 characters long
45+
if len(username) < _MIN_USERNAME_LEN:
46+
username += _generate_random_chars(length=_MIN_USERNAME_LEN - len(username))
3447

35-
def _generate_random_chars(length=5) -> str:
36-
"""returns `length` random digit character"""
37-
return "".join(secrets.choice(string.digits) for _ in range(length - 1))
48+
return username
3849

3950

40-
def generate_alternative_username(username) -> str:
51+
def generate_alternative_username(username: str) -> str:
4152
return f"{username}_{_generate_random_chars()}"
4253

4354

services/web/server/src/simcore_service_webserver/users/_users_repository.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -557,11 +557,12 @@ async def update_user_profile(
557557
)
558558

559559
except IntegrityError as err:
560-
user_name = updated_values.get("name")
561-
562-
raise UserNameDuplicateError(
563-
user_name=user_name,
564-
alternative_user_name=generate_alternative_username(user_name),
565-
user_id=user_id,
566-
updated_values=updated_values,
567-
) from err
560+
if user_name := updated_values.get("name"):
561+
raise UserNameDuplicateError(
562+
user_name=user_name,
563+
alternative_user_name=generate_alternative_username(user_name),
564+
user_id=user_id,
565+
updated_values=updated_values,
566+
) from err
567+
568+
raise # not due to name duplication

services/web/server/tests/unit/isolated/test_users_models.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1+
# pylint: disable=protected-access
12
# pylint: disable=redefined-outer-name
3+
# pylint: disable=too-many-arguments
24
# pylint: disable=unused-argument
35
# pylint: disable=unused-variable
4-
# pylint: disable=too-many-arguments
56

67
from datetime import UTC, datetime
78
from typing import Any
@@ -16,6 +17,7 @@
1617
from models_library.generics import Envelope
1718
from models_library.utils.fastapi_encoders import jsonable_encoder
1819
from servicelib.rest_constants import RESPONSE_MODEL_POLICY
20+
from simcore_postgres_database import utils_users
1921
from simcore_service_webserver.users._common.models import ToUserUpdateDB
2022

2123

@@ -136,3 +138,12 @@ def test_mapping_update_models_from_rest_to_db():
136138
"name": "foo1234",
137139
"privacy_hide_fullname": False,
138140
}
141+
142+
143+
def test_utils_user_generates_valid_myprofile_patch():
144+
username = utils_users._generate_username_from_email("[email protected]") # noqa: SLF001
145+
146+
MyProfilePatch.model_validate({"userName": username})
147+
MyProfilePatch.model_validate(
148+
{"userName": utils_users.generate_alternative_username(username)}
149+
)

0 commit comments

Comments
 (0)