Skip to content

Commit 63f893a

Browse files
Merge branch 'master' into fix-redis-backend-cert-reqs
2 parents a4795f8 + 81c58df commit 63f893a

File tree

24 files changed

+766
-157
lines changed

24 files changed

+766
-157
lines changed

api/specs/web-server/_users.py

Lines changed: 14 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -39,26 +39,14 @@
3939
"/me",
4040
response_model=Envelope[MyProfileGet],
4141
)
42-
async def get_my_profile():
43-
...
42+
async def get_my_profile(): ...
4443

4544

4645
@router.patch(
4746
"/me",
4847
status_code=status.HTTP_204_NO_CONTENT,
4948
)
50-
async def update_my_profile(_body: MyProfilePatch):
51-
...
52-
53-
54-
@router.put(
55-
"/me",
56-
status_code=status.HTTP_204_NO_CONTENT,
57-
deprecated=True,
58-
description="Use PATCH instead",
59-
)
60-
async def replace_my_profile(_body: MyProfilePatch):
61-
...
49+
async def update_my_profile(_body: MyProfilePatch): ...
6250

6351

6452
@router.patch(
@@ -68,25 +56,22 @@ async def replace_my_profile(_body: MyProfilePatch):
6856
async def set_frontend_preference(
6957
preference_id: PreferenceIdentifier,
7058
_body: PatchRequestBody,
71-
):
72-
...
59+
): ...
7360

7461

7562
@router.get(
7663
"/me/tokens",
7764
response_model=Envelope[list[MyTokenGet]],
7865
)
79-
async def list_tokens():
80-
...
66+
async def list_tokens(): ...
8167

8268

8369
@router.post(
8470
"/me/tokens",
8571
response_model=Envelope[MyTokenGet],
8672
status_code=status.HTTP_201_CREATED,
8773
)
88-
async def create_token(_body: MyTokenCreate):
89-
...
74+
async def create_token(_body: MyTokenCreate): ...
9075

9176

9277
@router.get(
@@ -95,24 +80,21 @@ async def create_token(_body: MyTokenCreate):
9580
)
9681
async def get_token(
9782
_path: Annotated[_TokenPathParams, Depends()],
98-
):
99-
...
83+
): ...
10084

10185

10286
@router.delete(
10387
"/me/tokens/{service}",
10488
status_code=status.HTTP_204_NO_CONTENT,
10589
)
106-
async def delete_token(_path: Annotated[_TokenPathParams, Depends()]):
107-
...
90+
async def delete_token(_path: Annotated[_TokenPathParams, Depends()]): ...
10891

10992

11093
@router.get(
11194
"/me/notifications",
11295
response_model=Envelope[list[UserNotification]],
11396
)
114-
async def list_user_notifications():
115-
...
97+
async def list_user_notifications(): ...
11698

11799

118100
@router.post(
@@ -121,8 +103,7 @@ async def list_user_notifications():
121103
)
122104
async def create_user_notification(
123105
_body: UserNotificationCreate,
124-
):
125-
...
106+
): ...
126107

127108

128109
@router.patch(
@@ -132,16 +113,14 @@ async def create_user_notification(
132113
async def mark_notification_as_read(
133114
_path: Annotated[_NotificationPathParams, Depends()],
134115
_body: UserNotificationPatch,
135-
):
136-
...
116+
): ...
137117

138118

139119
@router.get(
140120
"/me/permissions",
141121
response_model=Envelope[list[MyPermissionGet]],
142122
)
143-
async def list_user_permissions():
144-
...
123+
async def list_user_permissions(): ...
145124

146125

147126
#
@@ -154,8 +133,7 @@ async def list_user_permissions():
154133
response_model=Envelope[list[UserGet]],
155134
description="Search among users who are publicly visible to the caller (i.e., me) based on their privacy settings.",
156135
)
157-
async def search_users(_body: UsersSearch):
158-
...
136+
async def search_users(_body: UsersSearch): ...
159137

160138

161139
#
@@ -171,7 +149,7 @@ async def search_users(_body: UsersSearch):
171149
tags=_extra_tags,
172150
)
173151
async def search_users_for_admin(
174-
_query: Annotated[UsersForAdminSearchQueryParams, Depends()]
152+
_query: Annotated[UsersForAdminSearchQueryParams, Depends()],
175153
):
176154
# NOTE: see `Search` in `Common Custom Methods` in https://cloud.google.com/apis/design/custom_methods
177155
...
@@ -182,5 +160,4 @@ async def search_users_for_admin(
182160
response_model=Envelope[UserForAdminGet],
183161
tags=_extra_tags,
184162
)
185-
async def pre_register_user_for_admin(_body: PreRegisteredUserGet):
186-
...
163+
async def pre_register_user_for_admin(_body: PreRegisteredUserGet): ...

packages/models-library/src/models_library/api_schemas_webserver/users.py

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
ValidationInfo,
1717
field_validator,
1818
)
19+
from pydantic.config import JsonDict
1920

