Skip to content

Commit d8f6823

Browse files
continue fixing
1 parent be6b8c5 commit d8f6823

File tree

5 files changed

+55
-51
lines changed

5 files changed

+55
-51
lines changed

packages/pytest-simcore/src/pytest_simcore/helpers/webserver_projects.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ async def create_project(
9090
},
9191
)
9292

93+
new_project["workbench"] = workbench
94+
9395
# Update project_nodes
9496

9597
if params_override and (

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,22 @@ async def _execute_without_permission_check(
276276
conn, project_id=db_prj["id"]
277277
)
278278
user_email = await self._get_user_email(conn, db_prj["prj_owner"])
279+
280+
# NOTE: experiment TODO: remove Nones from workbench
281+
workbench = db_prj["workbench"]
282+
_temp_workbench = {}
283+
for node_id, node_data in workbench.items():
284+
_temp_workbench[node_id] = {}
285+
for item, value in node_data.items():
286+
if value is None:
287+
if item in ["outputs", "inputs"]:
288+
_temp_workbench[node_id][item] = {}
289+
if item in ["inputNodes"]:
290+
_temp_workbench[node_id][item] = []
291+
continue
292+
_temp_workbench[node_id][item] = value
293+
db_prj["workbench"] = _temp_workbench
294+
279295
api_projects.append(convert_to_schema_names(db_prj, user_email))
280296
project_types.append(db_prj["type"])
281297

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

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import logging
22

33
import sqlalchemy as sa
4-
54
from aiohttp import web
65
from models_library.projects import ProjectID
76
from models_library.projects_nodes import Node, PartialNode
@@ -10,8 +9,8 @@
109
from simcore_postgres_database.webserver_models import projects_nodes
1110
from sqlalchemy.ext.asyncio import AsyncConnection
1211

13-
from .exceptions import NodeNotFoundError
1412
from ..db.plugin import get_asyncpg_engine
13+
from .exceptions import NodeNotFoundError
1514

1615
_logger = logging.getLogger(__name__)
1716

@@ -36,17 +35,15 @@
3635
]
3736

3837

