Skip to content

Commit c7845fc

Browse files
add new repo
1 parent a0fbe08 commit c7845fc

File tree

6 files changed

+82
-17
lines changed

6 files changed

+82
-17
lines changed

packages/models-library/src/models_library/api_schemas_webserver/_base.py

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,27 +22,23 @@ class InputSchemaWithoutCamelCase(BaseModel):
2222
)
2323

2424

25-
class InputSchema(BaseModel):
25+
class InputSchema(InputSchemaWithoutCamelCase):
2626
model_config = ConfigDict(
27-
**InputSchemaWithoutCamelCase.model_config,
2827
alias_generator=snake_to_camel,
2928
)
3029

3130

3231
class OutputSchemaWithoutCamelCase(BaseModel):
3332
model_config = ConfigDict(
3433
populate_by_name=True,
35-
extra="ignore",
34+
extra="ignore", # Used to prune extra fields from internal data
3635
frozen=True,
3736
)
3837

3938

40-
class OutputSchema(BaseModel):
39+
class OutputSchema(OutputSchemaWithoutCamelCase):
4140
model_config = ConfigDict(
4241
alias_generator=snake_to_camel,
43-
populate_by_name=True,
44-
extra="ignore", # Used to prune extra fields from internal data
45-
frozen=True,
4642
)
4743

4844
def data(

packages/postgres-database/src/simcore_postgres_database/webserver_models.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from .models.groups import GroupType, groups, user_to_groups
1313
from .models.products import products
1414
from .models.projects import ProjectType, projects
15+
from .models.projects_nodes import projects_nodes
1516
from .models.projects_tags import projects_tags
1617
from .models.projects_to_wallet import projects_to_wallet
1718
from .models.scicrunch_resources import scicrunch_resources
@@ -32,6 +33,7 @@
3233
"NodeClass",
3334
"products",
3435
"projects",
36+
"projects_nodes",
3537
"ProjectType",
3638
"scicrunch_resources",
3739
"StateType",

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
)
2828
from models_library.groups import EVERYONE_GROUP_ID, Group, GroupID, GroupType
2929
from models_library.projects import Project, ProjectID
30+
from models_library.projects_nodes import Node
3031
from models_library.projects_nodes_io import NodeID, NodeIDStr
3132
from models_library.services import ServiceKeyVersion
3233
from models_library.services_resources import ServiceResourcesDict
@@ -234,7 +235,7 @@ async def patch_project_node(request: web.Request) -> web.Response:
234235
user_id=req_ctx.user_id,
235236
project_id=path_params.project_id,
236237
node_id=path_params.node_id,
237-
node_patch=node_patch,
238+
node_patch=Node.model_construct(**node_patch.model_dump()),
238239
)
239240

240241
return web.json_response(status=status.HTTP_204_NO_CONTENT)
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import logging
2+
3+
import sqlalchemy as sa
4+
from aiohttp import web
5+
from models_library.projects import ProjectID
6+
from models_library.projects_nodes import Node, NodeID
7+
from simcore_postgres_database.utils_repos import transaction_context
8+
from simcore_postgres_database.webserver_models import projects_nodes
9+
from sqlalchemy.ext.asyncio import AsyncConnection
10+
11+
from ..db.plugin import get_asyncpg_engine
12+
from .models import NodeDB
13+
14+
_logger = logging.getLogger(__name__)
15+
16+
17+
async def update(
18+
app: web.Application,
19+
connection: AsyncConnection | None = None,
20+
*,
21+
project_id: ProjectID,
22+
node_id: NodeID,
23+
node: Node,
24+
) -> None:
25+
async with transaction_context(get_asyncpg_engine(app), connection) as conn:
26+
await conn.stream(
27+
projects_nodes.update()
28+
.values(**NodeDB.model_validate(node.model_dump()).model_dump())
29+
.where(
30+
sa.and_(
31+
projects_nodes.c.project_uuid == f"{project_id}",
32+
projects_nodes.c.node_id == f"{node_id}",
33+
)
34+
)
35+
)

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

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
from datetime import datetime
1+
import datetime as dt
22
from enum import Enum
33
from typing import Any, TypeAlias
44

