Skip to content

Commit 3147440

Browse files
authored
Merge branch 'master' into fix/ui-pre-registration
2 parents 2626a57 + ccdeff2 commit 3147440

File tree

9 files changed

+58
-33
lines changed

9 files changed

+58
-33
lines changed

packages/service-library/tests/deferred_tasks/test_deferred_tasks.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import random
1010
import sys
1111
from collections.abc import AsyncIterable, AsyncIterator, Awaitable, Callable
12-
from contextlib import AbstractAsyncContextManager, AsyncExitStack
12+
from contextlib import AbstractAsyncContextManager, AsyncExitStack, suppress
1313
from pathlib import Path
1414
from typing import Any, Protocol
1515

@@ -60,10 +60,12 @@ async def stop(self, *, graceful: bool = False):
6060
assert self.process is not None
6161
assert self.pid is not None
6262

63-
parent = psutil.Process(self.pid)
64-
children = parent.children(recursive=True)
65-
for child_pid in [child.pid for child in children]:
66-
psutil.Process(child_pid).kill()
63+
with suppress(psutil.NoSuchProcess):
64+
parent = psutil.Process(self.pid)
65+
children = parent.children(recursive=True)
66+
for child_pid in [child.pid for child in children]:
67+
with suppress(psutil.NoSuchProcess):
68+
psutil.Process(child_pid).kill()
6769

6870
self.process = None
6971
self.pid = None

