Skip to content

Commit 8d0bb1a

Browse files
authored
Merge branch 'master' into mai/error-handling
2 parents 7190b30 + 33237ba commit 8d0bb1a

File tree

11 files changed

+252
-118
lines changed

11 files changed

+252
-118
lines changed

packages/settings-library/src/settings_library/utils_session.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import binascii
33
from typing import Final
44

5-
DEFAULT_SESSION_COOKIE_NAME: Final[str] = "osparc-sc"
5+
DEFAULT_SESSION_COOKIE_NAME: Final[str] = "osparc-sc2"
66
_32_BYTES_LENGTH: Final[int] = 32
77

88

services/api-server/requirements/_base.txt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -156,12 +156,9 @@ fastapi==0.99.1
156156
# -c requirements/../../../requirements/constraints.txt
157157
# -r requirements/../../../packages/service-library/requirements/_fastapi.in
158158
# -r requirements/_base.in
159-
# fastapi-pagination
160159
# prometheus-fastapi-instrumentator
161-
fastapi-pagination==0.12.17
162-
# via
163-
# -c requirements/./constraints.txt
164-
# -r requirements/_base.in
160+
fastapi-pagination==0.12.31
161+
# via -r requirements/_base.in
165162
faststream==0.5.10
166163
# via
167164
# -r requirements/../../../packages/service-library/requirements/_base.in

services/api-server/requirements/constraints.txt

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -40,31 +40,3 @@ aws-sam-translator<1.56.0
4040
# # aws-sam-translator<1.55.0 (from -c ./constraints.txt (line 32))
4141
# # aws-sam-translator>=1.57.0 (from cfn-lint==0.72.10->-c ./constraints.txt (line 33))
4242
cfn-lint<0.72.1
43-
44-
45-
46-
#
47-
# .venv/lib/python3.10/site-packages/fastapi_pagination/api.py:352: in _update_route
48-
# get_parameterless_sub_dependant(
49-
# .venv/lib/python3.10/site-packages/fastapi/dependencies/utils.py:136: in get_parameterless_sub_dependant
50-
# return get_sub_dependant(depends=depends, dependency=depends.dependency, path=path)
51-
# .venv/lib/python3.10/site-packages/fastapi/dependencies/utils.py:159: in get_sub_dependant
52-
# sub_dependant = get_dependant(
53-
# .venv/lib/python3.10/site-packages/fastapi/dependencies/utils.py:310: in get_dependant
54-
# sub_dependant = get_param_sub_dependant(
55-
# .venv/lib/python3.10/site-packages/fastapi/dependencies/utils.py:123: in get_param_sub_dependant
56-
# return get_sub_dependant(
57-
# .venv/lib/python3.10/site-packages/fastapi/dependencies/utils.py:159: in get_sub_dependant
58-
# sub_dependant = get_dependant(
59-
# .venv/lib/python3.10/site-packages/fastapi/dependencies/utils.py:331: in get_dependant
60-
# add_param_to_fields(field=param_field, dependant=dependant)
61-
# _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
62-
63-
# def add_param_to_fields(*, field: ModelField, dependant: Dependant) -> None:
64-
# field_info = cast(params.Param, field.field_info)
65-
# > if field_info.in_ == params.ParamTypes.path:
66-
# E AttributeError: 'FieldInfo' object has no attribute 'in_'
67-
68-
# .venv/lib/python3.10/site-packages/fastapi/dependencies/utils.py:500: AttributeError
69-
70-
fastapi-pagination<=0.12.17

services/api-server/src/simcore_service_api_server/models/pagination.py

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,30 +9,36 @@
99
from collections.abc import Sequence
1010
from typing import Any, ClassVar, Generic, TypeAlias, TypeVar
1111

12-
from fastapi_pagination.limit_offset import LimitOffsetParams
13-
from fastapi_pagination.links.limit_offset import (
14-
LimitOffsetPage as _FastApiLimitOffsetPage,
15-
)
12+
from fastapi import Query
13+
from fastapi_pagination.customization import CustomizedPage, UseName, UseParamsFields
14+
from fastapi_pagination.limit_offset import LimitOffsetParams as _LimitOffsetParams
15+
from fastapi_pagination.links import LimitOffsetPage as _LimitOffsetPage
1616
from models_library.rest_pagination import (
1717
DEFAULT_NUMBER_OF_ITEMS_PER_PAGE,
1818
MAXIMUM_NUMBER_OF_ITEMS_PER_PAGE,
1919
)
2020
from models_library.utils.pydantic_tools_extension import FieldNotRequired
21-
from pydantic import Field, NonNegativeInt, validator
21+
from pydantic import NonNegativeInt, validator
2222
from pydantic.generics import GenericModel
2323

