Skip to content

Commit 7b29ae7

Browse files
committed
list_projects_full_depth from app
1 parent fbd6f82 commit 7b29ae7

File tree

3 files changed

+53
-32
lines changed

3 files changed

+53
-32
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ async def delete_project(
7878
app: web.Application,
7979
project_uuid: ProjectID,
8080
user_id: UserID,
81-
simcore_user_agent,
81+
simcore_user_agent: str,
8282
remove_project_dynamic_services: RemoveProjectServicesCallable,
8383
) -> None:
8484
"""Stops dynamic services, deletes data and finally deletes project

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

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,24 @@
2828
from .models import ProjectDict, ProjectTypeAPI
2929

3030

31-
async def _update_project_dict(
31+
async def _batch_update_list_of_project_dict(
32+
app: web.Application, list_of_project_dict: list[ProjectDict]
33+
) -> list[ProjectDict]:
34+
35+
# updating `trashed_by_primary_gid`
36+
trashed_by_primary_gid_values = await batch_get_trashed_by_primary_gid(
37+
app, projects_uuids=[ProjectID(p["uuid"]) for p in list_of_project_dict]
38+
)
39+
40+
for project_dict, value in zip(
41+
list_of_project_dict, trashed_by_primary_gid_values, strict=True
42+
):
43+
project_dict.update(trashed_by_primary_gid=value)
44+
45+
return list_of_project_dict
46+
47+
48+
async def _update_and_get_project_dict(
3249
request: web.Request,
3350
*,
3451
user_id: UserID,
@@ -49,23 +66,6 @@ async def _update_project_dict(
4966
return project
5067

5168

52-
async def _batch_update_list_of_project_dict(
53-
app: web.Application, list_of_project_dict: list[ProjectDict]
54-
) -> list[ProjectDict]:
55-
56-
# updating `trashed_by_primary_gid`
57-
trashed_by_primary_gid_values = await batch_get_trashed_by_primary_gid(
58-
app, projects_uuids=[ProjectID(p["uuid"]) for p in list_of_project_dict]
59-
)
60-
61-
for project_dict, value in zip(
62-
list_of_project_dict, trashed_by_primary_gid_values, strict=True
63-
):
64-
project_dict.update(trashed_by_primary_gid=value)
65-
66-
return list_of_project_dict
67-
68-
6969
async def list_projects( # pylint: disable=too-many-arguments
7070
request: web.Request,
7171
user_id: UserID,
@@ -145,11 +145,13 @@ async def list_projects( # pylint: disable=too-many-arguments
145145
order_by=order_by,
146146
)
147147

148+
# AGGREGATE data to the project from other sources, first some sources
149+
# as batch-update and then as parallel-update
148150
db_projects = await _batch_update_list_of_project_dict(app, db_projects)
149151

150152
projects: list[ProjectDict] = await logged_gather(
151153
*(
152-
_update_project_dict(
154+
_update_and_get_project_dict(
153155
request,
154156
user_id=user_id,
155157
project=prj,
@@ -165,7 +167,7 @@ async def list_projects( # pylint: disable=too-many-arguments
165167

166168

167169
async def list_projects_full_depth(
168-
request,
170+
app: web.Application,
169171
*,
170172
user_id: UserID,
171173
product_name: str,
@@ -180,10 +182,10 @@ async def list_projects_full_depth(
180182
search_by_multi_columns: str | None,
181183
search_by_project_name: str | None,
182184
) -> tuple[list[ProjectDict], int]:
183-
db = ProjectDBAPI.get_from_app_context(request.app)
185+
db = ProjectDBAPI.get_from_app_context(app)
184186

185187
user_available_services: list[dict] = await get_services_for_user_in_product(
186-
request.app, user_id, product_name, only_key_versions=True
188+
app, user_id, product_name, only_key_versions=True
187189
)
188190

189191
db_projects, db_project_types, total_number_projects = await db.list_projects_dicts(
@@ -202,15 +204,18 @@ async def list_projects_full_depth(
202204
order_by=order_by,
203205
)
204206

205-
db_projects = await _batch_update_list_of_project_dict(request.app, db_projects)
207+
# AGGREGATE data to the project from other sources, first some sources
208+
# as BATCH-update and then as PARALLEL-update
209+
db_projects = await _batch_update_list_of_project_dict(app, db_projects)
206210

207211
projects: list[ProjectDict] = await logged_gather(
208212
*(
209-
_update_project_dict(
210-
request,
213+
# state
214+
projects_service.add_project_states_for_user(
211215
user_id=user_id,
212216
project=prj,
213217
is_template=prj_type == ProjectTypeDB.TEMPLATE,
218+
app=app,
214219
)
215220
for prj, prj_type in zip(db_projects, db_project_types, strict=False)
216221
),

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

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
from servicelib.mimetype_constants import MIMETYPE_APPLICATION_JSON
4040
from servicelib.redis import get_project_locked_state
4141
from servicelib.rest_constants import RESPONSE_MODEL_POLICY
42+
from servicelib.utils import logged_gather
4243
from simcore_service_webserver.projects.models import ProjectDict
4344

4445
from .._meta import API_VTAG as VTAG
@@ -61,7 +62,10 @@
6162
ProjectsListQueryParams,
6263
ProjectsSearchQueryParams,
6364
)
64-
from ._permalink_api import update_or_pop_permalink_in_project
65+
from ._permalink_api import (
66+
aggregate_permalink_in_project,
67+
update_or_pop_permalink_in_project,
68+
)
6569
from .exceptions import (
6670
ProjectDeleteError,
6771
ProjectInvalidRightsError,
@@ -252,7 +256,7 @@ async def list_projects_full_search(request: web.Request):
252256
tag_ids_list = query_params.tag_ids_list()
253257

254258
projects, total_number_of_projects = await _crud_api_read.list_projects_full_depth(
255-
request,
259+
request.app,
256260
user_id=req_ctx.user_id,
257261
product_name=req_ctx.product_name,
258262
trashed=query_params.filters.trashed,
@@ -264,8 +268,20 @@ async def list_projects_full_search(request: web.Request):
264268
order_by=OrderBy.model_construct(**query_params.order_by.model_dump()),
265269
)
266270

271+
updated_projects: list[ProjectDict] = await logged_gather(
272+
# AGGREGATE data to the project from other sources and
273+
# that depend on the **request**.
274+
*(
275+
# permalink
276+
aggregate_permalink_in_project(request, project=prj)
277+
for prj in projects
278+
),
279+
reraise=True,
280+
max_concurrency=100,
281+
)
282+
267283
return _create_page_response(
268-
projects=projects,
284+
projects=updated_projects,
269285
request_url=request.url,
270286
total=total_number_of_projects,
271287
limit=query_params.limit,
@@ -486,9 +502,9 @@ async def delete_project(request: web.Request):
486502

487503
await projects_service.submit_delete_project_task(
488504
request.app,
489-
path_params.project_id,
490-
req_ctx.user_id,
491-
request.headers.get(
505+
project_uuid=path_params.project_id,
506+
user_id=req_ctx.user_id,
507+
simcore_user_agent=request.headers.get(
492508
X_SIMCORE_USER_AGENT, UNDEFINED_DEFAULT_SIMCORE_USER_AGENT_VALUE
493509
),
494510
)

0 commit comments

Comments
 (0)