2021
from ..basic_types import IDStr
2122
from ..emails import LowerCaseEmailStr
@@ -46,11 +47,13 @@
4647

4748

4849
class MyProfilePrivacyGet(OutputSchema):
50+
hide_username: bool
4951
hide_fullname: bool
5052
hide_email: bool
5153

5254

5355
class MyProfilePrivacyPatch(InputSchema):
56+
hide_username: bool | None = None
5457
hide_fullname: bool | None = None
5558
hide_email: bool | None = None
5659

@@ -79,23 +82,33 @@ class MyProfileGet(OutputSchemaWithoutCamelCase):
7982
privacy: MyProfilePrivacyGet
8083
preferences: AggregatedPreferences
8184

85+
@staticmethod
86+
def _update_json_schema_extra(schema: JsonDict) -> None:
87+
schema.update(
88+
{
89+
"examples": [
90+
{
91+
"id": 42,
92+
"login": "[email protected]",
93+
"userName": "bla42",
94+
"role": "admin", # pre
95+
"expirationDate": "2022-09-14", # optional
96+
"preferences": {},
97+
"privacy": {
98+
"hide_username": 0,
99+
"hide_fullname": 0,
100+
"hide_email": 1,
101+
},
102+
},
103+
]
104+
}
105+
)
106+
82107
model_config = ConfigDict(
83108
# NOTE: old models have an hybrid between snake and camel cases!
84109
# Should be unified at some point
85110
populate_by_name=True,
86-
json_schema_extra={
87-
"examples": [
88-
{
89-
"id": 42,
90-
"login": "[email protected]",
91-
"userName": "bla42",
92-
"role": "admin", # pre
93-
"expirationDate": "2022-09-14", # optional
94-
"preferences": {},
95-
"privacy": {"hide_fullname": 0, "hide_email": 1},
96-
},
97-
]
98-
},
111+
json_schema_extra=_update_json_schema_extra,
99112
)
100113

101114
@field_validator("role", mode="before")

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@ class UserNotFoundInRepoError(BaseUserRepoError):
2727

2828

2929
# NOTE: see MyProfilePatch.user_name
30-
_MIN_USERNAME_LEN: Final[int] = 4
30+
MIN_USERNAME_LEN: Final[int] = 4
3131

3232

33-
def _generate_random_chars(length: int = _MIN_USERNAME_LEN) -> str:
33+
def _generate_random_chars(length: int = MIN_USERNAME_LEN) -> str:
3434
"""returns `length` random digit character"""
3535
return "".join(secrets.choice(string.digits) for _ in range(length))
3636

@@ -42,8 +42,8 @@ def _generate_username_from_email(email: str) -> str:
4242
username = re.sub(r"[^a-zA-Z0-9]", "", username).lower()
4343

4444
# 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))
45+
if len(username) < MIN_USERNAME_LEN:
46+
username += _generate_random_chars(length=MIN_USERNAME_LEN - len(username))
4747

4848
return username
4949

packages/service-library/src/servicelib/progress_bar.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,12 @@
2222

2323
@runtime_checkable
2424
class AsyncReportCB(Protocol):
25-
async def __call__(self, report: ProgressReport) -> None:
26-
...
25+
async def __call__(self, report: ProgressReport) -> None: ...
2726

2827

2928
@runtime_checkable
3029
class ReportCB(Protocol):
31-
def __call__(self, report: ProgressReport) -> None:
32-
...
30+
def __call__(self, report: ProgressReport) -> None: ...
3331

3432

3533
def _normalize_weights(steps: int, weights: list[float]) -> list[float]:
@@ -88,7 +86,7 @@ async def main_fct():
8886
progress_unit: ProgressUnit | None = None
8987
progress_report_cb: AsyncReportCB | ReportCB | None = None
9088
_current_steps: float = _INITIAL_VALUE
91-
_currnet_attempt: int = 0
89+
_current_attempt: int = 0
9290
_children: list["ProgressBarData"] = field(default_factory=list)
9391
_parent: Optional["ProgressBarData"] = None
9492
_continuous_value_lock: asyncio.Lock = field(init=False)
@@ -148,7 +146,7 @@ async def _report_external(self, value: float) -> None:
148146
# NOTE: here we convert back to actual value since this is possibly weighted
149147
actual_value=value * self.num_steps,
150148
total=self.num_steps,
151-
attempt=self._currnet_attempt,
149+
attempt=self._current_attempt,
152150
unit=self.progress_unit,
153151
message=self.compute_report_message_stuct(),
154152
),
@@ -200,7 +198,7 @@ async def update(self, steps: float = 1) -> None:
200198
await self._report_external(new_progress_value)
201199

202200
def reset(self) -> None:
203-
self._currnet_attempt += 1
201+
self._current_attempt += 1
204202
self._current_steps = _INITIAL_VALUE
205203
self._last_report_value = _INITIAL_VALUE
206204

0 commit comments

Comments
 (0)