2424
T = TypeVar("T")
2525

26-
# NOTE: same pagination limits and defaults as web-server
27-
Page = _FastApiLimitOffsetPage.with_custom_options(
28-
limit=Field(
29-
DEFAULT_NUMBER_OF_ITEMS_PER_PAGE, ge=1, le=MAXIMUM_NUMBER_OF_ITEMS_PER_PAGE
30-
)
31-
)
32-
# NOTE: Renamed to make shorter clients name models
33-
Page.__name__ = "Page"
34-
35-
PaginationParams: TypeAlias = LimitOffsetParams
26+
Page = CustomizedPage[
27+
_LimitOffsetPage[T],
28+
# Customizes the default and maximum to fit those of the web-server. It simplifies interconnection
29+
UseParamsFields(
30+
limit=Query(
31+
DEFAULT_NUMBER_OF_ITEMS_PER_PAGE,
32+
ge=1,
33+
le=MAXIMUM_NUMBER_OF_ITEMS_PER_PAGE,
34+
description="Page size limit",
35+
)
36+
),
37+
# Renames class for the openapi.json to make the python-client's name models shorter
38+
UseName(name="Page"),
39+
]
40+
41+
PaginationParams: TypeAlias = _LimitOffsetParams
3642

3743

3844
class OnePage(GenericModel, Generic[T]):

services/docker-compose-dev-vendors.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ services:
1717
# auth: https://doc.traefik.io/traefik/middlewares/http/forwardauth
1818
- traefik.http.middlewares.${SWARM_STACK_NAME}_manual-auth.forwardauth.address=http://${WEBSERVER_HOST}:${WEBSERVER_PORT}/v0/auth:check
1919
- traefik.http.middlewares.${SWARM_STACK_NAME}_manual-auth.forwardauth.trustForwardHeader=true
20-
- traefik.http.middlewares.${SWARM_STACK_NAME}_manual-auth.forwardauth.authResponseHeaders=Set-Cookie,osparc-sc
20+
- traefik.http.middlewares.${SWARM_STACK_NAME}_manual-auth.forwardauth.authResponseHeaders=Set-Cookie,osparc-sc2
2121
# routing
2222
- traefik.http.services.${SWARM_STACK_NAME}_manual.loadbalancer.server.port=80
2323
- traefik.http.services.${SWARM_STACK_NAME}_manual.loadbalancer.healthcheck.path=/