services/static-webserver/client/source/class/osparc/announcement/AnnouncementUIFactory.js

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ qx.Class.define("osparc.announcement.AnnouncementUIFactory", {
3030
},
3131

3232
statics: {
33-
createLoginAnnouncement: function(title, text) {
33+
createLoginAnnouncement: function(title, description) {
3434
const loginAnnouncement = new qx.ui.container.Composite(new qx.ui.layout.VBox(5)).set({
3535
backgroundColor: "strong-main",
3636
alignX: "center",
@@ -46,22 +46,20 @@ qx.Class.define("osparc.announcement.AnnouncementUIFactory", {
4646
const titleLabel = new qx.ui.basic.Label().set({
4747
value: title,
4848
font: "text-16",
49-
textColor: "white",
5049
alignX: "center",
51-
rich: true,
52-
wrap: true
50+
textAlign: "center",
51+
rich: true
5352
});
5453
loginAnnouncement.add(titleLabel);
5554
}
5655

57-
if (text) {
56+
if (description) {
5857
const descriptionLabel = new qx.ui.basic.Label().set({
59-
value: text,
58+
value: description,
6059
font: "text-14",
61-
textColor: "white",
6260
alignX: "center",
63-
rich: true,
64-
wrap: true
61+
textAlign: "center",
62+
rich: true
6563
});
6664
loginAnnouncement.add(descriptionLabel);
6765
}
@@ -75,16 +73,12 @@ qx.Class.define("osparc.announcement.AnnouncementUIFactory", {
7573

7674
__isValid: function(widgetType) {
7775
const announcement = this.getAnnouncement();
78-
79-
const now = new Date();
80-
if (
81-
announcement &&
82-
announcement.getProducts().includes(osparc.product.Utils.getProductName()) &&
83-
announcement.getWidgets().includes(widgetType) &&
84-
now > announcement.getStart() &&
85-
now < announcement.getEnd()
86-
) {
87-
return true;
76+
if (announcement) {
77+
const now = new Date();
78+
const validPeriod = now > announcement.getStart() && now < announcement.getEnd();
79+
const validProduct = announcement.getProducts().includes(osparc.product.Utils.getProductName());
80+
const validWidgetType = widgetType ? announcement.getWidgets().includes(widgetType) : true;
81+
return validPeriod && validProduct && validWidgetType;
8882
}
8983
return false;
9084
},
@@ -124,8 +118,10 @@ qx.Class.define("osparc.announcement.AnnouncementUIFactory", {
124118
return;
125119
}
126120

127-
let text = announcement.getTitle() + ": ";
128-
text += announcement.getDescription();
121+
let text = announcement.getTitle();
122+
if (announcement.getDescription()) {
123+
text += ": " + announcement.getDescription();
124+
}
129125

130126
const ribbonAnnouncement = this.__ribbonAnnouncement = new osparc.notification.RibbonNotification(text, "announcement", true);
131127
ribbonAnnouncement.announcementId = announcement.getId();

services/static-webserver/client/source/class/osparc/auth/ui/LoginView.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,7 @@ qx.Class.define("osparc.auth.ui.LoginView", {
4545
this.addAt(announcementUIFactory.createLoginAnnouncement(), 0);
4646
} else {
4747
announcementUIFactory.addListenerOnce("changeAnnouncement", e => {
48-
const announcement = e.getData();
49-
if (announcement) {
48+
if (announcementUIFactory.hasLoginAnnouncement()) {
5049
this.addAt(announcementUIFactory.createLoginAnnouncement(), 0);
5150
}
5251
});

services/web/server/src/simcore_service_webserver/catalog/_handlers.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,7 @@ async def get_service_resources(request: Request):
370370
)
371371
@login_required
372372
@permission_required("services.catalog.*")
373+
@_handlers_errors.reraise_catalog_exceptions_as_http_errors
373374
async def get_service_pricing_plan(request: Request):
374375
ctx = CatalogRequestContext.create(request)
375376
path_params = parse_request_path_parameters_as(ServicePathParams, request)

services/web/server/src/simcore_service_webserver/catalog/_handlers_errors.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from aiohttp import web
44
from servicelib.aiohttp.typing_extension import Handler
55

6+
from ..resource_usage.errors import DefaultPricingPlanNotFoundError
67
from .exceptions import (
78
CatalogForbiddenError,
89
CatalogItemNotFoundError,
@@ -19,6 +20,7 @@ async def _wrapper(request: web.Request) -> web.StreamResponse:
1920

2021
except (
2122
CatalogItemNotFoundError,
23+
DefaultPricingPlanNotFoundError,
2224
DefaultPricingUnitForServiceNotFoundError,
2325
) as exc:
2426
raise web.HTTPNotFound(reason=f"{exc}") from exc

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
from ..groups.exceptions import GroupNotFoundError
6969
from ..login.decorators import login_required
7070
from ..projects.api import has_user_project_access_rights
71+
from ..resource_usage.errors import DefaultPricingPlanNotFoundError
7172
from ..security.decorators import permission_required
7273
from ..users.api import get_user_id_from_gid, get_user_role
7374
from ..users.exceptions import UserDefaultWalletNotFoundError
@@ -101,6 +102,7 @@ async def wrapper(request: web.Request) -> web.StreamResponse:
101102
ProjectNotFoundError,
102103
NodeNotFoundError,
103104
UserDefaultWalletNotFoundError,
105+
DefaultPricingPlanNotFoundError,
104106
DefaultPricingUnitNotFoundError,
105107
GroupNotFoundError,
106108
CatalogItemNotFoundError,

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
from ..login.decorators import login_required
3030
from ..notifications import project_logs
3131
from ..products.api import Product, get_current_product
32+
from ..resource_usage.errors import DefaultPricingPlanNotFoundError
3233
from ..security.decorators import permission_required
3334
from ..users import api
3435
from ..users.exceptions import UserDefaultWalletNotFoundError
@@ -37,6 +38,7 @@
3738
from . import projects_api
3839
from ._common_models import ProjectPathParams, RequestContext
3940
from .exceptions import (
41+
DefaultPricingUnitNotFoundError,
4042
ProjectInvalidRightsError,
4143
ProjectNotFoundError,
4244
ProjectStartsTooManyDynamicNodesError,
@@ -57,7 +59,12 @@ async def _wrapper(request: web.Request) -> web.StreamResponse:
5759
try:
5860
return await handler(request)
5961

60-
except (ProjectNotFoundError, UserDefaultWalletNotFoundError) as exc:
62+
except (
63+
ProjectNotFoundError,
64+
UserDefaultWalletNotFoundError,
65+
DefaultPricingPlanNotFoundError,
66+
DefaultPricingUnitNotFoundError,
67+
) as exc:
6168
raise web.HTTPNotFound(reason=f"{exc}") from exc
6269

6370
except ProjectInvalidRightsError as exc:

services/web/server/src/simcore_service_webserver/resource_usage/_client.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,13 @@
2323
from models_library.users import UserID
2424
from models_library.wallets import WalletID
2525
from pydantic import NonNegativeInt, parse_obj_as
26+
from servicelib.aiohttp import status
2627
from servicelib.aiohttp.client_session import get_client_session
2728
from settings_library.resource_usage_tracker import ResourceUsageTrackerSettings
2829
from yarl import URL
2930

3031
from ._utils import handle_client_exceptions
32+
from .errors import DefaultPricingPlanNotFoundError
3133
from .settings import get_plugin_settings
3234

3335
_logger = logging.getLogger(__name__)
@@ -95,10 +97,15 @@ async def get_default_service_pricing_plan(
9597
}
9698
)
9799
with handle_client_exceptions(app) as session:
98-
async with session.get(url) as response:
99-
response.raise_for_status()
100-
body: dict = await response.json()
101-
return parse_obj_as(PricingPlanGet, body)
100+
try:
101+
async with session.get(url) as response:
102+
response.raise_for_status()
103+
body: dict = await response.json()
104+
return parse_obj_as(PricingPlanGet, body)
105+
except ClientResponseError as e:
106+
if e.status == status.HTTP_404_NOT_FOUND:
107+
raise DefaultPricingPlanNotFoundError from e
108+
raise
102109

103110

104111
async def get_pricing_plan_unit(
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from ..errors import WebServerBaseError
2+
3+
4+
class ResourceUsageValueError(WebServerBaseError, ValueError):
5+
...
6+
7+
8+
class DefaultPricingPlanNotFoundError(ResourceUsageValueError):
9+
msg_template = "Default pricing plan not found"

0 commit comments

Comments
 (0)