Skip to content

Commit e2ccbaf

Browse files
committed
moving decorator out of api
1 parent 66b4f67 commit e2ccbaf

File tree

6 files changed

+46
-35
lines changed

6 files changed

+46
-35
lines changed

services/web/server/src/simcore_service_webserver/exporter/_handlers.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@
66

77
from aiofiles.tempfile import TemporaryDirectory as AioTemporaryDirectory
88
from aiohttp import web
9+
from models_library.projects_access import Owner
910
from models_library.projects_state import ProjectStatus
1011
from servicelib.request_keys import RQT_USERID_KEY
1112

1213
from .._constants import RQ_PRODUCT_KEY
1314
from .._meta import API_VTAG
1415
from ..login.decorators import login_required
15-
from ..projects.projects_api import with_project_locked_and_notify
16+
from ..projects.api import with_project_locked_and_notify
17+
from ..projects.projects_api import retrieve_and_notify_project_locked_state
1618
from ..security.decorators import permission_required
1719
from ..users.api import get_user_fullname
1820
from ._formatter.archive import get_sds_archive_path
@@ -47,9 +49,12 @@ async def export_project(request: web.Request):
4749
request.app,
4850
project_uuid=project_uuid,
4951
status=ProjectStatus.EXPORTING,
50-
user_id=user_id,
51-
user_name=await get_user_fullname(request.app, user_id=user_id),
52-
notify_users=True,
52+
owner=Owner(
53+
user_id=user_id, **await get_user_fullname(request.app, user_id=user_id)
54+
),
55+
notification_cb=retrieve_and_notify_project_locked_state(
56+
user_id, project_uuid, request.app
57+
),
5358
)
5459
async def _() -> tuple[Callable[[], Coroutine[Any, Any, None]], Path]:
5560
# @GitHK what is this supposed to be doing??

services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from models_library.api_schemas_long_running_tasks.base import ProgressPercent
1010
from models_library.api_schemas_webserver.projects import ProjectGet
1111
from models_library.projects import ProjectID
12+
from models_library.projects_access import Owner
1213
from models_library.projects_nodes_io import NodeID, NodeIDStr
1314
from models_library.projects_state import ProjectStatus
1415
from models_library.users import UserID
@@ -39,6 +40,7 @@
3940
from . import projects_api
4041
from ._metadata_api import set_project_ancestors
4142
from ._permalink_api import update_or_pop_permalink_in_project
43+
from ._projects_locks_utils import with_project_locked_and_notify
4244
from .db import ProjectDBAPI
4345
from .exceptions import (
4446
ParentNodeNotFoundError,
@@ -180,13 +182,16 @@ async def _copy() -> None:
180182
await long_running_task.result()
181183

182184
if needs_lock_source_project:
183-
await projects_api.with_project_locked_and_notify(
185+
await with_project_locked_and_notify(
184186
app,
185187
project_uuid=source_project["uuid"],
186188
status=ProjectStatus.CLONING,
187-
user_id=user_id,
188-
user_name=await get_user_fullname(app, user_id=user_id),
189-
notify_users=True,
189+
owner=Owner(
190+
user_id=user_id, **await get_user_fullname(app, user_id=user_id)
191+
),
192+
notification_cb=projects_api.retrieve_and_notify_project_locked_state(
193+
user_id, source_project["uuid"], app
194+
),
190195
)(_copy)()
191196
else:
192197
await _copy()

services/web/server/src/simcore_service_webserver/projects/_projects_locks_utils.py

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
from collections.abc import Callable, Coroutine
22
from functools import wraps
3-
from typing import Any, ParamSpec, TypeVar
3+
from typing import Any, Awaitable, ParamSpec, TypeVar
44

55
from aiohttp import web
66
from models_library.projects_access import Owner
77
from models_library.projects_state import ProjectStatus
88
from servicelib.redis._project_lock import with_project_locked
99

1010
from ..redis import get_redis_lock_manager_client_sdk
11-
from ..users.api import FullNameDict
12-
from .projects_api import retrieve_and_notify_project_locked_state
1311

1412
P = ParamSpec("P")
1513
R = TypeVar("R")
@@ -20,9 +18,8 @@ def with_project_locked_and_notify(
2018
*,
2119
project_uuid: str,
2220
status: ProjectStatus,
23-
user_id: int,
24-
user_name: FullNameDict,
25-
notify_users: bool,
21+
owner: Owner,
22+
notification_cb: Awaitable | None,
2623
) -> Callable[
2724
[Callable[P, Coroutine[Any, Any, R]]], Callable[P, Coroutine[Any, Any, R]]
2825
]:
@@ -35,21 +32,17 @@ async def _wrapper(*args: P.args, **kwargs: P.kwargs) -> R:
3532
get_redis_lock_manager_client_sdk(app),
3633
project_uuid=project_uuid,
3734
status=status,
38-
owner=Owner(user_id=user_id, **user_name),
35+
owner=owner,
3936
)
4037
async def _locked_func() -> R:
41-
if notify_users:
42-
await retrieve_and_notify_project_locked_state(
43-
user_id, project_uuid, app
44-
)
38+
if notification_cb is not None:
39+
await notification_cb
4540

4641
return await func(*args, **kwargs)
4742

4843
result = await _locked_func()
49-
if notify_users:
50-
await retrieve_and_notify_project_locked_state(
51-
user_id, project_uuid, app
52-
)
44+
if notification_cb is not None:
45+
await notification_cb
5346
return result
5447

5548
return _wrapper

services/web/server/src/simcore_service_webserver/projects/api.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
)
1212
from ._permalink_api import ProjectPermalink
1313
from ._permalink_api import register_factory as register_permalink_factory
14+
from ._projects_locks_utils import with_project_locked_and_notify
1415
from ._wallets_api import (
1516
check_project_financial_status,
1617
connect_wallet_to_project,
@@ -27,6 +28,7 @@
2728
"ProjectPermalink",
2829
"register_permalink_factory",
2930
"check_project_financial_status",
31+
"with_project_locked_and_notify",
3032
)
3133