55
from aiopg.sa.result import RowProxy
66
from models_library.api_schemas_webserver.projects import ProjectPatch
77
from models_library.folders import FolderID
88
from models_library.projects import ClassifierID, ProjectID
9+
from models_library.projects_nodes import NodeID
910
from models_library.projects_ui import StudyUI
1011
from models_library.users import UserID
1112
from models_library.utils.common_validators import (
@@ -42,16 +43,16 @@ class ProjectDB(BaseModel):
4243
description: str
4344
thumbnail: HttpUrl | None
4445
prj_owner: UserID
45-
creation_date: datetime
46-
last_change_date: datetime
46+
creation_date: dt.datetime
47+
last_change_date: dt.datetime
4748
ui: StudyUI | None
4849
classifiers: list[ClassifierID]
4950
dev: dict | None
5051
quality: dict[str, Any]
5152
published: bool
5253
hidden: bool
5354
workspace_id: WorkspaceID | None
54-
trashed_at: datetime | None
55+
trashed_at: dt.datetime | None
5556
trashed_explicitly: bool = False
5657

5758
model_config = ConfigDict(from_attributes=True, arbitrary_types_allowed=True)
@@ -95,12 +96,36 @@ class UserProjectAccessRightsWithWorkspace(BaseModel):
9596

9697
class ProjectPatchExtended(ProjectPatch):
9798
# Only used internally
98-
trashed_at: datetime | None
99+
trashed_at: dt.datetime | None
99100
trashed_explicitly: bool
100101

101102
model_config = ConfigDict(populate_by_name=True, extra="forbid")
102103

103104

105+
class NodeDB(BaseModel):
106+
node_id: NodeID
107+
required_resources: dict[str, Any]
108+
created: dt.datetime
109+
modified: dt.datetime
110+
project_uuid: ProjectID
111+
project_node_id: int
112+
key: str
113+
version: str
114+
label: str
115+
progress: float | None
116+
thumbnail: HttpUrl | None
117+
input_access: dict[str, Any]
118+
input_nodes: list[NodeID]
119+
inputs: dict[str, Any]
120+
inouts_units: dict[str, Any]
121+
output_nodes: list[NodeID]
122+
outputs: dict[str, Any]
123+
run_hash: str | None
124+
state: dict[str, Any] | None
125+
parent: str | None
126+
boot_options: dict[str, Any] | None
127+
128+
104129
__all__: tuple[str, ...] = (
105130
"ProjectDict",
106131
"ProjectProxy",

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
DynamicServiceStop,
3333
)
3434
from models_library.api_schemas_webserver.projects import ProjectPatch
35-
from models_library.api_schemas_webserver.projects_nodes import NodePatch
3635
from models_library.basic_types import KeyIDStr
3736
from models_library.errors import ErrorDict
3837
from models_library.groups import GroupID
@@ -121,7 +120,7 @@
121120
from ..wallets import api as wallets_api
122121
from ..wallets.errors import WalletNotEnoughCreditsError
123122
from ..workspaces import _workspaces_db as workspaces_db
124-
from . import _crud_api_delete, _nodes_api, _projects_db
123+
from . import _crud_api_delete, _nodes_api, _projects_db, _projects_nodes_repository
125124
from ._access_rights_api import (
126125
check_user_project_permission,
127126
has_user_project_access_rights,
@@ -800,7 +799,7 @@ async def add_project_node(
800799
required_resources=jsonable_encoder(default_resources),
801800
key=service_key,
802801
version=service_version,
803-
label=service_key.split("/")[-1]
802+
label=service_key.split("/")[-1],
804803
),
805804
Node.model_validate(
806805
{
@@ -1001,7 +1000,7 @@ async def patch_project_node(
10011000
user_id: UserID,
10021001
project_id: ProjectID,
10031002
node_id: NodeID,
1004-
node_patch: NodePatch,
1003+
node_patch: Node,
10051004
) -> None:
10061005
_node_patch_exclude_unset: dict[str, Any] = jsonable_encoder(
10071006
node_patch, exclude_unset=True, by_alias=True
@@ -1044,6 +1043,13 @@ async def patch_project_node(
10441043
new_node_data=_node_patch_exclude_unset,
10451044
)
10461045

1046+
await _projects_nodes_repository.update(
1047+
app,
1048+
project_id=project_id,
1049+
node_id=node_id,
1050+
node=node_patch,
1051+
)
1052+
10471053
# 4. Make calls to director-v2 to keep data in sync (ex. comp_tasks DB table)
10481054
await director_v2_api.create_or_update_pipeline(
10491055
app, user_id, project_id, product_name=product_name

0 commit comments

Comments
 (0)