Skip to content

Commit 3b31c94

Browse files
fix workbench reference
1 parent de9d2ae commit 3b31c94

File tree

3 files changed

+53
-9
lines changed

3 files changed

+53
-9
lines changed

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

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from models_library.utils.change_case import camel_to_snake, snake_to_camel
1717
from pydantic import ValidationError
1818
from simcore_postgres_database.models.project_to_groups import project_to_groups
19+
from simcore_postgres_database.models.projects_nodes import projects_nodes
1920
from simcore_postgres_database.models.projects_to_products import projects_to_products
2021
from simcore_postgres_database.webserver_models import ProjectType, projects
2122
from sqlalchemy.dialects.postgresql import insert as pg_insert
@@ -110,6 +111,45 @@ def assemble_array_groups(user_groups: list[RowProxy]) -> str:
110111
)
111112

112113

114+
def _make_workbench_subquery():
115+
return (
116+
sa.select(
117+
projects_nodes.c.project_uuid,
118+
sa.func.jsonb_object_agg(
119+
projects_nodes.c.node_id,
120+
sa.func.jsonb_build_object(
121+
"key",
122+
projects_nodes.c.key,
123+
"version",
124+
projects_nodes.c.version,
125+
"label",
126+
projects_nodes.c.label,
127+
"input_access",
128+
projects_nodes.c.input_access,
129+
"input_nodes",
130+
projects_nodes.c.input_nodes,
131+
"inputs",
132+
projects_nodes.c.inputs,
133+
"inputs_required",
134+
projects_nodes.c.inputs_required,
135+
"output_nodes",
136+
projects_nodes.c.output_nodes,
137+
"outputs",
138+
projects_nodes.c.outputs,
139+
"run_hash",
140+
projects_nodes.c.run_hash,
141+
"state",
142+
projects_nodes.c.state,
143+
"parent",
144+
projects_nodes.c.parent,
145+
"boot_options",
146+
projects_nodes.c.boot_options,
147+
),
148+
).label("workbench"),
149+
).group_by(projects_nodes.c.project_uuid)
150+
).subquery("workbench_subquery")
151+
152+
113153
class BaseProjectDB:
114154
@classmethod
115155
async def _get_everyone_group(cls, conn: SAConnection) -> RowProxy:
@@ -278,7 +318,7 @@ async def _get_project(
278318
query = (
279319
sa.select(
280320
*PROJECT_DB_COLS,
281-
projects.c.workbench,
321+
_make_workbench_subquery().c.workbench,
282322
users.c.primary_gid.label("trashed_by_primary_gid"),
283323
access_rights_subquery.c.access_rights,
284324
)

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

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,11 @@ def _reraise_if_not_unique_uuid_error(err: UniqueViolation):
206206
project_index = None
207207
project_uuid = ProjectID(f"{insert_values['uuid']}")
208208

209-
workbench = insert_values.pop("workbench")
209+
workbench = (
210+
insert_values.pop("workbench")
211+
if "workbench" in insert_values
212+
else None
213+
)
210214
try:
211215
result: ResultProxy = await conn.execute(
212216
projects.insert()
@@ -223,7 +227,8 @@ def _reraise_if_not_unique_uuid_error(err: UniqueViolation):
223227
assert row # nosec
224228

225229
selected_values = ProjectDict(row.items())
226-
selected_values["workbench"] = workbench
230+
if workbench:
231+
selected_values["workbench"] = workbench
227232
project_index = selected_values.pop("id")
228233

229234
except UniqueViolation as err:
@@ -254,7 +259,7 @@ def _reraise_if_not_unique_uuid_error(err: UniqueViolation):
254259
selected_values["tags"] = project_tag_ids
255260

256261
# NOTE: this will at some point completely replace workbench in the DB
257-
if selected_values["workbench"]:
262+
if workbench:
258263
project_nodes_repo = ProjectNodesRepo(
259264
project_uuid=project_uuid
260265
)
@@ -265,9 +270,7 @@ def _reraise_if_not_unique_uuid_error(err: UniqueViolation):
265270
required_resources={},
266271
**node_info,
267272
)
268-
for node_id, node_info in selected_values[
269-
"workbench"
270-
].items()
273+
for node_id, node_info in workbench.items()
271274
}
272275

273276
nodes = [

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -555,8 +555,9 @@ def _check_required_input(required_input_key: KeyIDStr) -> None:
555555
if output_entry is None:
556556
unset_outputs_in_upstream.append((source_output_key, source_node.label))
557557

558-
for required_input in node.inputs_required:
559-
_check_required_input(required_input)
558+
if node.inputs_required:
559+
for required_input in node.inputs_required:
560+
_check_required_input(required_input)
560561

561562
node_with_required_inputs = node.label
562563
if unset_required_inputs:

0 commit comments

Comments
 (0)