3234

services/web/server/src/simcore_service_webserver/projects/projects_api.py

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@
128128
)
129129
from ._db_utils import PermissionStr
130130
from ._nodes_utils import set_reservation_same_as_limit, validate_new_service_resources
131+
from ._projects_locks_utils import with_project_locked_and_notify
131132
from ._wallets_api import connect_wallet_to_project, get_project_wallet
132133
from .db import APP_PROJECT_DBAPI, ProjectDBAPI
133134
from .exceptions import (
@@ -1260,9 +1261,12 @@ async def try_open_project_for_user(
12601261
app,
12611262
project_uuid=project_uuid,
12621263
status=ProjectStatus.OPENING,
1263-
user_id=user_id,
1264-
user_name=await get_user_fullname(app, user_id=user_id),
1265-
notify_users=True,
1264+
owner=Owner(
1265+
user_id=user_id, **await get_user_fullname(app, user_id=user_id)
1266+
),
1267+
notification_cb=retrieve_and_notify_project_locked_state(
1268+
user_id, project_uuid, app
1269+
),
12661270
)
12671271
async def _open_project() -> bool:
12681272
with managed_resource(user_id, client_session_id, app) as user_session:
@@ -1756,9 +1760,12 @@ async def remove_project_dynamic_services(
17561760
app,
17571761
project_uuid=project_uuid,
17581762
status=ProjectStatus.CLOSING,
1759-
user_id=user_id,
1760-
user_name=user_name_data,
1761-
notify_users=notify_users,
1763+
owner=Owner(user_id=user_id, **user_name_data),
1764+
notification_cb=(
1765+
retrieve_and_notify_project_locked_state(user_id, project_uuid, app)
1766+
if notify_users
1767+
else None
1768+
),
17621769
)
17631770
async def _locked_stop_dynamic_serivces_in_project() -> None:
17641771
# save the state if the user is not a guest. if we do not know we save in any case.

services/web/server/tests/unit/with_dbs/02/test_projects_crud_handlers__delete.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
DynamicServiceStop,
2121
)
2222
from models_library.projects import ProjectID
23+
from models_library.projects_access import Owner
2324
from models_library.projects_state import ProjectStatus
2425
from pytest_simcore.helpers.assert_checks import assert_status
2526
from pytest_simcore.helpers.webserver_login import UserInfoDict
@@ -34,11 +35,9 @@
3435
from simcore_postgres_database.models.projects_to_products import projects_to_products
3536
from simcore_service_webserver._meta import api_version_prefix
3637
from simcore_service_webserver.db.models import UserRole
38+
from simcore_service_webserver.exporter._handlers import with_project_locked_and_notify
3739
from simcore_service_webserver.projects import _crud_api_delete
3840
from simcore_service_webserver.projects.models import ProjectDict
39-
from simcore_service_webserver.projects.projects_api import (
40-
with_project_locked_and_notify,
41-
)
4241
from socketio.exceptions import ConnectionError as SocketConnectionError
4342

4443

@@ -225,6 +224,7 @@ async def test_delete_project_while_it_is_locked_raises_error(
225224
logged_user: UserInfoDict,
226225
user_project: ProjectDict,
227226
expected: ExpectedResponse,
227+
faker: Faker,
228228
):
229229
assert client.app
230230

@@ -234,7 +234,6 @@ async def test_delete_project_while_it_is_locked_raises_error(
234234
app=client.app,
235235
project_uuid=project_uuid,
236236
status=ProjectStatus.CLOSING,
237-
user_id=user_id,
238-
user_name={"first_name": "test", "last_name": "test"},
239-
notify_users=False,
237+
owner=Owner(user_id=user_id, first_name=faker.name(), last_name=faker.name()),
238+
notification_cb=None,
240239
)(_request_delete_project)(client, user_project, expected.conflict)

0 commit comments

Comments
 (0)