From 549bc8188eb1fc212251822e003d11ca05b6b23a Mon Sep 17 00:00:00 2001 From: matusdrobuliak66 <60785969+matusdrobuliak66@users.noreply.github.com> Date: Wed, 24 May 2023 08:42:20 +0200 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20=20`webserver`:=20fixes=20?= =?UTF-8?q?mypy=20issues=20in=20`products`=20plugin=20(1=20part)=20(#4256)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .codeclimate.yml | 1 + .../webserver/openapi-projects-ports.yaml | 20 ++++++------ .../scripts/openapi_projects_crud.py | 14 ++++---- .../scripts/openapi_projects_ports.py | 5 ++- .../pytest_simcore/helpers/faker_webserver.py | 2 +- .../pytest_simcore/helpers/utils_projects.py | 23 ++++++------- scripts/demo/template-projects/converter.py | 2 +- .../api/v0/openapi.yaml | 6 ++-- .../application_settings.py | 2 +- .../exporter/formatters/formatter_v1.py | 4 +-- .../exporter/formatters/formatter_v2.py | 2 +- .../exporter/request_handlers.py | 2 +- .../garbage_collector.py | 2 +- .../garbage_collector_core.py | 12 +++---- .../garbage_collector_utils.py | 4 +-- .../meta_modeling/_iterations.py | 2 +- .../meta_modeling/_projects.py | 2 +- .../meta_modeling/_version_control.py | 2 +- .../_db_comp_tasks_listening_task.py | 12 +++---- .../notifications/_rabbitmq_consumers.py | 2 +- ..._create_utils.py => _crud_create_utils.py} | 8 ++--- ..._delete_utils.py => _crud_delete_utils.py} | 4 +-- .../{_read_utils.py => _crud_read_utils.py} | 4 +-- .../{projects_db_utils.py => _db_utils.py} | 6 ++-- .../{projects_handlers.py => _handlers.py} | 6 ++-- ...cts_handlers_crud.py => _handlers_crud.py} | 18 +++++------ .../{nodes_handlers.py => _handlers_nodes.py} | 0 ...handlers.py => _handlers_project_nodes.py} | 6 ++-- ...handlers.py => _handlers_project_ports.py} | 8 ++--- ..._handlers.py => _handlers_project_tags.py} | 2 +- .../projects/_nodes_utils.py | 2 +- .../projects/_permalink.py | 4 +-- ...projects_access.py => _projects_access.py} | 2 +- .../projects/_rest_schemas.py | 2 -- .../projects/{projects_db.py => db.py} | 13 +++++--- .../{projects_exceptions.py => exceptions.py} | 0 .../projects/{project_lock.py => lock.py} | 2 +- .../projects/{project_models.py => models.py} | 0 ...projects_nodes_utils.py => nodes_utils.py} | 10 +++--- .../projects/plugin.py | 24 +++++++------- .../projects/projects_api.py | 32 ++++++++----------- .../{projects_settings.py => settings.py} | 0 .../projects/{projects_utils.py => utils.py} | 14 ++++---- .../simcore_service_webserver/storage/api.py | 4 +-- .../studies_dispatcher/_projects.py | 9 ++---- .../_projects_permalinks.py | 10 +++--- .../studies_dispatcher/_studies_access.py | 16 +++------- .../version_control/_rest_handlers_base.py | 2 +- .../version_control/db.py | 2 +- .../version_control/vc_changes.py | 2 +- services/web/server/tests/conftest.py | 6 ++-- .../integration/01/test_garbage_collection.py | 4 +-- .../integration/01/test_project_workflow.py | 10 +++--- .../notifications/test_rabbitmq_consumers.py | 2 +- .../tests/unit/isolated/test_project_utils.py | 2 +- .../unit/isolated/test_projects_models.py | 2 +- .../unit/isolated/test_projects_utils.py | 8 ++--- .../isolated/test_projects_utils_templates.py | 2 +- .../isolated/test_security_access_model.py | 2 +- .../test_studies_dispatcher_handlers.py | 2 +- .../test_studies_dispatcher_studies_access.py | 2 +- .../server/tests/unit/with_dbs/02/conftest.py | 2 +- .../unit/with_dbs/02/test_project_lock.py | 2 +- .../02/test_projects_cancellations.py | 2 +- .../02/test_projects_handlers__delete.py | 6 ++-- .../02/test_projects_handlers__list.py | 2 +- .../02/test_projects_handlers__open_close.py | 4 +-- .../02/test_projects_handlers_crud.py | 2 +- .../02/test_projects_nodes_handler.py | 2 +- .../02/test_projects_ports_handlers.py | 6 ++-- .../test_resource_manager.py | 4 +-- .../test_meta_modeling_iterations.py | 4 +-- .../tests/unit/with_dbs/03/tags/test_tags.py | 2 +- .../tests/unit/with_dbs/03/test_project_db.py | 16 +++++----- .../with_dbs/03/version_control/conftest.py | 4 +-- .../version_control/test_version_control.py | 2 +- .../test_version_control_core.py | 2 +- .../test_version_control_handlers.py | 2 +- .../server/tests/unit/with_dbs/conftest.py | 12 +++---- 79 files changed, 219 insertions(+), 232 deletions(-) rename services/web/server/src/simcore_service_webserver/projects/{_create_utils.py => _crud_create_utils.py} (97%) rename services/web/server/src/simcore_service_webserver/projects/{_delete_utils.py => _crud_delete_utils.py} (98%) rename services/web/server/src/simcore_service_webserver/projects/{_read_utils.py => _crud_read_utils.py} (96%) rename services/web/server/src/simcore_service_webserver/projects/{projects_db_utils.py => _db_utils.py} (98%) rename services/web/server/src/simcore_service_webserver/projects/{projects_handlers.py => _handlers.py} (97%) rename services/web/server/src/simcore_service_webserver/projects/{projects_handlers_crud.py => _handlers_crud.py} (97%) rename services/web/server/src/simcore_service_webserver/projects/{nodes_handlers.py => _handlers_nodes.py} (100%) rename services/web/server/src/simcore_service_webserver/projects/{projects_nodes_handlers.py => _handlers_project_nodes.py} (98%) rename services/web/server/src/simcore_service_webserver/projects/{projects_ports_handlers.py => _handlers_project_ports.py} (97%) rename services/web/server/src/simcore_service_webserver/projects/{projects_tags_handlers.py => _handlers_project_tags.py} (96%) rename services/web/server/src/simcore_service_webserver/projects/{projects_access.py => _projects_access.py} (97%) rename services/web/server/src/simcore_service_webserver/projects/{projects_db.py => db.py} (99%) rename services/web/server/src/simcore_service_webserver/projects/{projects_exceptions.py => exceptions.py} (100%) rename services/web/server/src/simcore_service_webserver/projects/{project_lock.py => lock.py} (98%) rename services/web/server/src/simcore_service_webserver/projects/{project_models.py => models.py} (100%) rename services/web/server/src/simcore_service_webserver/projects/{projects_nodes_utils.py => nodes_utils.py} (95%) rename services/web/server/src/simcore_service_webserver/projects/{projects_settings.py => settings.py} (100%) rename services/web/server/src/simcore_service_webserver/projects/{projects_utils.py => utils.py} (97%) diff --git a/.codeclimate.yml b/.codeclimate.yml index 842a8700ff9..d1c8596c28e 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -82,3 +82,4 @@ exclude_patterns: - "**/sandbox/" - packages/models-library/src/models_library/utils/_original_fastapi_encoders.py - services/web/server/src/simcore_service_webserver/exporter/formatters/sds/xlsx/templates/code_description.py + - services/web/server/src/simcore_service_webserver/projects/db.py # NOTE: refactor will be done in upcomming PRs diff --git a/api/specs/webserver/openapi-projects-ports.yaml b/api/specs/webserver/openapi-projects-ports.yaml index 5fe002b554f..51b8e3b3b8e 100644 --- a/api/specs/webserver/openapi-projects-ports.yaml +++ b/api/specs/webserver/openapi-projects-ports.yaml @@ -20,7 +20,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/Envelope_dict_uuid.UUID__simcore_service_webserver.projects.projects_ports_handlers.ProjectInputGet__' + $ref: '#/components/schemas/Envelope_dict_uuid.UUID__simcore_service_webserver.projects._handlers__ports.ProjectInputGet__' patch: tags: - project @@ -50,7 +50,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/Envelope_dict_uuid.UUID__simcore_service_webserver.projects.projects_ports_handlers.ProjectInputGet__' + $ref: '#/components/schemas/Envelope_dict_uuid.UUID__simcore_service_webserver.projects._handlers__ports.ProjectInputGet__' /projects/{project_id}/outputs: get: tags: @@ -72,7 +72,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/Envelope_dict_uuid.UUID__simcore_service_webserver.projects.projects_ports_handlers.ProjectOutputGet__' + $ref: '#/components/schemas/Envelope_dict_uuid.UUID__simcore_service_webserver.projects._handlers__ports.ProjectOutputGet__' /projects/{project_id}/metadata/ports: get: tags: @@ -94,11 +94,11 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/Envelope_list_simcore_service_webserver.projects.projects_ports_handlers.ProjectMetadataPortGet__' + $ref: '#/components/schemas/Envelope_list_simcore_service_webserver.projects._handlers__ports.ProjectMetadataPortGet__' components: schemas: - Envelope_dict_uuid.UUID__simcore_service_webserver.projects.projects_ports_handlers.ProjectInputGet__: - title: Envelope[dict[uuid.UUID, simcore_service_webserver.projects.projects_ports_handlers.ProjectInputGet]] + Envelope_dict_uuid.UUID__simcore_service_webserver.projects._handlers__ports.ProjectInputGet__: + title: Envelope[dict[uuid.UUID, simcore_service_webserver.projects._handlers__ports.ProjectInputGet]] type: object properties: data: @@ -108,8 +108,8 @@ components: $ref: '#/components/schemas/ProjectInputGet' error: title: Error - Envelope_dict_uuid.UUID__simcore_service_webserver.projects.projects_ports_handlers.ProjectOutputGet__: - title: Envelope[dict[uuid.UUID, simcore_service_webserver.projects.projects_ports_handlers.ProjectOutputGet]] + Envelope_dict_uuid.UUID__simcore_service_webserver.projects._handlers__ports.ProjectOutputGet__: + title: Envelope[dict[uuid.UUID, simcore_service_webserver.projects._handlers__ports.ProjectOutputGet]] type: object properties: data: @@ -119,8 +119,8 @@ components: $ref: '#/components/schemas/ProjectOutputGet' error: title: Error - Envelope_list_simcore_service_webserver.projects.projects_ports_handlers.ProjectMetadataPortGet__: - title: Envelope[list[simcore_service_webserver.projects.projects_ports_handlers.ProjectMetadataPortGet]] + Envelope_list_simcore_service_webserver.projects._handlers__ports.ProjectMetadataPortGet__: + title: Envelope[list[simcore_service_webserver.projects._handlers__ports.ProjectMetadataPortGet]] type: object properties: data: diff --git a/api/specs/webserver/scripts/openapi_projects_crud.py b/api/specs/webserver/scripts/openapi_projects_crud.py index 4e121dcc6be..735b77d3da8 100644 --- a/api/specs/webserver/scripts/openapi_projects_crud.py +++ b/api/specs/webserver/scripts/openapi_projects_crud.py @@ -22,6 +22,13 @@ from models_library.rest_pagination import DEFAULT_NUMBER_OF_ITEMS_PER_PAGE, Page from pydantic import NonNegativeInt from servicelib.aiohttp.long_running_tasks.server import TaskGet +from simcore_service_webserver.projects._handlers_crud import ( + ProjectPathParams, + ProjectTypeAPI, + _ProjectActiveParams, + _ProjectCreateParams, + _ProjectListParams, +) from simcore_service_webserver.projects._rest_schemas import ( ProjectCopyOverride, ProjectCreateNew, @@ -31,13 +38,6 @@ ProjectUpdate, TaskGet, ) -from simcore_service_webserver.projects.projects_handlers_crud import ( - ProjectPathParams, - ProjectTypeAPI, - _ProjectActiveParams, - _ProjectCreateParams, - _ProjectListParams, -) app = FastAPI(redoc_url=None) diff --git a/api/specs/webserver/scripts/openapi_projects_ports.py b/api/specs/webserver/scripts/openapi_projects_ports.py index 67389d0432f..7eceb43c75a 100644 --- a/api/specs/webserver/scripts/openapi_projects_ports.py +++ b/api/specs/webserver/scripts/openapi_projects_ports.py @@ -10,13 +10,12 @@ from enum import Enum -from typing import Union from fastapi import FastAPI from models_library.generics import Envelope from models_library.projects import ProjectID from models_library.projects_nodes import NodeID -from simcore_service_webserver.projects.projects_ports_handlers import ( +from simcore_service_webserver.projects._handlers_project_ports import ( ProjectInputGet, ProjectInputUpdate, ProjectMetadataPortGet, @@ -25,7 +24,7 @@ app = FastAPI(redoc_url=None) -TAGS: list[Union[str, Enum]] = [ +TAGS: list[str | Enum] = [ "project", ] diff --git a/packages/pytest-simcore/src/pytest_simcore/helpers/faker_webserver.py b/packages/pytest-simcore/src/pytest_simcore/helpers/faker_webserver.py index 70978fb7979..324d1e0078d 100644 --- a/packages/pytest-simcore/src/pytest_simcore/helpers/faker_webserver.py +++ b/packages/pytest-simcore/src/pytest_simcore/helpers/faker_webserver.py @@ -1,7 +1,7 @@ from typing import Any, Final # Web-server API responses of /projects/{project_id}/metadata/ports -# as reponses in this mock. SEE services/web/server/tests/unit/with_dbs/02/test_projects_ports_handlers.py +# as reponses in this mock. SEE services/web/server/tests/unit/with_dbs/02/test__handlers__ports.py # NOTE: this could be added as examples in the OAS but for the moment we want to avoid overloading openapi.yml # in the web-server. PROJECTS_METADATA_PORTS_RESPONSE_BODY_DATA: Final[list[dict[str, Any]]] = [ diff --git a/packages/pytest-simcore/src/pytest_simcore/helpers/utils_projects.py b/packages/pytest-simcore/src/pytest_simcore/helpers/utils_projects.py index ce1431811dd..d4ab2d1c87b 100644 --- a/packages/pytest-simcore/src/pytest_simcore/helpers/utils_projects.py +++ b/packages/pytest-simcore/src/pytest_simcore/helpers/utils_projects.py @@ -6,16 +6,13 @@ import json import uuid as uuidlib from pathlib import Path -from typing import Any, Optional +from typing import Any from aiohttp import web from aiohttp.test_utils import TestClient -from simcore_service_webserver.projects.project_models import ProjectDict -from simcore_service_webserver.projects.projects_db import ( - APP_PROJECT_DBAPI, - ProjectDBAPI, -) -from simcore_service_webserver.projects.projects_db_utils import DB_EXCLUSIVE_COLUMNS +from simcore_service_webserver.projects._db_utils import DB_EXCLUSIVE_COLUMNS +from simcore_service_webserver.projects.db import APP_PROJECT_DBAPI, ProjectDBAPI +from simcore_service_webserver.projects.models import ProjectDict from simcore_service_webserver.utils import now_str from .utils_assert import assert_status @@ -36,11 +33,11 @@ def empty_project_data(): async def create_project( app: web.Application, - params_override: Optional[dict[str, Any]] = None, - user_id: Optional[int] = None, + params_override: dict[str, Any] | None = None, + user_id: int | None = None, *, product_name: str, - default_project_json: Optional[Path] = None, + default_project_json: Path | None = None, force_uuid: bool = False, as_template: bool = False, ) -> ProjectDict: @@ -98,10 +95,10 @@ async def delete_all_projects(app: web.Application): class NewProject: def __init__( self, - params_override: Optional[dict] = None, - app: Optional[web.Application] = None, + params_override: dict | None = None, + app: web.Application | None = None, clear_all: bool = True, - user_id: Optional[int] = None, + user_id: int | None = None, *, product_name: str, tests_data_dir: Path, diff --git a/scripts/demo/template-projects/converter.py b/scripts/demo/template-projects/converter.py index 43ca3ecafe5..007c7d370f8 100644 --- a/scripts/demo/template-projects/converter.py +++ b/scripts/demo/template-projects/converter.py @@ -3,7 +3,7 @@ import sys from pathlib import Path -from simcore_service_webserver.projects.projects_db_utils import convert_to_schema_names +from simcore_service_webserver.projects._db_utils import convert_to_schema_names SEPARATOR = "," diff --git a/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml b/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml index 85af3eeaa60..ee416d9fccc 100644 --- a/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml +++ b/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml @@ -5439,7 +5439,7 @@ paths: content: application/json: schema: - title: 'Envelope[dict[uuid.UUID, simcore_service_webserver.projects.projects_ports_handlers.ProjectInputGet]]' + title: 'Envelope[dict[uuid.UUID, simcore_service_webserver.projects._handlers__ports.ProjectInputGet]]' type: object properties: data: @@ -5530,7 +5530,7 @@ paths: content: application/json: schema: - title: 'Envelope[dict[uuid.UUID, simcore_service_webserver.projects.projects_ports_handlers.ProjectOutputGet]]' + title: 'Envelope[dict[uuid.UUID, simcore_service_webserver.projects._handlers__ports.ProjectOutputGet]]' type: object properties: data: @@ -5578,7 +5578,7 @@ paths: content: application/json: schema: - title: 'Envelope[list[simcore_service_webserver.projects.projects_ports_handlers.ProjectMetadataPortGet]]' + title: 'Envelope[list[simcore_service_webserver.projects._handlers__ports.ProjectMetadataPortGet]]' type: object properties: data: diff --git a/services/web/server/src/simcore_service_webserver/application_settings.py b/services/web/server/src/simcore_service_webserver/application_settings.py index d4e7566bfcb..459ee27fc4b 100644 --- a/services/web/server/src/simcore_service_webserver/application_settings.py +++ b/services/web/server/src/simcore_service_webserver/application_settings.py @@ -35,7 +35,7 @@ from .garbage_collector_settings import GarbageCollectorSettings from .invitations.settings import InvitationsSettings from .login.settings import LoginSettings -from .projects.projects_settings import ProjectsSettings +from .projects.settings import ProjectsSettings from .resource_manager.settings import ResourceManagerSettings from .rest_settings import RestSettings from .scicrunch.settings import SciCrunchSettings diff --git a/services/web/server/src/simcore_service_webserver/exporter/formatters/formatter_v1.py b/services/web/server/src/simcore_service_webserver/exporter/formatters/formatter_v1.py index 0533aa8eed5..88ed74ddc53 100644 --- a/services/web/server/src/simcore_service_webserver/exporter/formatters/formatter_v1.py +++ b/services/web/server/src/simcore_service_webserver/exporter/formatters/formatter_v1.py @@ -39,9 +39,9 @@ ) from ...director_v2.api import create_or_update_pipeline +from ...projects.db import APP_PROJECT_DBAPI, ProjectDBAPI +from ...projects.exceptions import ProjectsException from ...projects.projects_api import get_project_for_user, submit_delete_project_task -from ...projects.projects_db import APP_PROJECT_DBAPI, ProjectDBAPI -from ...projects.projects_exceptions import ProjectsException from ...users.api import get_user from ...utils import now_str from ..exceptions import ExporterException diff --git a/services/web/server/src/simcore_service_webserver/exporter/formatters/formatter_v2.py b/services/web/server/src/simcore_service_webserver/exporter/formatters/formatter_v2.py index 26834a8639a..51ce664ff8f 100644 --- a/services/web/server/src/simcore_service_webserver/exporter/formatters/formatter_v2.py +++ b/services/web/server/src/simcore_service_webserver/exporter/formatters/formatter_v2.py @@ -10,8 +10,8 @@ from simcore_postgres_database.models.scicrunch_resources import scicrunch_resources from ...catalog.client import get_service +from ...projects.exceptions import ProjectsException from ...projects.projects_api import get_project_for_user -from ...projects.projects_exceptions import ProjectsException from ...scicrunch.db import ResearchResourceRepository from ..exceptions import ExporterException from .base_formatter import BaseFormatter diff --git a/services/web/server/src/simcore_service_webserver/exporter/request_handlers.py b/services/web/server/src/simcore_service_webserver/exporter/request_handlers.py index 43274b9cd66..cd8c9559425 100644 --- a/services/web/server/src/simcore_service_webserver/exporter/request_handlers.py +++ b/services/web/server/src/simcore_service_webserver/exporter/request_handlers.py @@ -10,7 +10,7 @@ from .._constants import RQ_PRODUCT_KEY from ..login.decorators import RQT_USERID_KEY, login_required -from ..projects.project_lock import lock_project +from ..projects.lock import lock_project from ..projects.projects_api import retrieve_and_notify_project_locked_state from ..security.decorators import permission_required from ..users.api import get_user_name diff --git a/services/web/server/src/simcore_service_webserver/garbage_collector.py b/services/web/server/src/simcore_service_webserver/garbage_collector.py index 0280aca0820..2fca92c6652 100644 --- a/services/web/server/src/simcore_service_webserver/garbage_collector.py +++ b/services/web/server/src/simcore_service_webserver/garbage_collector.py @@ -8,7 +8,7 @@ from .garbage_collector_tasks_api_keys import create_background_task_to_prune_api_keys from .garbage_collector_tasks_users import create_background_task_for_trial_accounts from .login.plugin import setup_login_storage -from .projects.plugin import setup_projects_db +from .projects.db import setup_projects_db from .socketio.plugin import setup_socketio_server logger = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/garbage_collector_core.py b/services/web/server/src/simcore_service_webserver/garbage_collector_core.py index 7bfd582b543..a7386cd5380 100644 --- a/services/web/server/src/simcore_service_webserver/garbage_collector_core.py +++ b/services/web/server/src/simcore_service_webserver/garbage_collector_core.py @@ -22,6 +22,12 @@ from .director_v2.exceptions import ServiceWaitingForManualIntervention from .garbage_collector_settings import GUEST_USER_RC_LOCK_FORMAT from .garbage_collector_utils import get_new_project_owner_gid, replace_current_owner +from .projects.db import ProjectDBAPI +from .projects.exceptions import ( + ProjectDeleteError, + ProjectLockError, + ProjectNotFoundError, +) from .projects.projects_api import ( get_project_for_user, get_workbench_node_ids_from_project_uuid, @@ -29,12 +35,6 @@ remove_project_dynamic_services, submit_delete_project_task, ) -from .projects.projects_db import ProjectDBAPI -from .projects.projects_exceptions import ( - ProjectDeleteError, - ProjectLockError, - ProjectNotFoundError, -) from .redis import get_redis_lock_manager_client from .resource_manager.registry import RedisResourceRegistry, get_registry from .users import exceptions diff --git a/services/web/server/src/simcore_service_webserver/garbage_collector_utils.py b/services/web/server/src/simcore_service_webserver/garbage_collector_utils.py index 58d17dd62b2..56ed91eb211 100644 --- a/services/web/server/src/simcore_service_webserver/garbage_collector_utils.py +++ b/services/web/server/src/simcore_service_webserver/garbage_collector_utils.py @@ -8,8 +8,8 @@ from .db_models import GroupType from .groups.api import get_group_from_gid -from .projects.projects_db import APP_PROJECT_DBAPI, ProjectAccessRights -from .projects.projects_exceptions import ProjectNotFoundError +from .projects.db import APP_PROJECT_DBAPI, ProjectAccessRights +from .projects.exceptions import ProjectNotFoundError from .users import exceptions from .users.api import get_user, get_user_id_from_gid, get_users_in_group from .users.exceptions import UserNotFoundError diff --git a/services/web/server/src/simcore_service_webserver/meta_modeling/_iterations.py b/services/web/server/src/simcore_service_webserver/meta_modeling/_iterations.py index f784be5bb20..37338c02481 100644 --- a/services/web/server/src/simcore_service_webserver/meta_modeling/_iterations.py +++ b/services/web/server/src/simcore_service_webserver/meta_modeling/_iterations.py @@ -19,7 +19,7 @@ from pydantic.fields import Field from pydantic.types import PositiveInt -from ..projects.project_models import ProjectDict +from ..projects.models import ProjectDict from ..utils import compute_sha1_on_small_dataset, now_str from ..version_control.errors import UserUndefined from ..version_control.models import CommitID diff --git a/services/web/server/src/simcore_service_webserver/meta_modeling/_projects.py b/services/web/server/src/simcore_service_webserver/meta_modeling/_projects.py index 3750d8dd9d7..6cf0b391da1 100644 --- a/services/web/server/src/simcore_service_webserver/meta_modeling/_projects.py +++ b/services/web/server/src/simcore_service_webserver/meta_modeling/_projects.py @@ -16,7 +16,7 @@ from .._meta import api_version_prefix as VTAG from ..director_v2.api import AbstractProjectRunPolicy -from ..projects.projects_handlers_crud import RQ_REQUESTED_REPO_PROJECT_UUID_KEY +from ..projects._handlers_crud import RQ_REQUESTED_REPO_PROJECT_UUID_KEY from ..version_control.models import CommitID from ._iterations import get_or_create_runnable_projects, get_runnable_projects_ids from ._version_control import VersionControlForMetaModeling diff --git a/services/web/server/src/simcore_service_webserver/meta_modeling/_version_control.py b/services/web/server/src/simcore_service_webserver/meta_modeling/_version_control.py index f3bd9e50e57..606c4df04d3 100644 --- a/services/web/server/src/simcore_service_webserver/meta_modeling/_version_control.py +++ b/services/web/server/src/simcore_service_webserver/meta_modeling/_version_control.py @@ -9,7 +9,7 @@ from models_library.projects import ProjectIDStr from models_library.utils.fastapi_encoders import jsonable_encoder -from ..projects.project_models import ProjectDict +from ..projects.models import ProjectDict from ..version_control.db import VersionControlRepository from ..version_control.errors import UserUndefined from ..version_control.models import CommitID, TagProxy diff --git a/services/web/server/src/simcore_service_webserver/notifications/_db_comp_tasks_listening_task.py b/services/web/server/src/simcore_service_webserver/notifications/_db_comp_tasks_listening_task.py index 772a22d61fb..fde7d1f0260 100644 --- a/services/web/server/src/simcore_service_webserver/notifications/_db_comp_tasks_listening_task.py +++ b/services/web/server/src/simcore_service_webserver/notifications/_db_comp_tasks_listening_task.py @@ -21,8 +21,8 @@ from simcore_postgres_database.webserver_models import DB_CHANNEL_NAME, projects from sqlalchemy.sql import select -from ..projects import projects_api, projects_exceptions -from ..projects.projects_nodes_utils import update_node_outputs +from ..projects import exceptions, projects_api +from ..projects.nodes_utils import update_node_outputs from ._utils import convert_state_from_db _logger = logging.getLogger(__name__) @@ -33,7 +33,7 @@ async def _get_project_owner(conn: SAConnection, project_uuid: str) -> PositiveI select([projects.c.prj_owner]).where(projects.c.uuid == project_uuid) ) if not the_project_owner: - raise projects_exceptions.ProjectOwnerNotFoundError(project_uuid) + raise exceptions.ProjectOwnerNotFoundError(project_uuid) return the_project_owner @@ -110,17 +110,17 @@ async def _handle_db_notification( node_errors=task_data.get("errors", None), ) - except projects_exceptions.ProjectNotFoundError as exc: + except exceptions.ProjectNotFoundError as exc: _logger.warning( "Project %s was not found and cannot be updated. Maybe was it deleted?", exc.project_uuid, ) - except projects_exceptions.ProjectOwnerNotFoundError as exc: + except exceptions.ProjectOwnerNotFoundError as exc: _logger.warning( "Project owner of project %s could not be found, is the project valid?", exc.project_uuid, ) - except projects_exceptions.NodeNotFoundError as exc: + except exceptions.NodeNotFoundError as exc: _logger.warning( "Node %s of project %s not found and cannot be updated. Maybe was it deleted?", exc.node_uuid, diff --git a/services/web/server/src/simcore_service_webserver/notifications/_rabbitmq_consumers.py b/services/web/server/src/simcore_service_webserver/notifications/_rabbitmq_consumers.py index 8119bb8a9ce..ed5922a7d73 100644 --- a/services/web/server/src/simcore_service_webserver/notifications/_rabbitmq_consumers.py +++ b/services/web/server/src/simcore_service_webserver/notifications/_rabbitmq_consumers.py @@ -24,7 +24,7 @@ from servicelib.utils import logged_gather from ..projects import projects_api -from ..projects.projects_exceptions import NodeNotFoundError, ProjectNotFoundError +from ..projects.exceptions import NodeNotFoundError, ProjectNotFoundError from ..rabbitmq import get_rabbitmq_client from ..socketio.messages import ( SOCKET_IO_EVENT, diff --git a/services/web/server/src/simcore_service_webserver/projects/_create_utils.py b/services/web/server/src/simcore_service_webserver/projects/_crud_create_utils.py similarity index 97% rename from services/web/server/src/simcore_service_webserver/projects/_create_utils.py rename to services/web/server/src/simcore_service_webserver/projects/_crud_create_utils.py index dd940eb5f14..1116eac23af 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_create_utils.py +++ b/services/web/server/src/simcore_service_webserver/projects/_crud_create_utils.py @@ -25,10 +25,10 @@ from . import projects_api from ._permalink import update_or_pop_permalink_in_project from ._rest_schemas import ProjectGet -from .project_models import ProjectDict -from .projects_db import ProjectDBAPI -from .projects_exceptions import ProjectInvalidRightsError, ProjectNotFoundError -from .projects_utils import NodesMap, clone_project_document, default_copy_project_name +from .db import ProjectDBAPI +from .exceptions import ProjectInvalidRightsError, ProjectNotFoundError +from .models import ProjectDict +from .utils import NodesMap, clone_project_document, default_copy_project_name OVERRIDABLE_DOCUMENT_KEYS = [ "name", diff --git a/services/web/server/src/simcore_service_webserver/projects/_delete_utils.py b/services/web/server/src/simcore_service_webserver/projects/_crud_delete_utils.py similarity index 98% rename from services/web/server/src/simcore_service_webserver/projects/_delete_utils.py rename to services/web/server/src/simcore_service_webserver/projects/_crud_delete_utils.py index 55fc9f8cbb4..db518e17bd4 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_delete_utils.py +++ b/services/web/server/src/simcore_service_webserver/projects/_crud_delete_utils.py @@ -17,8 +17,8 @@ from ..storage.api import delete_data_folders_of_project from ..users.api import UserNameDict from ..users.exceptions import UserNotFoundError -from .projects_db import ProjectDBAPI -from .projects_exceptions import ( +from .db import ProjectDBAPI +from .exceptions import ( ProjectDeleteError, ProjectInvalidRightsError, ProjectLockError, diff --git a/services/web/server/src/simcore_service_webserver/projects/_read_utils.py b/services/web/server/src/simcore_service_webserver/projects/_crud_read_utils.py similarity index 96% rename from services/web/server/src/simcore_service_webserver/projects/_read_utils.py rename to services/web/server/src/simcore_service_webserver/projects/_crud_read_utils.py index 0858fb9146a..9221aca2d42 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_read_utils.py +++ b/services/web/server/src/simcore_service_webserver/projects/_crud_read_utils.py @@ -16,8 +16,8 @@ from . import projects_api from ._permalink import update_or_pop_permalink_in_project from ._rest_schemas import ProjectListItem -from .project_models import ProjectDict, ProjectTypeAPI -from .projects_db import ProjectDBAPI +from .db import ProjectDBAPI +from .models import ProjectDict, ProjectTypeAPI async def _append_fields( diff --git a/services/web/server/src/simcore_service_webserver/projects/projects_db_utils.py b/services/web/server/src/simcore_service_webserver/projects/_db_utils.py similarity index 98% rename from services/web/server/src/simcore_service_webserver/projects/projects_db_utils.py rename to services/web/server/src/simcore_service_webserver/projects/_db_utils.py index c06b5b0bf3a..eeb0ef8692c 100644 --- a/services/web/server/src/simcore_service_webserver/projects/projects_db_utils.py +++ b/services/web/server/src/simcore_service_webserver/projects/_db_utils.py @@ -23,9 +23,9 @@ from ..db_models import GroupType, groups, study_tags, user_to_groups, users from ..users.exceptions import UserNotFoundError from ..utils import format_datetime -from .project_models import ProjectDict, ProjectProxy -from .projects_exceptions import ProjectInvalidRightsError, ProjectNotFoundError -from .projects_utils import project_uses_available_services +from .exceptions import ProjectInvalidRightsError, ProjectNotFoundError +from .models import ProjectDict, ProjectProxy +from .utils import project_uses_available_services logger = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/projects_handlers.py b/services/web/server/src/simcore_service_webserver/projects/_handlers.py similarity index 97% rename from services/web/server/src/simcore_service_webserver/projects/projects_handlers.py rename to services/web/server/src/simcore_service_webserver/projects/_handlers.py index 94dd94308b2..e840574a8ba 100644 --- a/services/web/server/src/simcore_service_webserver/projects/projects_handlers.py +++ b/services/web/server/src/simcore_service_webserver/projects/_handlers.py @@ -1,6 +1,6 @@ """ Handlers for on /projects colletions -Imports in standard methods (SEE projects_handlers_crud) and extends with +Imports in standard methods (SEE _handlers_crud) and extends with - custom methods (https://google.aip.dev/121) """ @@ -33,13 +33,13 @@ from ..security.decorators import permission_required from ..users import api from . import projects_api -from .projects_exceptions import ( +from ._handlers_crud import ProjectPathParams, RequestContext +from .exceptions import ( ProjectInvalidRightsError, ProjectNotFoundError, ProjectStartsTooManyDynamicNodes, ProjectTooManyProjectOpened, ) -from .projects_handlers_crud import ProjectPathParams, RequestContext log = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/projects_handlers_crud.py b/services/web/server/src/simcore_service_webserver/projects/_handlers_crud.py similarity index 97% rename from services/web/server/src/simcore_service_webserver/projects/projects_handlers_crud.py rename to services/web/server/src/simcore_service_webserver/projects/_handlers_crud.py index d4615b47886..b99beafd36c 100644 --- a/services/web/server/src/simcore_service_webserver/projects/projects_handlers_crud.py +++ b/services/web/server/src/simcore_service_webserver/projects/_handlers_crud.py @@ -38,7 +38,7 @@ from ..security.api import check_permission from ..security.decorators import permission_required from ..users.api import get_user_name -from . import _create_utils, _read_utils, projects_api +from . import _crud_create_utils, _crud_read_utils, projects_api from ._permalink import update_or_pop_permalink_in_project from ._rest_schemas import ( EmptyModel, @@ -47,16 +47,16 @@ ProjectGet, ProjectUpdate, ) -from .project_lock import get_project_locked_state -from .project_models import ProjectDict, ProjectTypeAPI -from .projects_db import ProjectDBAPI -from .projects_exceptions import ( +from .db import ProjectDBAPI +from .exceptions import ( ProjectDeleteError, ProjectInvalidRightsError, ProjectNotFoundError, ) -from .projects_nodes_utils import update_frontend_outputs -from .projects_utils import ( +from .lock import get_project_locked_state +from .models import ProjectDict, ProjectTypeAPI +from .nodes_utils import update_frontend_outputs +from .utils import ( any_node_inputs_changed, get_project_unavailable_services, project_uses_available_services, @@ -148,7 +148,7 @@ async def create_project(request: web.Request): return await start_long_running_task( request, - _create_utils.create_project, + _crud_create_utils.create_project, fire_and_forget=True, task_context=jsonable_encoder(req_ctx), # arguments @@ -203,7 +203,7 @@ async def list_projects(request: web.Request): req_ctx = RequestContext.parse_obj(request) query_params = parse_request_query_parameters_as(_ProjectListParams, request) - projects, total_number_of_projects = await _read_utils.list_projects( + projects, total_number_of_projects = await _crud_read_utils.list_projects( request, user_id=req_ctx.user_id, product_name=req_ctx.product_name, diff --git a/services/web/server/src/simcore_service_webserver/projects/nodes_handlers.py b/services/web/server/src/simcore_service_webserver/projects/_handlers_nodes.py similarity index 100% rename from services/web/server/src/simcore_service_webserver/projects/nodes_handlers.py rename to services/web/server/src/simcore_service_webserver/projects/_handlers_nodes.py diff --git a/services/web/server/src/simcore_service_webserver/projects/projects_nodes_handlers.py b/services/web/server/src/simcore_service_webserver/projects/_handlers_project_nodes.py similarity index 98% rename from services/web/server/src/simcore_service_webserver/projects/projects_nodes_handlers.py rename to services/web/server/src/simcore_service_webserver/projects/_handlers_project_nodes.py index 365853b746a..3eb1d468166 100644 --- a/services/web/server/src/simcore_service_webserver/projects/projects_nodes_handlers.py +++ b/services/web/server/src/simcore_service_webserver/projects/_handlers_project_nodes.py @@ -30,16 +30,16 @@ from ..director_v2 import api from ..director_v2.exceptions import DirectorServiceError from ..login.decorators import login_required -from ..projects.projects_db import ProjectDBAPI from ..security.decorators import permission_required from ..users.api import get_user_role from . import projects_api -from .projects_exceptions import ( +from ._handlers_crud import ProjectPathParams, RequestContext +from .db import ProjectDBAPI +from .exceptions import ( NodeNotFoundError, ProjectNotFoundError, ProjectStartsTooManyDynamicNodes, ) -from .projects_handlers_crud import ProjectPathParams, RequestContext log = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/projects_ports_handlers.py b/services/web/server/src/simcore_service_webserver/projects/_handlers_project_ports.py similarity index 97% rename from services/web/server/src/simcore_service_webserver/projects/projects_ports_handlers.py rename to services/web/server/src/simcore_service_webserver/projects/_handlers_project_ports.py index 69fae70d698..b3b8b5b2468 100644 --- a/services/web/server/src/simcore_service_webserver/projects/projects_ports_handlers.py +++ b/services/web/server/src/simcore_service_webserver/projects/_handlers_project_ports.py @@ -24,14 +24,14 @@ from ..login.decorators import login_required from ..security.decorators import permission_required from . import _ports_utils, projects_api -from .project_models import ProjectDict -from .projects_db import ProjectDBAPI -from .projects_exceptions import ( +from ._handlers_crud import ProjectPathParams, RequestContext +from .db import ProjectDBAPI +from .exceptions import ( NodeNotFoundError, ProjectInvalidRightsError, ProjectNotFoundError, ) -from .projects_handlers_crud import ProjectPathParams, RequestContext +from .models import ProjectDict log = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/projects_tags_handlers.py b/services/web/server/src/simcore_service_webserver/projects/_handlers_project_tags.py similarity index 96% rename from services/web/server/src/simcore_service_webserver/projects/projects_tags_handlers.py rename to services/web/server/src/simcore_service_webserver/projects/_handlers_project_tags.py index ef4f753024f..53af7e5dc20 100644 --- a/services/web/server/src/simcore_service_webserver/projects/projects_tags_handlers.py +++ b/services/web/server/src/simcore_service_webserver/projects/_handlers_project_tags.py @@ -10,7 +10,7 @@ from .._meta import api_version_prefix as VTAG from ..login.decorators import login_required from ..security.decorators import permission_required -from .projects_db import APP_PROJECT_DBAPI, ProjectDBAPI +from .db import APP_PROJECT_DBAPI, ProjectDBAPI log = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/_nodes_utils.py b/services/web/server/src/simcore_service_webserver/projects/_nodes_utils.py index 3fe9c510c63..20bc5e591e0 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_nodes_utils.py +++ b/services/web/server/src/simcore_service_webserver/projects/_nodes_utils.py @@ -7,7 +7,7 @@ from pydantic import NonNegativeFloat, NonNegativeInt from ..application_settings import get_settings -from .projects_exceptions import ProjectStartsTooManyDynamicNodes +from .exceptions import ProjectStartsTooManyDynamicNodes _NODE_START_INTERVAL_S: Final[datetime.timedelta] = datetime.timedelta(seconds=15) diff --git a/services/web/server/src/simcore_service_webserver/projects/_permalink.py b/services/web/server/src/simcore_service_webserver/projects/_permalink.py index aa82a993a61..e0084fb2523 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_permalink.py +++ b/services/web/server/src/simcore_service_webserver/projects/_permalink.py @@ -5,9 +5,9 @@ from aiohttp import web from models_library.projects import ProjectID from pydantic import BaseModel, HttpUrl -from simcore_service_webserver.projects.project_models import ProjectDict +from simcore_service_webserver.projects.models import ProjectDict -from .projects_exceptions import PermalinkFactoryError, PermalinkNotAllowedError +from .exceptions import PermalinkFactoryError, PermalinkNotAllowedError _PROJECT_PERMALINK = f"{__name__}" _logger = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/projects/projects_access.py b/services/web/server/src/simcore_service_webserver/projects/_projects_access.py similarity index 97% rename from services/web/server/src/simcore_service_webserver/projects/projects_access.py rename to services/web/server/src/simcore_service_webserver/projects/_projects_access.py index 1ca49ab00c0..f3f051d48f3 100644 --- a/services/web/server/src/simcore_service_webserver/projects/projects_access.py +++ b/services/web/server/src/simcore_service_webserver/projects/_projects_access.py @@ -2,7 +2,7 @@ from aiohttp import web from ..security.api import UserRole, get_access_model -from .projects_db import ProjectDBAPI +from .db import ProjectDBAPI async def can_update_node_inputs(context): diff --git a/services/web/server/src/simcore_service_webserver/projects/_rest_schemas.py b/services/web/server/src/simcore_service_webserver/projects/_rest_schemas.py index fabb07a3dbe..b9b2276bc16 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_rest_schemas.py +++ b/services/web/server/src/simcore_service_webserver/projects/_rest_schemas.py @@ -111,8 +111,6 @@ class ProjectReplace(InputSchema): class ProjectUpdate(InputSchema): - name: str = NOT_REQUIRED - description: str = NOT_REQUIRED name: str = NOT_REQUIRED description: str = NOT_REQUIRED thumbnail: HttpUrlWithCustomMinLength = NOT_REQUIRED diff --git a/services/web/server/src/simcore_service_webserver/projects/projects_db.py b/services/web/server/src/simcore_service_webserver/projects/db.py similarity index 99% rename from services/web/server/src/simcore_service_webserver/projects/projects_db.py rename to services/web/server/src/simcore_service_webserver/projects/db.py index 16b4f4d1044..eea9177f5d6 100644 --- a/services/web/server/src/simcore_service_webserver/projects/projects_db.py +++ b/services/web/server/src/simcore_service_webserver/projects/db.py @@ -33,8 +33,7 @@ from ..db_models import study_tags from ..utils import now_str -from .project_models import ProjectDict -from .projects_db_utils import ( +from ._db_utils import ( ANY_USER_ID_SENTINEL, BaseProjectDB, PermissionStr, @@ -45,13 +44,14 @@ convert_to_schema_names, create_project_access_rights, ) -from .projects_exceptions import ( +from .exceptions import ( NodeNotFoundError, ProjectDeleteError, ProjectInvalidRightsError, ProjectNotFoundError, ) -from .projects_utils import find_changed_node_keys +from .models import ProjectDict +from .utils import find_changed_node_keys log = logging.getLogger(__name__) @@ -666,7 +666,7 @@ async def list_node_ids_in_project(self, project_uuid: str) -> set[str]: .select_from(projects) .where(projects.c.uuid == f"{project_uuid}") ): - result.update(row.as_tuple()) # type: ignore + result.update(row.as_tuple()) return result # @@ -835,3 +835,6 @@ async def make_unique_project_uuid(self) -> str: def setup_projects_db(app: web.Application): # NOTE: inits once per app return ProjectDBAPI.set_once_in_app_context(app) + + +__all__ = ("ProjectAccessRights",) diff --git a/services/web/server/src/simcore_service_webserver/projects/projects_exceptions.py b/services/web/server/src/simcore_service_webserver/projects/exceptions.py similarity index 100% rename from services/web/server/src/simcore_service_webserver/projects/projects_exceptions.py rename to services/web/server/src/simcore_service_webserver/projects/exceptions.py diff --git a/services/web/server/src/simcore_service_webserver/projects/project_lock.py b/services/web/server/src/simcore_service_webserver/projects/lock.py similarity index 98% rename from services/web/server/src/simcore_service_webserver/projects/project_lock.py rename to services/web/server/src/simcore_service_webserver/projects/lock.py index 73077a65119..7acf7a1d759 100644 --- a/services/web/server/src/simcore_service_webserver/projects/project_lock.py +++ b/services/web/server/src/simcore_service_webserver/projects/lock.py @@ -12,7 +12,7 @@ from ..redis import get_redis_lock_manager_client from ..users.api import UserNameDict -from .projects_exceptions import ProjectLockError +from .exceptions import ProjectLockError PROJECT_REDIS_LOCK_KEY: str = "project_lock:{}" PROJECT_LOCK_TIMEOUT: Final[datetime.timedelta] = datetime.timedelta(seconds=10) diff --git a/services/web/server/src/simcore_service_webserver/projects/project_models.py b/services/web/server/src/simcore_service_webserver/projects/models.py similarity index 100% rename from services/web/server/src/simcore_service_webserver/projects/project_models.py rename to services/web/server/src/simcore_service_webserver/projects/models.py diff --git a/services/web/server/src/simcore_service_webserver/projects/projects_nodes_utils.py b/services/web/server/src/simcore_service_webserver/projects/nodes_utils.py similarity index 95% rename from services/web/server/src/simcore_service_webserver/projects/projects_nodes_utils.py rename to services/web/server/src/simcore_service_webserver/projects/nodes_utils.py index ebde9aef05a..54a154083ad 100644 --- a/services/web/server/src/simcore_service_webserver/projects/projects_nodes_utils.py +++ b/services/web/server/src/simcore_service_webserver/projects/nodes_utils.py @@ -1,6 +1,6 @@ import logging from collections import deque -from typing import Any, Coroutine, Optional +from typing import Any, Coroutine from aiohttp import web from models_library.errors import ErrorDict @@ -12,7 +12,7 @@ from servicelib.utils import fire_and_forget_task, logged_gather from . import projects_api -from .projects_utils import get_frontend_node_outputs_changes +from .utils import get_frontend_node_outputs_changes log = logging.getLogger(__name__) @@ -39,10 +39,10 @@ async def update_node_outputs( project_uuid: ProjectID, node_uuid: NodeIDStr, outputs: dict, - run_hash: Optional[str], - node_errors: Optional[list[ErrorDict]], + run_hash: str | None, + node_errors: list[ErrorDict] | None, *, - ui_changed_keys: Optional[set[str]], + ui_changed_keys: set[str] | None, ) -> None: # the new outputs might be {}, or {key_name: payload} project, keys_changed = await projects_api.update_project_node_outputs( diff --git a/services/web/server/src/simcore_service_webserver/projects/plugin.py b/services/web/server/src/simcore_service_webserver/projects/plugin.py index b8b669dec9b..c0e71d4a2af 100644 --- a/services/web/server/src/simcore_service_webserver/projects/plugin.py +++ b/services/web/server/src/simcore_service_webserver/projects/plugin.py @@ -15,15 +15,15 @@ from .._constants import APP_OPENAPI_SPECS_KEY, APP_SETTINGS_KEY from . import ( - projects_handlers, - projects_handlers_crud, - projects_nodes_handlers, - projects_ports_handlers, - projects_tags_handlers, + _handlers, + _handlers_crud, + _handlers_project_nodes, + _handlers_project_ports, + _handlers_project_tags, ) from ._observer import setup_project_observer_events -from .projects_access import setup_projects_access -from .projects_db import setup_projects_db +from ._projects_access import setup_projects_access +from .db import setup_projects_db logger = logging.getLogger(__name__) @@ -67,16 +67,16 @@ def setup_projects(app: web.Application) -> bool: # registers event handlers (e.g. on_user_disconnect) setup_project_observer_events(app) - app.router.add_routes(projects_handlers.routes) - app.router.add_routes(projects_handlers_crud.routes) - app.router.add_routes(projects_ports_handlers.routes) + app.router.add_routes(_handlers.routes) + app.router.add_routes(_handlers_crud.routes) + app.router.add_routes(_handlers_project_ports.routes) app.router.add_routes( _create_routes( "project", specs, - projects_nodes_handlers, - projects_tags_handlers, + _handlers_project_nodes, + _handlers_project_tags, ) ) diff --git a/services/web/server/src/simcore_service_webserver/projects/projects_api.py b/services/web/server/src/simcore_service_webserver/projects/projects_api.py index 1cd0f3d86d5..0af049b067c 100644 --- a/services/web/server/src/simcore_service_webserver/projects/projects_api.py +++ b/services/web/server/src/simcore_service_webserver/projects/projects_api.py @@ -64,25 +64,20 @@ send_messages, ) from ..storage import api as storage_api -from ..users.api import get_user_name, get_user_role +from ..users.api import UserNameDict, get_user_name, get_user_role from ..users.exceptions import UserNotFoundError -from . import _delete_utils, _nodes_utils -from .project_lock import ( - UserNameDict, - get_project_locked_state, - is_project_locked, - lock_project, -) -from .project_models import ProjectDict -from .projects_db import APP_PROJECT_DBAPI, ProjectDBAPI -from .projects_exceptions import ( +from . import _crud_delete_utils, _nodes_utils +from .db import APP_PROJECT_DBAPI, ProjectDBAPI +from .exceptions import ( NodeNotFoundError, ProjectLockError, ProjectStartsTooManyDynamicNodes, ProjectTooManyProjectOpened, ) -from .projects_settings import ProjectsSettings, get_plugin_settings -from .projects_utils import extract_dns_without_default_port +from .lock import get_project_locked_state, is_project_locked, lock_project +from .models import ProjectDict +from .settings import ProjectsSettings, get_plugin_settings +from .utils import extract_dns_without_default_port log = logging.getLogger(__name__) @@ -118,7 +113,7 @@ async def get_project_for_user( project, project_type = await db.get_project( user_id, project_uuid, - check_permissions=check_permissions, + check_permissions=check_permissions, # type: ignore[arg-type] ) # adds state if it is not a template @@ -176,12 +171,12 @@ async def submit_delete_project_task( raises ProjectInvalidRightsError raises ProjectNotFoundError """ - await _delete_utils.mark_project_as_deleted(app, project_uuid, user_id) + await _crud_delete_utils.mark_project_as_deleted(app, project_uuid, user_id) # Ensures ONE delete task per (project,user) pair task = get_delete_project_task(project_uuid, user_id) if not task: - task = _delete_utils.schedule_task( + task = _crud_delete_utils.schedule_task( app, project_uuid, user_id, @@ -195,7 +190,7 @@ async def submit_delete_project_task( def get_delete_project_task( project_uuid: ProjectID, user_id: UserID ) -> asyncio.Task | None: - if tasks := _delete_utils.get_scheduled_tasks(project_uuid, user_id): + if tasks := _crud_delete_utils.get_scheduled_tasks(project_uuid, user_id): assert len(tasks) == 1, f"{tasks=}" # nosec task = tasks[0] return task @@ -907,7 +902,8 @@ async def is_service_deprecated( ) if deprecation_date := service.get("deprecated"): deprecation_date = parse_obj_as(datetime.datetime, deprecation_date) - return datetime.datetime.utcnow() > deprecation_date + deprecation_date_bool: bool = datetime.datetime.utcnow() > deprecation_date + return deprecation_date_bool return False diff --git a/services/web/server/src/simcore_service_webserver/projects/projects_settings.py b/services/web/server/src/simcore_service_webserver/projects/settings.py similarity index 100% rename from services/web/server/src/simcore_service_webserver/projects/projects_settings.py rename to services/web/server/src/simcore_service_webserver/projects/settings.py diff --git a/services/web/server/src/simcore_service_webserver/projects/projects_utils.py b/services/web/server/src/simcore_service_webserver/projects/utils.py similarity index 97% rename from services/web/server/src/simcore_service_webserver/projects/projects_utils.py rename to services/web/server/src/simcore_service_webserver/projects/utils.py index a940f60d6d1..a81d5ae0afa 100644 --- a/services/web/server/src/simcore_service_webserver/projects/projects_utils.py +++ b/services/web/server/src/simcore_service_webserver/projects/utils.py @@ -1,7 +1,7 @@ import logging import re from copy import deepcopy -from typing import Any, AnyStr, Match, Optional, TypedDict, Union +from typing import Any, AnyStr, Match, TypedDict from uuid import UUID, uuid1, uuid5 from models_library.projects_nodes_io import NodeIDStr @@ -10,7 +10,7 @@ from servicelib.decorators import safe_return from yarl import URL -from .project_models import ProjectDict +from .models import ProjectDict log = logging.getLogger(__name__) @@ -25,8 +25,8 @@ class NodeDict(TypedDict, total=False): - key: Optional[ServiceKey] - outputs: Optional[dict[str, Any]] + key: ServiceKey | None + outputs: dict[str, Any] | None NodesMap = dict[NodeIDStr, NodeIDStr] @@ -35,7 +35,7 @@ class NodeDict(TypedDict, total=False): def clone_project_document( project: ProjectDict, *, - forced_copy_project_id: Optional[UUID] = None, + forced_copy_project_id: UUID | None = None, clean_output_data: bool = False, ) -> tuple[ProjectDict, NodesMap]: project_copy = deepcopy(project) @@ -63,7 +63,7 @@ def _create_new_node_uuid(old_uuid) -> NodeIDStr: project_map = {project["uuid"]: project_copy["uuid"]} - def _replace_uuids(node: Union[str, list, dict]) -> Union[str, list, dict]: + def _replace_uuids(node: str | list | dict) -> str | list | dict: if isinstance(node, str): # NOTE: for datasets we get something like project_uuid/node_uuid/file_id if "/" in node: @@ -124,7 +124,7 @@ def _normalize_value(s): except ValueError: return s - def _get_param_input_match(name, value, access) -> Optional[Match[AnyStr]]: + def _get_param_input_match(name, value, access) -> Match[AnyStr] | None: if ( isinstance(value, str) and access.get(name, "ReadAndWrite") == "ReadAndWrite" diff --git a/services/web/server/src/simcore_service_webserver/storage/api.py b/services/web/server/src/simcore_service_webserver/storage/api.py index 365371d1428..16a6971f4ea 100644 --- a/services/web/server/src/simcore_service_webserver/storage/api.py +++ b/services/web/server/src/simcore_service_webserver/storage/api.py @@ -25,8 +25,8 @@ from servicelib.logging_utils import get_log_record_extra, log_context from yarl import URL -from ..projects.project_models import ProjectDict -from ..projects.projects_utils import NodesMap +from ..projects.models import ProjectDict +from ..projects.utils import NodesMap from .settings import StorageSettings, get_plugin_settings log = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_projects.py b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_projects.py index ab04e8eac55..469c10e7455 100644 --- a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_projects.py +++ b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_projects.py @@ -18,12 +18,9 @@ from pydantic import AnyUrl, HttpUrl, parse_obj_as from servicelib.logging_utils import log_decorator +from ..projects.db import ProjectDBAPI +from ..projects.exceptions import ProjectInvalidRightsError, ProjectNotFoundError from ..projects.projects_api import get_project_for_user -from ..projects.projects_db import ProjectDBAPI -from ..projects.projects_exceptions import ( - ProjectInvalidRightsError, - ProjectNotFoundError, -) from ..utils import now_str from ._core import compose_uuid_from from ._models import FileParams, ServiceInfo, ViewerInfo @@ -185,7 +182,7 @@ async def _add_new_project( # TODO: this piece was taken from the end of projects.projects_handlers.create_projects from ..director_v2.api import create_or_update_pipeline - from ..projects.projects_db import APP_PROJECT_DBAPI + from ..projects.db import APP_PROJECT_DBAPI db: ProjectDBAPI = app[APP_PROJECT_DBAPI] diff --git a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_projects_permalinks.py b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_projects_permalinks.py index a46647e5274..d2a7e988316 100644 --- a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_projects_permalinks.py +++ b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_projects_permalinks.py @@ -5,11 +5,10 @@ from aiohttp import web from models_library.projects import ProjectID, ProjectIDStr from simcore_postgres_database.models.projects import ProjectType, projects -from simcore_service_webserver.projects.projects_exceptions import ( +from simcore_service_webserver.projects.exceptions import ( PermalinkNotAllowedError, ProjectNotFoundError, ) -from yarl import URL from ..db import get_database_engine from ..projects.api import ProjectPermalink, register_permalink_factory @@ -49,7 +48,10 @@ def create_permalink_for_study( f"Got {project_uuid=} with {project_type=}" ) - if not project_access_rights.get("1", {}).get("read", False): + project_access_rights_group_1_or_empty: _GroupAccessRightsDict | dict = ( + project_access_rights.get("1", {}) + ) + if not project_access_rights_group_1_or_empty.get("read", False): raise PermalinkNotAllowedError( "Cannot create permalink if not shared with everyone. " f"Got {project_uuid=} with {project_access_rights=}" @@ -63,7 +65,7 @@ def create_permalink_for_study( ) return ProjectPermalink( - url=f"{URL(permalink)}", + url=permalink, # MATUS is_public=project_is_public, ) 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 27149ac39c3..aaf5a5ad9c6 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 @@ -32,12 +32,9 @@ from .._constants import INDEX_RESOURCE_NAME from ..garbage_collector_settings import GUEST_USER_RC_LOCK_FORMAT from ..products.plugin import get_product_name -from ..projects.project_models import ProjectDict -from ..projects.projects_db import ANY_USER, ProjectDBAPI -from ..projects.projects_exceptions import ( - ProjectInvalidRightsError, - ProjectNotFoundError, -) +from ..projects.db import ANY_USER, ProjectDBAPI +from ..projects.exceptions import ProjectInvalidRightsError, ProjectNotFoundError +from ..projects.models import ProjectDict from ..redis import get_redis_lock_manager_client from ..security.api import is_anonymous, remember from ..storage.api import copy_data_folders_from_project @@ -205,11 +202,8 @@ async def copy_study_to_account( - Replaces template parameters by values passed in query - Avoids multiple copies of the same template on each account """ - from ..projects.projects_db import APP_PROJECT_DBAPI - from ..projects.projects_utils import ( - clone_project_document, - substitute_parameterized_inputs, - ) + from ..projects.db import APP_PROJECT_DBAPI + from ..projects.utils import clone_project_document, substitute_parameterized_inputs db: ProjectDBAPI = request.config_dict[APP_PROJECT_DBAPI] template_parameters = dict(request.query) diff --git a/services/web/server/src/simcore_service_webserver/version_control/_rest_handlers_base.py b/services/web/server/src/simcore_service_webserver/version_control/_rest_handlers_base.py index 83bf810ec11..d7bf99a190f 100644 --- a/services/web/server/src/simcore_service_webserver/version_control/_rest_handlers_base.py +++ b/services/web/server/src/simcore_service_webserver/version_control/_rest_handlers_base.py @@ -6,7 +6,7 @@ from servicelib.aiohttp.typing_extension import Handler from servicelib.json_serialization import json_dumps -from ..projects.projects_exceptions import ProjectNotFoundError +from ..projects.exceptions import ProjectNotFoundError from .errors import InvalidParameterError, NoCommitError, NotFoundError logger = logging.getLogger(__name__) diff --git a/services/web/server/src/simcore_service_webserver/version_control/db.py b/services/web/server/src/simcore_service_webserver/version_control/db.py index 9e7e069cf17..df8039774de 100644 --- a/services/web/server/src/simcore_service_webserver/version_control/db.py +++ b/services/web/server/src/simcore_service_webserver/version_control/db.py @@ -24,7 +24,7 @@ from sqlalchemy.dialects.postgresql import insert as pg_insert from ..db_base_repository import BaseRepository -from ..projects.project_models import ProjectProxy +from ..projects.models import ProjectProxy from .errors import ( CleanRequiredError, InvalidParameterError, diff --git a/services/web/server/src/simcore_service_webserver/version_control/vc_changes.py b/services/web/server/src/simcore_service_webserver/version_control/vc_changes.py index c95896e0f1c..50d2cae1e76 100644 --- a/services/web/server/src/simcore_service_webserver/version_control/vc_changes.py +++ b/services/web/server/src/simcore_service_webserver/version_control/vc_changes.py @@ -16,7 +16,7 @@ from models_library.projects import ProjectID, ProjectIDStr from models_library.projects_nodes import Node -from ..projects.project_models import ProjectProxy +from ..projects.models import ProjectProxy from ..utils import compute_sha1_on_small_dataset diff --git a/services/web/server/tests/conftest.py b/services/web/server/tests/conftest.py index 8737420098c..b7c628a5edd 100644 --- a/services/web/server/tests/conftest.py +++ b/services/web/server/tests/conftest.py @@ -24,8 +24,10 @@ from servicelib.json_serialization import json_dumps from simcore_service_webserver.application_settings_utils import convert_to_environ_vars from simcore_service_webserver.db_models import UserRole -from simcore_service_webserver.projects._create_utils import OVERRIDABLE_DOCUMENT_KEYS -from simcore_service_webserver.projects.project_models import ProjectDict +from simcore_service_webserver.projects._crud_create_utils import ( + OVERRIDABLE_DOCUMENT_KEYS, +) +from simcore_service_webserver.projects.models import ProjectDict from simcore_service_webserver.utils import to_datetime from tenacity._asyncio import AsyncRetrying from tenacity.retry import retry_if_exception_type diff --git a/services/web/server/tests/integration/01/test_garbage_collection.py b/services/web/server/tests/integration/01/test_garbage_collection.py index 2290c024dbc..d86ce85cc98 100644 --- a/services/web/server/tests/integration/01/test_garbage_collection.py +++ b/services/web/server/tests/integration/01/test_garbage_collection.py @@ -35,9 +35,9 @@ list_user_groups, ) from simcore_service_webserver.login.plugin import setup_login -from simcore_service_webserver.projects._delete_utils import get_scheduled_tasks +from simcore_service_webserver.projects._crud_delete_utils import get_scheduled_tasks +from simcore_service_webserver.projects.models import ProjectDict from simcore_service_webserver.projects.plugin import setup_projects -from simcore_service_webserver.projects.project_models import ProjectDict from simcore_service_webserver.resource_manager.plugin import setup_resource_manager from simcore_service_webserver.resource_manager.registry import get_registry from simcore_service_webserver.rest import setup_rest diff --git a/services/web/server/tests/integration/01/test_project_workflow.py b/services/web/server/tests/integration/01/test_project_workflow.py index cb61290dad4..730f9cc3669 100644 --- a/services/web/server/tests/integration/01/test_project_workflow.py +++ b/services/web/server/tests/integration/01/test_project_workflow.py @@ -37,8 +37,8 @@ from simcore_service_webserver.garbage_collector import setup_garbage_collector from simcore_service_webserver.login.plugin import setup_login from simcore_service_webserver.products.plugin import setup_products +from simcore_service_webserver.projects.models import ProjectDict from simcore_service_webserver.projects.plugin import setup_projects -from simcore_service_webserver.projects.project_models import ProjectDict from simcore_service_webserver.resource_manager.plugin import setup_resource_manager from simcore_service_webserver.rest import setup_rest from simcore_service_webserver.security.plugin import setup_security @@ -128,14 +128,14 @@ async def _mock_result(): ) mock = mocker.patch( - "simcore_service_webserver.projects._create_utils.copy_data_folders_from_project", + "simcore_service_webserver.projects._crud_create_utils.copy_data_folders_from_project", autospec=True, side_effect=_mock_copy_data_from_project, ) # requests storage to delete data mock1 = mocker.patch( - "simcore_service_webserver.projects._delete_utils.delete_data_folders_of_project", + "simcore_service_webserver.projects._crud_delete_utils.delete_data_folders_of_project", return_value="", ) return mock, mock1 @@ -163,8 +163,8 @@ async def _mocked_get_services_for_user(*args, **kwargs): return services_in_project for namespace in ( - "simcore_service_webserver.projects._read_utils.get_services_for_user_in_product", - "simcore_service_webserver.projects.projects_handlers_crud.get_services_for_user_in_product", + "simcore_service_webserver.projects._crud_read_utils.get_services_for_user_in_product", + "simcore_service_webserver.projects._handlers_crud.get_services_for_user_in_product", ): mock = mocker.patch( namespace, diff --git a/services/web/server/tests/integration/02/notifications/test_rabbitmq_consumers.py b/services/web/server/tests/integration/02/notifications/test_rabbitmq_consumers.py index e1ac2d89daf..c5fd66a4be7 100644 --- a/services/web/server/tests/integration/02/notifications/test_rabbitmq_consumers.py +++ b/services/web/server/tests/integration/02/notifications/test_rabbitmq_consumers.py @@ -48,8 +48,8 @@ from simcore_service_webserver.login.plugin import setup_login from simcore_service_webserver.notifications import project_logs from simcore_service_webserver.notifications.plugin import setup_notifications +from simcore_service_webserver.projects.models import ProjectDict from simcore_service_webserver.projects.plugin import setup_projects -from simcore_service_webserver.projects.project_models import ProjectDict from simcore_service_webserver.resource_manager.plugin import setup_resource_manager from simcore_service_webserver.rest import setup_rest from simcore_service_webserver.security.plugin import setup_security diff --git a/services/web/server/tests/unit/isolated/test_project_utils.py b/services/web/server/tests/unit/isolated/test_project_utils.py index 71bf14e2077..744f42fc25a 100644 --- a/services/web/server/tests/unit/isolated/test_project_utils.py +++ b/services/web/server/tests/unit/isolated/test_project_utils.py @@ -1,7 +1,7 @@ from typing import Any import pytest -from simcore_service_webserver.projects.projects_utils import ( +from simcore_service_webserver.projects.utils import ( NodeDict, find_changed_node_keys, get_frontend_node_outputs_changes, diff --git a/services/web/server/tests/unit/isolated/test_projects_models.py b/services/web/server/tests/unit/isolated/test_projects_models.py index 2234f77273d..e4be62b6160 100644 --- a/services/web/server/tests/unit/isolated/test_projects_models.py +++ b/services/web/server/tests/unit/isolated/test_projects_models.py @@ -5,7 +5,7 @@ import datetime import pytest -from simcore_service_webserver.projects.projects_db_utils import ( +from simcore_service_webserver.projects._db_utils import ( convert_to_db_names, convert_to_schema_names, ) diff --git a/services/web/server/tests/unit/isolated/test_projects_utils.py b/services/web/server/tests/unit/isolated/test_projects_utils.py index bd53b860ace..a3d905b0792 100644 --- a/services/web/server/tests/unit/isolated/test_projects_utils.py +++ b/services/web/server/tests/unit/isolated/test_projects_utils.py @@ -11,11 +11,9 @@ import pytest from jsonschema import ValidationError from models_library.projects import Project -from simcore_service_webserver.projects.project_models import ProjectDict -from simcore_service_webserver.projects.projects_nodes_utils import ( - project_get_depending_nodes, -) -from simcore_service_webserver.projects.projects_utils import ( +from simcore_service_webserver.projects.models import ProjectDict +from simcore_service_webserver.projects.nodes_utils import project_get_depending_nodes +from simcore_service_webserver.projects.utils import ( any_node_inputs_changed, clone_project_document, default_copy_project_name, diff --git a/services/web/server/tests/unit/isolated/test_projects_utils_templates.py b/services/web/server/tests/unit/isolated/test_projects_utils_templates.py index 12744339a69..959685748ac 100644 --- a/services/web/server/tests/unit/isolated/test_projects_utils_templates.py +++ b/services/web/server/tests/unit/isolated/test_projects_utils_templates.py @@ -5,7 +5,7 @@ import json import pytest -from simcore_service_webserver.projects.projects_utils import ( +from simcore_service_webserver.projects.utils import ( VARIABLE_PATTERN, substitute_parameterized_inputs, ) diff --git a/services/web/server/tests/unit/isolated/test_security_access_model.py b/services/web/server/tests/unit/isolated/test_security_access_model.py index a956b928b4b..6b237d986c1 100644 --- a/services/web/server/tests/unit/isolated/test_security_access_model.py +++ b/services/web/server/tests/unit/isolated/test_security_access_model.py @@ -14,7 +14,7 @@ import jsondiff import pytest -from simcore_service_webserver.projects.project_models import ProjectDict +from simcore_service_webserver.projects.models import ProjectDict from simcore_service_webserver.security._access_model import ( RoleBasedAccessModel, check_access, diff --git a/services/web/server/tests/unit/with_dbs/01/studies_dispatcher/test_studies_dispatcher_handlers.py b/services/web/server/tests/unit/with_dbs/01/studies_dispatcher/test_studies_dispatcher_handlers.py index b7a78acff6c..b2487072ade 100644 --- a/services/web/server/tests/unit/with_dbs/01/studies_dispatcher/test_studies_dispatcher_handlers.py +++ b/services/web/server/tests/unit/with_dbs/01/studies_dispatcher/test_studies_dispatcher_handlers.py @@ -278,7 +278,7 @@ def catalog_subsystem_mock(mocker: MockerFixture) -> None: ] mock = mocker.patch( - "simcore_service_webserver.projects._read_utils.get_services_for_user_in_product", + "simcore_service_webserver.projects._crud_read_utils.get_services_for_user_in_product", autospec=True, ) diff --git a/services/web/server/tests/unit/with_dbs/01/studies_dispatcher/test_studies_dispatcher_studies_access.py b/services/web/server/tests/unit/with_dbs/01/studies_dispatcher/test_studies_dispatcher_studies_access.py index a87eb4fde3c..1ad8314d63a 100644 --- a/services/web/server/tests/unit/with_dbs/01/studies_dispatcher/test_studies_dispatcher_studies_access.py +++ b/services/web/server/tests/unit/with_dbs/01/studies_dispatcher/test_studies_dispatcher_studies_access.py @@ -29,7 +29,7 @@ from servicelib.aiohttp.long_running_tasks.server import TaskProgress from servicelib.aiohttp.rest_responses import unwrap_envelope from servicelib.common_headers import UNDEFINED_DEFAULT_SIMCORE_USER_AGENT_VALUE -from simcore_service_webserver.projects.project_models import ProjectDict +from simcore_service_webserver.projects.models import ProjectDict from simcore_service_webserver.projects.projects_api import submit_delete_project_task from simcore_service_webserver.users.api import ( delete_user_without_projects, diff --git a/services/web/server/tests/unit/with_dbs/02/conftest.py b/services/web/server/tests/unit/with_dbs/02/conftest.py index b0fa41b8534..f59e1fa686c 100644 --- a/services/web/server/tests/unit/with_dbs/02/conftest.py +++ b/services/web/server/tests/unit/with_dbs/02/conftest.py @@ -32,7 +32,7 @@ from settings_library.catalog import CatalogSettings from simcore_service_webserver.application_settings import get_settings from simcore_service_webserver.catalog.settings import get_plugin_settings -from simcore_service_webserver.projects.project_models import ProjectDict +from simcore_service_webserver.projects.models import ProjectDict @pytest.fixture diff --git a/services/web/server/tests/unit/with_dbs/02/test_project_lock.py b/services/web/server/tests/unit/with_dbs/02/test_project_lock.py index 5c80fccb515..b7a848cc0ce 100644 --- a/services/web/server/tests/unit/with_dbs/02/test_project_lock.py +++ b/services/web/server/tests/unit/with_dbs/02/test_project_lock.py @@ -13,7 +13,7 @@ from models_library.projects_state import ProjectLocked, ProjectStatus from models_library.users import UserID from pydantic import parse_raw_as -from simcore_service_webserver.projects.project_lock import ( +from simcore_service_webserver.projects.lock import ( PROJECT_REDIS_LOCK_KEY, ProjectLockError, get_project_locked_state, diff --git a/services/web/server/tests/unit/with_dbs/02/test_projects_cancellations.py b/services/web/server/tests/unit/with_dbs/02/test_projects_cancellations.py index b5d220d451b..826bc963827 100644 --- a/services/web/server/tests/unit/with_dbs/02/test_projects_cancellations.py +++ b/services/web/server/tests/unit/with_dbs/02/test_projects_cancellations.py @@ -23,7 +23,7 @@ from simcore_postgres_database.models.users import UserRole from simcore_service_webserver._meta import api_version_prefix from simcore_service_webserver.application_settings import get_settings -from simcore_service_webserver.projects.project_models import ProjectDict +from simcore_service_webserver.projects.models import ProjectDict from tenacity._asyncio import AsyncRetrying from tenacity.stop import stop_after_delay from tenacity.wait import wait_fixed diff --git a/services/web/server/tests/unit/with_dbs/02/test_projects_handlers__delete.py b/services/web/server/tests/unit/with_dbs/02/test_projects_handlers__delete.py index bb3adb9d9ff..78378a962e1 100644 --- a/services/web/server/tests/unit/with_dbs/02/test_projects_handlers__delete.py +++ b/services/web/server/tests/unit/with_dbs/02/test_projects_handlers__delete.py @@ -26,8 +26,8 @@ from simcore_postgres_database.models.projects_to_products import projects_to_products from simcore_service_webserver._meta import api_version_prefix from simcore_service_webserver.db_models import UserRole -from simcore_service_webserver.projects import _delete_utils -from simcore_service_webserver.projects.project_models import ProjectDict +from simcore_service_webserver.projects import _crud_delete_utils +from simcore_service_webserver.projects.models import ProjectDict from simcore_service_webserver.projects.projects_api import lock_with_notification from socketio.exceptions import ConnectionError as SocketConnectionError @@ -66,7 +66,7 @@ async def test_delete_project( await _request_delete_project(client, user_project, expected.no_content) - tasks = _delete_utils.get_scheduled_tasks( + tasks = _crud_delete_utils.get_scheduled_tasks( project_uuid=user_project["uuid"], user_id=logged_user["id"] ) diff --git a/services/web/server/tests/unit/with_dbs/02/test_projects_handlers__list.py b/services/web/server/tests/unit/with_dbs/02/test_projects_handlers__list.py index 04556939dde..8e7a26dc43b 100644 --- a/services/web/server/tests/unit/with_dbs/02/test_projects_handlers__list.py +++ b/services/web/server/tests/unit/with_dbs/02/test_projects_handlers__list.py @@ -18,7 +18,7 @@ ) from simcore_service_webserver._meta import api_version_prefix from simcore_service_webserver.db_models import UserRole -from simcore_service_webserver.projects.project_models import ProjectDict +from simcore_service_webserver.projects.models import ProjectDict from simcore_service_webserver.utils import to_datetime from yarl import URL diff --git a/services/web/server/tests/unit/with_dbs/02/test_projects_handlers__open_close.py b/services/web/server/tests/unit/with_dbs/02/test_projects_handlers__open_close.py index 90f0e33c06b..eed05fe0524 100644 --- a/services/web/server/tests/unit/with_dbs/02/test_projects_handlers__open_close.py +++ b/services/web/server/tests/unit/with_dbs/02/test_projects_handlers__open_close.py @@ -44,7 +44,7 @@ from servicelib.common_headers import UNDEFINED_DEFAULT_SIMCORE_USER_AGENT_VALUE from simcore_postgres_database.models.products import products from simcore_service_webserver.db_models import UserRole -from simcore_service_webserver.projects.project_models import ProjectDict +from simcore_service_webserver.projects.models import ProjectDict from simcore_service_webserver.socketio.messages import SOCKET_IO_PROJECT_UPDATED_EVENT from simcore_service_webserver.utils import to_datetime from socketio.exceptions import ConnectionError as SocketConnectionError @@ -908,7 +908,7 @@ async def test_project_node_lifetime( faker: Faker, ): mock_storage_api_delete_data_folders_of_project_node = mocker.patch( - "simcore_service_webserver.projects.projects_handlers_crud.projects_api.storage_api.delete_data_folders_of_project_node", + "simcore_service_webserver.projects._handlers_crud.projects_api.storage_api.delete_data_folders_of_project_node", return_value="", ) diff --git a/services/web/server/tests/unit/with_dbs/02/test_projects_handlers_crud.py b/services/web/server/tests/unit/with_dbs/02/test_projects_handlers_crud.py index 9f5f3e241a4..c924197cf30 100644 --- a/services/web/server/tests/unit/with_dbs/02/test_projects_handlers_crud.py +++ b/services/web/server/tests/unit/with_dbs/02/test_projects_handlers_crud.py @@ -30,7 +30,7 @@ from simcore_service_webserver._meta import api_version_prefix from simcore_service_webserver.db_models import UserRole from simcore_service_webserver.projects._permalink import ProjectPermalink -from simcore_service_webserver.projects.project_models import ProjectDict +from simcore_service_webserver.projects.models import ProjectDict from simcore_service_webserver.utils import to_datetime from yarl import URL diff --git a/services/web/server/tests/unit/with_dbs/02/test_projects_nodes_handler.py b/services/web/server/tests/unit/with_dbs/02/test_projects_nodes_handler.py index 4b03bd85bd9..7e1a2873d41 100644 --- a/services/web/server/tests/unit/with_dbs/02/test_projects_nodes_handler.py +++ b/services/web/server/tests/unit/with_dbs/02/test_projects_nodes_handler.py @@ -27,7 +27,7 @@ from servicelib.common_headers import UNDEFINED_DEFAULT_SIMCORE_USER_AGENT_VALUE from simcore_postgres_database.models.projects import projects as projects_db_model from simcore_service_webserver.db_models import UserRole -from simcore_service_webserver.projects.project_models import ProjectDict +from simcore_service_webserver.projects.models import ProjectDict @pytest.mark.parametrize( diff --git a/services/web/server/tests/unit/with_dbs/02/test_projects_ports_handlers.py b/services/web/server/tests/unit/with_dbs/02/test_projects_ports_handlers.py index 935c801fb7a..8768a2039c5 100644 --- a/services/web/server/tests/unit/with_dbs/02/test_projects_ports_handlers.py +++ b/services/web/server/tests/unit/with_dbs/02/test_projects_ports_handlers.py @@ -19,14 +19,14 @@ from pytest_simcore.helpers.utils_login import UserInfoDict from simcore_service_webserver._meta import API_VTAG as VX from simcore_service_webserver.db_models import UserRole -from simcore_service_webserver.projects import projects_ports_handlers -from simcore_service_webserver.projects.project_models import ProjectDict +from simcore_service_webserver.projects import _handlers_project_ports +from simcore_service_webserver.projects.models import ProjectDict from yarl import URL @pytest.mark.parametrize( "route", - projects_ports_handlers.routes, + _handlers_project_ports.routes, ids=lambda r: f"{r.method.upper()} {r.path}", ) def test_route_against_openapi_specs(route, openapi_specs: OpenApiSpecs): diff --git a/services/web/server/tests/unit/with_dbs/03/garbage_collector/test_resource_manager.py b/services/web/server/tests/unit/with_dbs/03/garbage_collector/test_resource_manager.py index aae4a45b758..ab49c588a59 100644 --- a/services/web/server/tests/unit/with_dbs/03/garbage_collector/test_resource_manager.py +++ b/services/web/server/tests/unit/with_dbs/03/garbage_collector/test_resource_manager.py @@ -37,12 +37,12 @@ from simcore_service_webserver.director_v2.plugin import setup_director_v2 from simcore_service_webserver.login.plugin import setup_login from simcore_service_webserver.products.plugin import setup_products +from simcore_service_webserver.projects.exceptions import ProjectNotFoundError from simcore_service_webserver.projects.plugin import setup_projects from simcore_service_webserver.projects.projects_api import ( remove_project_dynamic_services, submit_delete_project_task, ) -from simcore_service_webserver.projects.projects_exceptions import ProjectNotFoundError from simcore_service_webserver.resource_manager.plugin import setup_resource_manager from simcore_service_webserver.resource_manager.registry import ( RedisResourceRegistry, @@ -155,7 +155,7 @@ def client( @pytest.fixture def mock_storage_delete_data_folders(mocker: MockerFixture) -> mock.Mock: return mocker.patch( - "simcore_service_webserver.projects._delete_utils.delete_data_folders_of_project", + "simcore_service_webserver.projects._crud_delete_utils.delete_data_folders_of_project", return_value=None, ) diff --git a/services/web/server/tests/unit/with_dbs/03/meta_modeling/test_meta_modeling_iterations.py b/services/web/server/tests/unit/with_dbs/03/meta_modeling/test_meta_modeling_iterations.py index 9a2fcef0737..2d7c0778f14 100644 --- a/services/web/server/tests/unit/with_dbs/03/meta_modeling/test_meta_modeling_iterations.py +++ b/services/web/server/tests/unit/with_dbs/03/meta_modeling/test_meta_modeling_iterations.py @@ -33,7 +33,7 @@ ProjectIterationItem, ProjectIterationResultItem, ) -from simcore_service_webserver.projects.project_models import ProjectDict +from simcore_service_webserver.projects.models import ProjectDict REQUEST_MODEL_POLICY = { "by_alias": True, @@ -176,7 +176,7 @@ async def _mock_catalog_get(app, user_id, product_name, only_key_versions): ] + [{"key": "simcore/services/frontend/parameter/integer", "version": "1.0.0"}] mocker.patch( - "simcore_service_webserver.projects.projects_handlers_crud.get_services_for_user_in_product", + "simcore_service_webserver.projects._handlers_crud.get_services_for_user_in_product", side_effect=_mock_catalog_get, autospec=True, ) diff --git a/services/web/server/tests/unit/with_dbs/03/tags/test_tags.py b/services/web/server/tests/unit/with_dbs/03/tags/test_tags.py index 24a99117fda..18651b695b0 100644 --- a/services/web/server/tests/unit/with_dbs/03/tags/test_tags.py +++ b/services/web/server/tests/unit/with_dbs/03/tags/test_tags.py @@ -28,7 +28,7 @@ from simcore_service_webserver._meta import api_version_prefix from simcore_service_webserver.db import get_database_engine from simcore_service_webserver.db_models import UserRole -from simcore_service_webserver.projects.project_models import ProjectDict +from simcore_service_webserver.projects.models import ProjectDict from simcore_service_webserver.tags import _handlers diff --git a/services/web/server/tests/unit/with_dbs/03/test_project_db.py b/services/web/server/tests/unit/with_dbs/03/test_project_db.py index 08f4a786bf7..b95778ac67a 100644 --- a/services/web/server/tests/unit/with_dbs/03/test_project_db.py +++ b/services/web/server/tests/unit/with_dbs/03/test_project_db.py @@ -27,8 +27,12 @@ from simcore_postgres_database.models.groups import GroupType from simcore_postgres_database.models.projects_to_products import projects_to_products from simcore_postgres_database.models.users import UserRole -from simcore_service_webserver.projects.project_models import ProjectDict -from simcore_service_webserver.projects.projects_db import ( +from simcore_service_webserver.projects._db_utils import ( + DB_EXCLUSIVE_COLUMNS, + SCHEMA_NON_NULL_KEYS, + PermissionStr, +) +from simcore_service_webserver.projects.db import ( ANY_USER, ProjectAccessRights, ProjectDBAPI, @@ -38,15 +42,11 @@ convert_to_schema_names, create_project_access_rights, ) -from simcore_service_webserver.projects.projects_db_utils import ( - DB_EXCLUSIVE_COLUMNS, - SCHEMA_NON_NULL_KEYS, - PermissionStr, -) -from simcore_service_webserver.projects.projects_exceptions import ( +from simcore_service_webserver.projects.exceptions import ( NodeNotFoundError, ProjectNotFoundError, ) +from simcore_service_webserver.projects.models import ProjectDict from simcore_service_webserver.users.exceptions import UserNotFoundError from simcore_service_webserver.utils import to_datetime from sqlalchemy.engine.result import Row diff --git a/services/web/server/tests/unit/with_dbs/03/version_control/conftest.py b/services/web/server/tests/unit/with_dbs/03/version_control/conftest.py index 5870c017b42..7f8706da059 100644 --- a/services/web/server/tests/unit/with_dbs/03/version_control/conftest.py +++ b/services/web/server/tests/unit/with_dbs/03/version_control/conftest.py @@ -27,7 +27,7 @@ from simcore_service_webserver.db import APP_DB_ENGINE_KEY from simcore_service_webserver.db_models import UserRole from simcore_service_webserver.log import setup_logging -from simcore_service_webserver.projects.project_models import ProjectDict +from simcore_service_webserver.projects.models import ProjectDict from tenacity._asyncio import AsyncRetrying from tenacity.stop import stop_after_delay @@ -205,7 +205,7 @@ async def request_delete_project( autospec=True, ) fire_and_forget_call_to_storage: mock.Mock = mocker.patch( - "simcore_service_webserver.projects._delete_utils.delete_data_folders_of_project", + "simcore_service_webserver.projects._crud_delete_utils.delete_data_folders_of_project", autospec=True, ) diff --git a/services/web/server/tests/unit/with_dbs/03/version_control/test_version_control.py b/services/web/server/tests/unit/with_dbs/03/version_control/test_version_control.py index 538d4d00431..6d6eb21d28e 100644 --- a/services/web/server/tests/unit/with_dbs/03/version_control/test_version_control.py +++ b/services/web/server/tests/unit/with_dbs/03/version_control/test_version_control.py @@ -8,7 +8,7 @@ from openapi_core.schema.specs.models import Spec as OpenApiSpecs from pydantic import BaseModel from simcore_service_webserver._meta import API_VTAG as VX -from simcore_service_webserver.projects.project_models import ProjectDict +from simcore_service_webserver.projects.models import ProjectDict from simcore_service_webserver.version_control.db import compute_workbench_checksum from simcore_service_webserver.version_control.plugin import _rest_handlers diff --git a/services/web/server/tests/unit/with_dbs/03/version_control/test_version_control_core.py b/services/web/server/tests/unit/with_dbs/03/version_control/test_version_control_core.py index 4ae10d64cb7..c1b32e77c4d 100644 --- a/services/web/server/tests/unit/with_dbs/03/version_control/test_version_control_core.py +++ b/services/web/server/tests/unit/with_dbs/03/version_control/test_version_control_core.py @@ -11,7 +11,7 @@ from faker import Faker from simcore_service_webserver._constants import RQT_USERID_KEY from simcore_service_webserver.projects import projects_api -from simcore_service_webserver.projects.project_models import ProjectDict +from simcore_service_webserver.projects.models import ProjectDict from simcore_service_webserver.version_control._core import ( checkout_checkpoint, create_checkpoint, diff --git a/services/web/server/tests/unit/with_dbs/03/version_control/test_version_control_handlers.py b/services/web/server/tests/unit/with_dbs/03/version_control/test_version_control_handlers.py index 2697cb10d8c..a2cd1ff34c8 100644 --- a/services/web/server/tests/unit/with_dbs/03/version_control/test_version_control_handlers.py +++ b/services/web/server/tests/unit/with_dbs/03/version_control/test_version_control_handlers.py @@ -15,7 +15,7 @@ from pydantic.main import BaseModel from pytest_simcore.helpers.utils_assert import assert_status from simcore_service_webserver._meta import API_VTAG as VX -from simcore_service_webserver.projects.project_models import ProjectDict +from simcore_service_webserver.projects.models import ProjectDict from simcore_service_webserver.version_control.models import ( CheckpointApiModel, RepoApiModel, diff --git a/services/web/server/tests/unit/with_dbs/conftest.py b/services/web/server/tests/unit/with_dbs/conftest.py index 4cd7e5ef462..92a0a470c64 100644 --- a/services/web/server/tests/unit/with_dbs/conftest.py +++ b/services/web/server/tests/unit/with_dbs/conftest.py @@ -52,7 +52,7 @@ delete_user_group, list_user_groups, ) -from simcore_service_webserver.projects.project_models import ProjectDict +from simcore_service_webserver.projects.models import ProjectDict CURRENT_DIR = Path(sys.argv[0] if __name__ == "__main__" else __file__).resolve().parent @@ -225,8 +225,8 @@ async def _mocked_get_services_for_user(*args, **kwargs): return services_in_project for namespace in ( - "simcore_service_webserver.projects._read_utils.get_services_for_user_in_product", - "simcore_service_webserver.projects.projects_handlers_crud.get_services_for_user_in_product", + "simcore_service_webserver.projects._crud_read_utils.get_services_for_user_in_product", + "simcore_service_webserver.projects._handlers_crud.get_services_for_user_in_product", ): mock = mocker.patch( namespace, @@ -305,14 +305,14 @@ async def _mock_result(): ) mock = mocker.patch( - "simcore_service_webserver.projects._create_utils.copy_data_folders_from_project", + "simcore_service_webserver.projects._crud_create_utils.copy_data_folders_from_project", autospec=True, side_effect=_mock_copy_data_from_project, ) async_mock = mocker.AsyncMock(return_value="") mock1 = mocker.patch( - "simcore_service_webserver.projects._delete_utils.delete_data_folders_of_project", + "simcore_service_webserver.projects._crud_delete_utils.delete_data_folders_of_project", autospec=True, side_effect=async_mock, ) @@ -324,7 +324,7 @@ async def _mock_result(): ) mock3 = mocker.patch( - "simcore_service_webserver.projects._create_utils.get_project_total_size_simcore_s3", + "simcore_service_webserver.projects._crud_create_utils.get_project_total_size_simcore_s3", autospec=True, return_value=parse_obj_as(ByteSize, "1Gib"), )