39-
async def get(
38+
async def get_node(
4039
app: web.Application,
4140
connection: AsyncConnection | None = None,
4241
*,
4342
project_id: ProjectID,
4443
node_id: NodeID,
4544
) -> Node:
4645
async with transaction_context(get_asyncpg_engine(app), connection) as conn:
47-
get_stmt = sa.select(
48-
*_SELECTION_PROJECTS_NODES_DB_ARGS
49-
).where(
46+
get_stmt = sa.select(*_SELECTION_PROJECTS_NODES_DB_ARGS).where(
5047
(projects_nodes.c.project_uuid == f"{project_id}")
5148
& (projects_nodes.c.node_id == f"{node_id}")
5249
)
@@ -57,29 +54,31 @@ async def get(
5754
row = await result.first()
5855
if row is None:
5956
raise NodeNotFoundError(
60-
project_uuid=f"{project_id}",
61-
node_uuid=f"{node_id}"
57+
project_uuid=f"{project_id}", node_uuid=f"{node_id}"
6258
)
6359
assert row # nosec
6460
return Node.model_validate(row, from_attributes=True)
6561

6662

67-
async def update(
63+
async def update_node(
6864
app: web.Application,
6965
connection: AsyncConnection | None = None,
7066
*,
7167
project_id: ProjectID,
7268
node_id: NodeID,
7369
partial_node: PartialNode,
74-
) -> None:
75-
values = partial_node.model_dump(mode="json", exclude_unset=True)
76-
70+
) -> Node:
7771
async with transaction_context(get_asyncpg_engine(app), connection) as conn:
78-
await conn.stream(
72+
result = await conn.stream(
7973
projects_nodes.update()
80-
.values(**values)
74+
.values(**partial_node.model_dump(mode="json", exclude_unset=True))
8175
.where(
8276
(projects_nodes.c.project_uuid == f"{project_id}")
8377
& (projects_nodes.c.node_id == f"{node_id}")
8478
)
79+
.returning(*_SELECTION_PROJECTS_NODES_DB_ARGS)
8580
)
81+
assert result # nosec
82+
row = await result.first()
83+
assert row # nosec
84+
return Node.model_validate(row, from_attributes=True)

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

Lines changed: 11 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -217,36 +217,14 @@ def _reraise_if_not_unique_uuid_error(err: UniqueViolation):
217217
selected_values["tags"] = project_tag_ids
218218

219219
# NOTE: this will at some point completely replace workbench in the DB
220-
if selected_values["workbench"]:
220+
if project_nodes:
221221
project_nodes_repo = ProjectNodesRepo(
222222
project_uuid=project_uuid
223223
)
224-
if project_nodes is None:
225-
project_nodes = {
226-
NodeID(node_id): ProjectNodeCreate(
227-
node_id=NodeID(node_id),
228-
required_resources={},
229-
**node_info,
230-
)
231-
for node_id, node_info in selected_values[
232-
"workbench"
233-
].items()
234-
}
235-
236-
nodes = [
237-
project_nodes.get(
238-
NodeID(node_id),
239-
ProjectNodeCreate(
240-
node_id=NodeID(node_id),
241-
required_resources={},
242-
**node_info,
243-
),
244-
)
245-
for node_id, node_info in selected_values[
246-
"workbench"
247-
].items()
248-
]
249-
await project_nodes_repo.add(conn, nodes=nodes)
224+
225+
await project_nodes_repo.add(
226+
conn, nodes=list(project_nodes.values())
227+
)
250228
return selected_values
251229

252230
async def insert_project(
@@ -392,7 +370,9 @@ def _create_private_workspace_query(
392370
private_workspace_query = (
393371
sa.select(
394372
*PROJECT_DB_COLS,
395-
workbench_subquery.c.workbench,
373+
sa.func.coalesce(workbench_subquery.c.workbench, "{}").label(
374+
"workbench"
375+
),
396376
access_rights_subquery.c.access_rights,
397377
projects_to_products.c.product_name,
398378
projects_to_folders.c.folder_id,
@@ -479,7 +459,9 @@ def _create_shared_workspace_query(
479459
shared_workspace_query = (
480460
sa.select(
481461
*PROJECT_DB_COLS,
482-
workbench_subquery.c.workbench,
462+
sa.func.coalesce(workbench_subquery.c.workbench, "{}").label(
463+
"workbench"
464+
),
483465
workspace_access_rights_subquery.c.access_rights,
484466
projects_to_products.c.product_name,
485467
projects_to_folders.c.folder_id,

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

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1001,7 +1001,7 @@ async def update_project_node_state(
10011001
new_node_data={"state": {"currentStatus": new_state}},
10021002
)
10031003

1004-
await _projects_nodes_repository.update(
1004+
await _projects_nodes_repository.update_node(
10051005
app,
10061006
project_id=project_id,
10071007
node_id=node_id,
@@ -1073,7 +1073,7 @@ async def patch_project_node(
10731073
new_node_data=_node_patch_exclude_unset,
10741074
)
10751075

1076-
await _projects_nodes_repository.update(
1076+
await _projects_nodes_repository.update_node(
10771077
app,
10781078
project_id=project_id,
10791079
node_id=node_id,
@@ -1141,7 +1141,7 @@ async def update_project_node_outputs(
11411141
new_node_data={"outputs": new_outputs, "runHash": new_run_hash},
11421142
)
11431143

1144-
await _projects_nodes_repository.update(
1144+
await _projects_nodes_repository.update_node(
11451145
app,
11461146
project_id=project_id,
11471147
node_id=node_id,
@@ -1574,15 +1574,20 @@ async def add_project_states_for_user(
15741574
node_id,
15751575
node_state,
15761576
) in computation_task.pipeline_details.node_states.items():
1577-
prj_node = project["workbench"].get(str(node_id))
1578-
if prj_node is None:
1577+
try:
1578+
# TODO: add UoW
1579+
node = await _projects_nodes_repository.get_node(
1580+
app, project_id=project["uuid"], node_id=node_id
1581+
)
1582+
except NodeNotFoundError:
15791583
continue
15801584
node_state_dict = json.loads(
15811585
node_state.model_dump_json(by_alias=True, exclude_unset=True)
15821586
)
1583-
prj_node.setdefault("state", {}).update(node_state_dict)
1584-
prj_node_progress = node_state_dict.get("progress", None) or 0
1585-
prj_node.update({"progress": round(prj_node_progress * 100.0)})
1587+
if node.state is None:
1588+
node.state = NodeState()
1589+
node.state = node.state.model_copy(update=node_state_dict)
1590+
node.progress = round((node.state.progress or 0) * 100)
15861591

15871592
project["state"] = ProjectState(
15881593
locked=lock_state, state=ProjectRunningState(value=running_state)

0 commit comments

Comments
 (0)