services/static-webserver/client/source/class/osparc/data/model/Node.js

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,8 @@ qx.Class.define("osparc.data.model.Node", {
136136
outputs: {
137137
check: "Object",
138138
nullable: false,
139-
event: "changeOutputs"
139+
event: "changeOutputs",
140+
apply: "__applyOutputs",
140141
},
141142

142143
status: {
@@ -166,6 +167,12 @@ qx.Class.define("osparc.data.model.Node", {
166167
apply: "__applyPropsForm"
167168
},
168169

170+
outputsForm: {
171+
check: "osparc.widget.NodeOutputs",
172+
init: null,
173+
nullable: true
174+
},
175+
169176
marker: {
170177
check: "qx.core.Object",
171178
init: null,
@@ -612,6 +619,13 @@ qx.Class.define("osparc.data.model.Node", {
612619
}, this);
613620
},
614621

622+
__applyOutputs: function() {
623+
if (!this.isPropertyInitialized("outputsForm") || !this.getOutputsForm()) {
624+
const nodeOutputs = new osparc.widget.NodeOutputs(this);
625+
this.setOutputsForm(nodeOutputs);
626+
}
627+
},
628+
615629
removeNodePortConnections: function(inputNodeId) {
616630
let inputs = this.__getInputData();
617631
for (const portId in inputs) {

services/static-webserver/client/source/class/osparc/desktop/StudyEditor.js

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,7 @@ qx.Class.define("osparc.desktop.StudyEditor", {
288288
this.__listenToNoMoreCreditsEvents();
289289
this.__listenToEvent();
290290
this.__listenToServiceStatus();
291+
this.__listenToStateInputPorts();
291292
},
292293

293294
__listenToLogger: function() {
@@ -435,6 +436,85 @@ qx.Class.define("osparc.desktop.StudyEditor", {
435436
}
436437
},
437438

439+
__listenToStateInputPorts: function() {
440+
const socket = osparc.wrapper.WebSocket.getInstance();
441+
if (!socket.slotExists("stateInputPorts")) {
442+
socket.on("stateInputPorts", data => {
443+
this.__statePortReceived(data, "stateInputPorts");
444+
}, this);
445+
}
446+
if (!socket.slotExists("stateOutputPorts")) {
447+
socket.on("stateOutputPorts", data => {
448+
this.__statePortReceived(data, "stateOutputPorts");
449+
}, this);
450+
}
451+
},
452+
453+
__statePortReceived: function(socketData, msgName) {
454+
const studyId = socketData["project_id"];
455+
if (this.getStudy().getUuid() !== studyId) {
456+
return;
457+
}
458+
459+
const nodeId = socketData["node_id"];
460+
const workbench = this.getStudy().getWorkbench();
461+
const node = workbench.getNode(nodeId);
462+
if (!node) {
463+
if (osparc.data.Permissions.getInstance().isTester()) {
464+
console.log("Ignored ws 'stateInputPorts' msg", socketData);
465+
}
466+
return;
467+
}
468+
469+
const propsForm = node.getPropsForm();
470+
if (msgName === "stateInputPorts" && propsForm) {
471+
const portId = socketData["port_key"];
472+
const status = socketData["status"];
473+
switch (status) {
474+
case "DOWNLOAD_STARTED":
475+
propsForm.retrievingPortData(
476+
portId,
477+
osparc.form.renderer.PropForm.RETRIEVE_STATUS.downloading
478+
);
479+
break;
480+
case "DOWNLOAD_FINISHED_SUCCESSFULLY":
481+
propsForm.retrievedPortData(portId, true);
482+
break;
483+
case "DOWNLOAD_WAS_ABORTED":
484+
case "DOWNLOAD_FINISHED_WITH_ERROR":
485+
propsForm.retrievedPortData(portId, false);
486+
break;
487+
}
488+
}
489+
490+
const outputsForm = node.getOutputsForm();
491+
if (msgName === "stateOutputPorts" && outputsForm) {
492+
const portId = socketData["port_key"];
493+
const status = socketData["status"];
494+
switch (status) {
495+
case "UPLOAD_STARTED":
496+
outputsForm.setRetrievingStatus(
497+
portId,
498+
osparc.form.renderer.PropForm.RETRIEVE_STATUS.uploading
499+
);
500+
break;
501+
case "UPLOAD_FINISHED_SUCCESSFULLY":
502+
outputsForm.setRetrievingStatus(
503+
portId,
504+
osparc.form.renderer.PropForm.RETRIEVE_STATUS.succeed
505+
);
506+
break;
507+
case "UPLOAD_WAS_ABORTED":
508+
case "UPLOAD_FINISHED_WITH_ERROR":
509+
outputsForm.setRetrievingStatus(
510+
portId,
511+
osparc.form.renderer.PropForm.RETRIEVE_STATUS.failed
512+
);
513+
break;
514+
}
515+
}
516+
},
517+
438518
__reloadSnapshotsAndIterations: function() {
439519
const isVCDisabled = osparc.utils.DisabledPlugins.isVersionControlDisabled();
440520
if (!isVCDisabled) {

services/static-webserver/client/source/class/osparc/desktop/WorkbenchView.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1032,11 +1032,12 @@ qx.Class.define("osparc.desktop.WorkbenchView", {
10321032

10331033
// OUTPUTS
10341034
const outputsBox = new qx.ui.container.Composite(new qx.ui.layout.VBox(spacing));
1035-
if (node.hasOutputs()) {
1036-
const nodeOutputs = new osparc.widget.NodeOutputs(node, node.getMetaData().outputs).set({
1035+
const outputsForm = node.getOutputsForm();
1036+
if (node.hasOutputs() && outputsForm) {
1037+
outputsForm.set({
10371038
offerProbes: true
10381039
});
1039-
outputsBox.add(nodeOutputs);
1040+
outputsBox.add(outputsForm);
10401041
}
10411042

10421043
const nodeFilesBtn = new qx.ui.form.Button(this.tr("Service data"), "@FontAwesome5Solid/folder-open/14").set({

0 commit comments

Comments
 (0)