From f75b69a64a4c7a7f3cf5182a6ea44beb59c56a37 Mon Sep 17 00:00:00 2001 From: Andrei Neagu Date: Fri, 24 Oct 2025 17:08:01 +0200 Subject: [PATCH 1/9] added code in postgres --- .../a85557c02d71_add_projects_optionals.py | 45 +++++++++++++ .../models/projects_optionals.py | 32 ++++++++++ .../utils_projects_optionals.py | 22 +++++++ .../tests/test_utils_projects_optionals.py | 63 +++++++++++++++++++ 4 files changed, 162 insertions(+) create mode 100644 packages/postgres-database/src/simcore_postgres_database/migration/versions/a85557c02d71_add_projects_optionals.py create mode 100644 packages/postgres-database/src/simcore_postgres_database/models/projects_optionals.py create mode 100644 packages/postgres-database/src/simcore_postgres_database/utils_projects_optionals.py create mode 100644 packages/postgres-database/tests/test_utils_projects_optionals.py diff --git a/packages/postgres-database/src/simcore_postgres_database/migration/versions/a85557c02d71_add_projects_optionals.py b/packages/postgres-database/src/simcore_postgres_database/migration/versions/a85557c02d71_add_projects_optionals.py new file mode 100644 index 00000000000..7de1452a671 --- /dev/null +++ b/packages/postgres-database/src/simcore_postgres_database/migration/versions/a85557c02d71_add_projects_optionals.py @@ -0,0 +1,45 @@ +"""add_projects_optionals + +Revision ID: a85557c02d71 +Revises: 5756d9282a0a +Create Date: 2025-10-24 15:03:32.846288+00:00 + +""" + +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision = "a85557c02d71" +down_revision = "5756d9282a0a" +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table( + "projects_optionals", + sa.Column("project_uuid", sa.String(), nullable=False), + sa.Column( + "allow_guests_to_push_states_and_output_ports", + sa.Boolean(), + server_default=sa.text("false"), + nullable=False, + ), + sa.ForeignKeyConstraint( + ["project_uuid"], + ["projects.uuid"], + name="fk_projects_optionals_project_uuid_projects", + onupdate="CASCADE", + ondelete="CASCADE", + ), + sa.PrimaryKeyConstraint("project_uuid"), + ) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table("projects_optionals") + # ### end Alembic commands ### diff --git a/packages/postgres-database/src/simcore_postgres_database/models/projects_optionals.py b/packages/postgres-database/src/simcore_postgres_database/models/projects_optionals.py new file mode 100644 index 00000000000..e309ec4da94 --- /dev/null +++ b/packages/postgres-database/src/simcore_postgres_database/models/projects_optionals.py @@ -0,0 +1,32 @@ +import sqlalchemy as sa + +from ._common import RefActions +from .base import metadata +from .projects import projects + +projects_optionals = sa.Table( + "projects_optionals", + metadata, + sa.Column( + "project_uuid", + sa.String, + sa.ForeignKey( + projects.c.uuid, + name="fk_projects_optionals_project_uuid_projects", + ondelete=RefActions.CASCADE, + onupdate=RefActions.CASCADE, + ), + primary_key=True, + doc="project reference and primary key for this table", + ), + sa.Column( + "allow_guests_to_push_states_and_output_ports", + sa.Boolean(), + nullable=False, + server_default=sa.sql.expression.false(), + doc=( + "When True, guest will save the state of a service " + "and also push the data to the output ports" + ), + ), +) diff --git a/packages/postgres-database/src/simcore_postgres_database/utils_projects_optionals.py b/packages/postgres-database/src/simcore_postgres_database/utils_projects_optionals.py new file mode 100644 index 00000000000..5531b131de6 --- /dev/null +++ b/packages/postgres-database/src/simcore_postgres_database/utils_projects_optionals.py @@ -0,0 +1,22 @@ +import sqlalchemy as sa +from aiopg.sa.connection import SAConnection + +from .models.projects_optionals import projects_optionals + + +class CouldNotCreateOrUpdateUserPreferenceError(Exception): ... + + +class BasePreferencesRepo: + model: sa.Table = projects_optionals + + @classmethod + async def allows_guests_to_push_states_and_output_ports( + cls, connection: SAConnection, *, project_uuid: str + ) -> bool: + result: bool | None = await connection.scalar( + sa.select(cls.model.c.allow_guests_to_push_states_and_output_ports).where( + cls.model.c.project_uuid == project_uuid + ) + ) + return result if result is not None else False diff --git a/packages/postgres-database/tests/test_utils_projects_optionals.py b/packages/postgres-database/tests/test_utils_projects_optionals.py new file mode 100644 index 00000000000..84a6ec14013 --- /dev/null +++ b/packages/postgres-database/tests/test_utils_projects_optionals.py @@ -0,0 +1,63 @@ +# pylint: disable=redefined-outer-name + +from collections.abc import Awaitable, Callable + +import pytest +import sqlalchemy as sa +from aiopg.sa.connection import SAConnection +from aiopg.sa.result import RowProxy +from simcore_postgres_database.models.projects_optionals import projects_optionals +from simcore_postgres_database.utils_projects_optionals import BasePreferencesRepo + + +@pytest.fixture +async def fake_user( + connection: SAConnection, + create_fake_user: Callable[..., Awaitable[RowProxy]], +) -> RowProxy: + user: RowProxy = await create_fake_user(connection, name=f"user.{__name__}") + return user + + +@pytest.fixture +async def fake_project( + connection: SAConnection, + fake_user: RowProxy, + create_fake_project: Callable[..., Awaitable[RowProxy]], + create_fake_nodes: Callable[..., Awaitable[RowProxy]], +) -> RowProxy: + project: RowProxy = await create_fake_project(connection, fake_user, hidden=True) + await create_fake_nodes(project) + return project + + +async def test_something( + connection: SAConnection, + create_fake_user: Callable[..., Awaitable[RowProxy]], + create_fake_project: Callable[..., Awaitable[RowProxy]], +): + user: RowProxy = await create_fake_user(connection) + project: RowProxy = await create_fake_project(connection, user, hidden=True) + + assert ( + await BasePreferencesRepo.allows_guests_to_push_states_and_output_ports( + connection, project_uuid=project["uuid"] + ) + is False + ) + + # add the entry in the table + + await connection.execute( + sa.insert(projects_optionals).values( + project_uuid=project["uuid"], + allow_guests_to_push_states_and_output_ports=True, + ) + ) + + assert ( + await BasePreferencesRepo.allows_guests_to_push_states_and_output_ports( + connection, project_uuid=project["uuid"] + ) + is True + ) From 1b9ebdd711de8e972608dc4c3138ec30a12ec16e Mon Sep 17 00:00:00 2001 From: Andrei Neagu Date: Fri, 24 Oct 2025 17:10:45 +0200 Subject: [PATCH 2/9] refactoed --- .../utils_projects_optionals.py | 11 +++++++++++ .../tests/test_utils_projects_optionals.py | 10 ++-------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/packages/postgres-database/src/simcore_postgres_database/utils_projects_optionals.py b/packages/postgres-database/src/simcore_postgres_database/utils_projects_optionals.py index 5531b131de6..95538324732 100644 --- a/packages/postgres-database/src/simcore_postgres_database/utils_projects_optionals.py +++ b/packages/postgres-database/src/simcore_postgres_database/utils_projects_optionals.py @@ -20,3 +20,14 @@ async def allows_guests_to_push_states_and_output_ports( ) ) return result if result is not None else False + + @classmethod + async def set_allows_guests_to_push_states_and_output_ports( + cls, connection: SAConnection, *, project_uuid: str + ) -> None: + await connection.execute( + sa.insert(projects_optionals).values( + project_uuid=project_uuid, + allow_guests_to_push_states_and_output_ports=True, + ) + ) diff --git a/packages/postgres-database/tests/test_utils_projects_optionals.py b/packages/postgres-database/tests/test_utils_projects_optionals.py index 84a6ec14013..c7aa9925445 100644 --- a/packages/postgres-database/tests/test_utils_projects_optionals.py +++ b/packages/postgres-database/tests/test_utils_projects_optionals.py @@ -3,10 +3,8 @@ from collections.abc import Awaitable, Callable import pytest -import sqlalchemy as sa from aiopg.sa.connection import SAConnection from aiopg.sa.result import RowProxy -from simcore_postgres_database.models.projects_optionals import projects_optionals from simcore_postgres_database.utils_projects_optionals import BasePreferencesRepo @@ -47,12 +45,8 @@ async def test_something( ) # add the entry in the table - - await connection.execute( - sa.insert(projects_optionals).values( - project_uuid=project["uuid"], - allow_guests_to_push_states_and_output_ports=True, - ) + await BasePreferencesRepo.set_allows_guests_to_push_states_and_output_ports( + connection, project_uuid=project["uuid"] ) assert ( From b5cc9e815703421aa35cb3b2ceeec08a68768501 Mon Sep 17 00:00:00 2001 From: Andrei Neagu Date: Fri, 24 Oct 2025 17:11:04 +0200 Subject: [PATCH 3/9] rename --- .../src/simcore_postgres_database/utils_projects_optionals.py | 2 +- .../postgres-database/tests/test_utils_projects_optionals.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/postgres-database/src/simcore_postgres_database/utils_projects_optionals.py b/packages/postgres-database/src/simcore_postgres_database/utils_projects_optionals.py index 95538324732..04127c730e9 100644 --- a/packages/postgres-database/src/simcore_postgres_database/utils_projects_optionals.py +++ b/packages/postgres-database/src/simcore_postgres_database/utils_projects_optionals.py @@ -22,7 +22,7 @@ async def allows_guests_to_push_states_and_output_ports( return result if result is not None else False @classmethod - async def set_allows_guests_to_push_states_and_output_ports( + async def set_allow_guests_to_push_states_and_output_ports( cls, connection: SAConnection, *, project_uuid: str ) -> None: await connection.execute( diff --git a/packages/postgres-database/tests/test_utils_projects_optionals.py b/packages/postgres-database/tests/test_utils_projects_optionals.py index c7aa9925445..4bd37c41a1b 100644 --- a/packages/postgres-database/tests/test_utils_projects_optionals.py +++ b/packages/postgres-database/tests/test_utils_projects_optionals.py @@ -45,7 +45,7 @@ async def test_something( ) # add the entry in the table - await BasePreferencesRepo.set_allows_guests_to_push_states_and_output_ports( + await BasePreferencesRepo.set_allow_guests_to_push_states_and_output_ports( connection, project_uuid=project["uuid"] ) From f5d29fe6ec27f51ef103a4db25a4cac86ec86de3 Mon Sep 17 00:00:00 2001 From: Andrei Neagu Date: Fri, 24 Oct 2025 17:20:38 +0200 Subject: [PATCH 4/9] refactored --- .../utils_projects_optionals.py | 32 +++++++++++-------- .../tests/test_utils_projects_optionals.py | 8 +++-- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/packages/postgres-database/src/simcore_postgres_database/utils_projects_optionals.py b/packages/postgres-database/src/simcore_postgres_database/utils_projects_optionals.py index 04127c730e9..269b961caf8 100644 --- a/packages/postgres-database/src/simcore_postgres_database/utils_projects_optionals.py +++ b/packages/postgres-database/src/simcore_postgres_database/utils_projects_optionals.py @@ -1,5 +1,9 @@ import sqlalchemy as sa -from aiopg.sa.connection import SAConnection +from simcore_postgres_database.utils_repos import ( + pass_or_acquire_connection, + transaction_context, +) +from sqlalchemy.ext.asyncio import AsyncEngine from .models.projects_optionals import projects_optionals @@ -12,22 +16,24 @@ class BasePreferencesRepo: @classmethod async def allows_guests_to_push_states_and_output_ports( - cls, connection: SAConnection, *, project_uuid: str + cls, async_engine: AsyncEngine, *, project_uuid: str ) -> bool: - result: bool | None = await connection.scalar( - sa.select(cls.model.c.allow_guests_to_push_states_and_output_ports).where( - cls.model.c.project_uuid == project_uuid + async with pass_or_acquire_connection(async_engine) as connection: + result: bool | None = await connection.scalar( + sa.select( + cls.model.c.allow_guests_to_push_states_and_output_ports + ).where(cls.model.c.project_uuid == project_uuid) ) - ) - return result if result is not None else False + return result if result is not None else False @classmethod async def set_allow_guests_to_push_states_and_output_ports( - cls, connection: SAConnection, *, project_uuid: str + cls, async_engine: AsyncEngine, *, project_uuid: str ) -> None: - await connection.execute( - sa.insert(projects_optionals).values( - project_uuid=project_uuid, - allow_guests_to_push_states_and_output_ports=True, + async with transaction_context(async_engine) as connection: + await connection.execute( + sa.insert(projects_optionals).values( + project_uuid=project_uuid, + allow_guests_to_push_states_and_output_ports=True, + ) ) - ) diff --git a/packages/postgres-database/tests/test_utils_projects_optionals.py b/packages/postgres-database/tests/test_utils_projects_optionals.py index 4bd37c41a1b..330c50d868e 100644 --- a/packages/postgres-database/tests/test_utils_projects_optionals.py +++ b/packages/postgres-database/tests/test_utils_projects_optionals.py @@ -6,6 +6,7 @@ from aiopg.sa.connection import SAConnection from aiopg.sa.result import RowProxy from simcore_postgres_database.utils_projects_optionals import BasePreferencesRepo +from sqlalchemy.ext.asyncio import AsyncEngine @pytest.fixture @@ -30,6 +31,7 @@ async def fake_project( async def test_something( + asyncpg_engine: AsyncEngine, connection: SAConnection, create_fake_user: Callable[..., Awaitable[RowProxy]], create_fake_project: Callable[..., Awaitable[RowProxy]], @@ -39,19 +41,19 @@ async def test_something( assert ( await BasePreferencesRepo.allows_guests_to_push_states_and_output_ports( - connection, project_uuid=project["uuid"] + asyncpg_engine, project_uuid=project["uuid"] ) is False ) # add the entry in the table await BasePreferencesRepo.set_allow_guests_to_push_states_and_output_ports( - connection, project_uuid=project["uuid"] + asyncpg_engine, project_uuid=project["uuid"] ) assert ( await BasePreferencesRepo.allows_guests_to_push_states_and_output_ports( - connection, project_uuid=project["uuid"] + asyncpg_engine, project_uuid=project["uuid"] ) is True ) From 2184e6a1c74b954efe70620abae2e0ab0392ca3a Mon Sep 17 00:00:00 2001 From: Andrei Neagu Date: Fri, 24 Oct 2025 17:31:40 +0200 Subject: [PATCH 5/9] guests can save ports and state --- .../garbage_collector/_core_orphans.py | 10 ++++++++++ .../studies_dispatcher/_studies_access.py | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/services/web/server/src/simcore_service_webserver/garbage_collector/_core_orphans.py b/services/web/server/src/simcore_service_webserver/garbage_collector/_core_orphans.py index 31d79dced2e..83de85b8b74 100644 --- a/services/web/server/src/simcore_service_webserver/garbage_collector/_core_orphans.py +++ b/services/web/server/src/simcore_service_webserver/garbage_collector/_core_orphans.py @@ -12,7 +12,9 @@ from servicelib.common_headers import UNDEFINED_DEFAULT_SIMCORE_USER_AGENT_VALUE from servicelib.logging_utils import log_catch, log_context from servicelib.utils import limited_as_completed, limited_gather +from simcore_postgres_database.utils_projects_optionals import BasePreferencesRepo +from ..db.plugin import get_asyncpg_engine from ..dynamic_scheduler import api as dynamic_scheduler_service from ..projects._projects_service import ( is_node_id_present_in_any_project_workbench, @@ -54,6 +56,14 @@ async def _remove_service( ) ) + if ( + user_role == UserRole.GUEST + and BasePreferencesRepo.allows_guests_to_push_states_and_output_ports( + get_asyncpg_engine(app), project_uuid=f"{service.project_id}" + ) + ): + save_service_state = True + with ( log_catch(_logger, reraise=False), log_context( diff --git a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_studies_access.py b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_studies_access.py index 3b027ee4fa1..c692ab49637 100644 --- a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_studies_access.py +++ b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_studies_access.py @@ -25,8 +25,10 @@ from models_library.projects import ProjectID from servicelib.aiohttp import status from servicelib.aiohttp.typing_extension import Handler +from simcore_postgres_database.utils_projects_optionals import BasePreferencesRepo from ..constants import INDEX_RESOURCE_NAME +from ..db.plugin import get_asyncpg_engine from ..director_v2 import director_v2_service from ..dynamic_scheduler import api as dynamic_scheduler_service from ..products import products_web @@ -221,6 +223,14 @@ async def copy_study_to_account( request.app, project_id=ProjectID(project["uuid"]) ) + # set the same option in the new project from the tempalte + if await BasePreferencesRepo.allows_guests_to_push_states_and_output_ports( + get_asyncpg_engine(request.app), project_uuid=template_project["uuid"] + ): + await BasePreferencesRepo.set_allow_guests_to_push_states_and_output_ports( + get_asyncpg_engine(request.app), project_uuid=project["uuid"] + ) + return project_uuid From 7eb489a5d2fd0114286f1be1528a164f4cd24148 Mon Sep 17 00:00:00 2001 From: Andrei Neagu Date: Fri, 24 Oct 2025 18:07:31 +0200 Subject: [PATCH 6/9] fixed feature working as expected --- .../utils_projects_optionals.py | 2 +- .../tests/test_utils_projects_optionals.py | 8 ++++---- .../garbage_collector/_core_orphans.py | 4 ++-- .../projects/_projects_service.py | 9 +++++++++ .../studies_dispatcher/_studies_access.py | 6 +++--- 5 files changed, 19 insertions(+), 10 deletions(-) diff --git a/packages/postgres-database/src/simcore_postgres_database/utils_projects_optionals.py b/packages/postgres-database/src/simcore_postgres_database/utils_projects_optionals.py index 269b961caf8..112bb9f7d66 100644 --- a/packages/postgres-database/src/simcore_postgres_database/utils_projects_optionals.py +++ b/packages/postgres-database/src/simcore_postgres_database/utils_projects_optionals.py @@ -11,7 +11,7 @@ class CouldNotCreateOrUpdateUserPreferenceError(Exception): ... -class BasePreferencesRepo: +class BaseProjectOptionalsRepo: model: sa.Table = projects_optionals @classmethod diff --git a/packages/postgres-database/tests/test_utils_projects_optionals.py b/packages/postgres-database/tests/test_utils_projects_optionals.py index 330c50d868e..fd5e8052ee0 100644 --- a/packages/postgres-database/tests/test_utils_projects_optionals.py +++ b/packages/postgres-database/tests/test_utils_projects_optionals.py @@ -5,7 +5,7 @@ import pytest from aiopg.sa.connection import SAConnection from aiopg.sa.result import RowProxy -from simcore_postgres_database.utils_projects_optionals import BasePreferencesRepo +from simcore_postgres_database.utils_projects_optionals import BaseProjectOptionalsRepo from sqlalchemy.ext.asyncio import AsyncEngine @@ -40,19 +40,19 @@ async def test_something( project: RowProxy = await create_fake_project(connection, user, hidden=True) assert ( - await BasePreferencesRepo.allows_guests_to_push_states_and_output_ports( + await BaseProjectOptionalsRepo.allows_guests_to_push_states_and_output_ports( asyncpg_engine, project_uuid=project["uuid"] ) is False ) # add the entry in the table - await BasePreferencesRepo.set_allow_guests_to_push_states_and_output_ports( + await BaseProjectOptionalsRepo.set_allow_guests_to_push_states_and_output_ports( asyncpg_engine, project_uuid=project["uuid"] ) assert ( - await BasePreferencesRepo.allows_guests_to_push_states_and_output_ports( + await BaseProjectOptionalsRepo.allows_guests_to_push_states_and_output_ports( asyncpg_engine, project_uuid=project["uuid"] ) is True diff --git a/services/web/server/src/simcore_service_webserver/garbage_collector/_core_orphans.py b/services/web/server/src/simcore_service_webserver/garbage_collector/_core_orphans.py index 83de85b8b74..e1634286ccc 100644 --- a/services/web/server/src/simcore_service_webserver/garbage_collector/_core_orphans.py +++ b/services/web/server/src/simcore_service_webserver/garbage_collector/_core_orphans.py @@ -12,7 +12,7 @@ from servicelib.common_headers import UNDEFINED_DEFAULT_SIMCORE_USER_AGENT_VALUE from servicelib.logging_utils import log_catch, log_context from servicelib.utils import limited_as_completed, limited_gather -from simcore_postgres_database.utils_projects_optionals import BasePreferencesRepo +from simcore_postgres_database.utils_projects_optionals import BaseProjectOptionalsRepo from ..db.plugin import get_asyncpg_engine from ..dynamic_scheduler import api as dynamic_scheduler_service @@ -58,7 +58,7 @@ async def _remove_service( if ( user_role == UserRole.GUEST - and BasePreferencesRepo.allows_guests_to_push_states_and_output_ports( + and await BaseProjectOptionalsRepo.allows_guests_to_push_states_and_output_ports( get_asyncpg_engine(app), project_uuid=f"{service.project_id}" ) ): diff --git a/services/web/server/src/simcore_service_webserver/projects/_projects_service.py b/services/web/server/src/simcore_service_webserver/projects/_projects_service.py index 9bd620d3d23..559578e1a05 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_projects_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_projects_service.py @@ -111,11 +111,13 @@ ProjectNodeCreate, ProjectNodesNodeNotFoundError, ) +from simcore_postgres_database.utils_projects_optionals import BaseProjectOptionalsRepo from simcore_postgres_database.webserver_models import ProjectType from ..application_settings import get_application_settings from ..catalog import catalog_service from ..constants import APP_FIRE_AND_FORGET_TASKS_KEY +from ..db.plugin import get_asyncpg_engine from ..director_v2 import director_v2_service from ..dynamic_scheduler import api as dynamic_scheduler_service from ..models import ClientSessionID @@ -817,6 +819,13 @@ async def _start_dynamic_service( # pylint: disable=too-many-statements # noqa save_state = await has_user_project_access_rights( request.app, project_id=project_uuid, user_id=user_id, permission="write" ) + if ( + user_role == UserRole.GUEST + and await BaseProjectOptionalsRepo.allows_guests_to_push_states_and_output_ports( + get_asyncpg_engine(request.app), project_uuid=project_uuid + ) + ): + save_state = True @exclusive( get_redis_lock_manager_client_sdk(request.app), diff --git a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_studies_access.py b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_studies_access.py index c692ab49637..6c473f23132 100644 --- a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_studies_access.py +++ b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_studies_access.py @@ -25,7 +25,7 @@ from models_library.projects import ProjectID from servicelib.aiohttp import status from servicelib.aiohttp.typing_extension import Handler -from simcore_postgres_database.utils_projects_optionals import BasePreferencesRepo +from simcore_postgres_database.utils_projects_optionals import BaseProjectOptionalsRepo from ..constants import INDEX_RESOURCE_NAME from ..db.plugin import get_asyncpg_engine @@ -224,10 +224,10 @@ async def copy_study_to_account( ) # set the same option in the new project from the tempalte - if await BasePreferencesRepo.allows_guests_to_push_states_and_output_ports( + if await BaseProjectOptionalsRepo.allows_guests_to_push_states_and_output_ports( get_asyncpg_engine(request.app), project_uuid=template_project["uuid"] ): - await BasePreferencesRepo.set_allow_guests_to_push_states_and_output_ports( + await BaseProjectOptionalsRepo.set_allow_guests_to_push_states_and_output_ports( get_asyncpg_engine(request.app), project_uuid=project["uuid"] ) From 36115e10ef5953870e97b71f9285ef67b74f01cb Mon Sep 17 00:00:00 2001 From: Andrei Neagu Date: Fri, 24 Oct 2025 18:11:16 +0200 Subject: [PATCH 7/9] typo --- .../studies_dispatcher/_studies_access.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_studies_access.py b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_studies_access.py index 6c473f23132..b4ca6099c06 100644 --- a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_studies_access.py +++ b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_studies_access.py @@ -223,7 +223,7 @@ async def copy_study_to_account( request.app, project_id=ProjectID(project["uuid"]) ) - # set the same option in the new project from the tempalte + # set the same option in the new project from the template if await BaseProjectOptionalsRepo.allows_guests_to_push_states_and_output_ports( get_asyncpg_engine(request.app), project_uuid=template_project["uuid"] ): From e49f75fd371a916e065aa0e98cea1551017154d6 Mon Sep 17 00:00:00 2001 From: Andrei Neagu Date: Fri, 24 Oct 2025 18:25:09 +0200 Subject: [PATCH 8/9] mypy --- .../src/simcore_service_webserver/projects/_projects_service.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/server/src/simcore_service_webserver/projects/_projects_service.py b/services/web/server/src/simcore_service_webserver/projects/_projects_service.py index 033427f54c1..334a0f2eca0 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_projects_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_projects_service.py @@ -823,7 +823,7 @@ async def _start_dynamic_service( # pylint: disable=too-many-statements # noqa if ( user_role == UserRole.GUEST and await BaseProjectOptionalsRepo.allows_guests_to_push_states_and_output_ports( - get_asyncpg_engine(request.app), project_uuid=project_uuid + get_asyncpg_engine(request.app), project_uuid=f"{project_uuid}" ) ): save_state = True From 5f93549f6693f9037188b3d9a917b5ae1a5d32ca Mon Sep 17 00:00:00 2001 From: Andrei Neagu Date: Fri, 24 Oct 2025 18:55:39 +0200 Subject: [PATCH 9/9] correct one --- .../garbage_collector/_core_orphans.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/services/web/server/src/simcore_service_webserver/garbage_collector/_core_orphans.py b/services/web/server/src/simcore_service_webserver/garbage_collector/_core_orphans.py index e1634286ccc..1f30eb9b13c 100644 --- a/services/web/server/src/simcore_service_webserver/garbage_collector/_core_orphans.py +++ b/services/web/server/src/simcore_service_webserver/garbage_collector/_core_orphans.py @@ -56,13 +56,13 @@ async def _remove_service( ) ) - if ( - user_role == UserRole.GUEST - and await BaseProjectOptionalsRepo.allows_guests_to_push_states_and_output_ports( - get_asyncpg_engine(app), project_uuid=f"{service.project_id}" - ) - ): - save_service_state = True + if ( + user_role == UserRole.GUEST + and await BaseProjectOptionalsRepo.allows_guests_to_push_states_and_output_ports( + get_asyncpg_engine(app), project_uuid=f"{service.project_id}" + ) + ): + save_service_state = True with ( log_catch(_logger, reraise=False),