|
16 | 16 | from models_library.utils.change_case import camel_to_snake, snake_to_camel |
17 | 17 | from pydantic import ValidationError |
18 | 18 | from simcore_postgres_database.models.project_to_groups import project_to_groups |
| 19 | +from simcore_postgres_database.models.projects_nodes import projects_nodes |
19 | 20 | from simcore_postgres_database.models.projects_to_products import projects_to_products |
20 | 21 | from simcore_postgres_database.webserver_models import ProjectType, projects |
21 | 22 | from sqlalchemy.dialects.postgresql import insert as pg_insert |
@@ -51,6 +52,45 @@ class ProjectAccessRights(Enum): |
51 | 52 | VIEWER = {"read": True, "write": False, "delete": False} |
52 | 53 |
|
53 | 54 |
|
| 55 | +def _build_workbench_subquery(): |
| 56 | + return ( |
| 57 | + sa.select( |
| 58 | + projects_nodes.c.project_uuid, |
| 59 | + sa.func.jsonb_object_agg( |
| 60 | + projects_nodes.c.node_id, |
| 61 | + sa.func.jsonb_build_object( |
| 62 | + "key", |
| 63 | + projects_nodes.c.key, |
| 64 | + "version", |
| 65 | + projects_nodes.c.version, |
| 66 | + "label", |
| 67 | + projects_nodes.c.label, |
| 68 | + "input_access", |
| 69 | + projects_nodes.c.input_access, |
| 70 | + "input_nodes", |
| 71 | + projects_nodes.c.input_nodes, |
| 72 | + "inputs", |
| 73 | + projects_nodes.c.inputs, |
| 74 | + "inputs_required", |
| 75 | + projects_nodes.c.inputs_required, |
| 76 | + "output_nodes", |
| 77 | + projects_nodes.c.output_nodes, |
| 78 | + "outputs", |
| 79 | + projects_nodes.c.outputs, |
| 80 | + "run_hash", |
| 81 | + projects_nodes.c.run_hash, |
| 82 | + "state", |
| 83 | + projects_nodes.c.state, |
| 84 | + "parent", |
| 85 | + projects_nodes.c.parent, |
| 86 | + "boot_options", |
| 87 | + projects_nodes.c.boot_options, |
| 88 | + ), |
| 89 | + ).label("workbench"), |
| 90 | + ).group_by(projects_nodes.c.project_uuid) |
| 91 | + ).subquery("workbench_subquery") |
| 92 | + |
| 93 | + |
54 | 94 | def create_project_access_rights( |
55 | 95 | gid: int, access: ProjectAccessRights |
56 | 96 | ) -> dict[str, dict[str, bool]]: |
@@ -278,7 +318,7 @@ async def _get_project( |
278 | 318 | query = ( |
279 | 319 | sa.select( |
280 | 320 | *PROJECT_DB_COLS, |
281 | | - projects.c.workbench, |
| 321 | + _build_workbench_subquery().c.workbench, |
282 | 322 | users.c.primary_gid.label("trashed_by_primary_gid"), |
283 | 323 | access_rights_subquery.c.access_rights, |
284 | 324 | ) |
|
0 commit comments