Skip to content

Commit 55dc5bb

Browse files
authored
Merge branch 'master' into rename/the-shop
2 parents e05c09e + 6a305c1 commit 55dc5bb

File tree

6 files changed

+230
-17
lines changed

6 files changed

+230
-17
lines changed

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

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
from datetime import datetime
2-
from typing import Any, NamedTuple, Self, cast
1+
from datetime import date, datetime
2+
from typing import Literal, NamedTuple, NotRequired, Self, cast
33

44
from models_library.basic_types import IDStr
55
from models_library.resource_tracker import PricingPlanId
66
from pydantic import BaseModel, ConfigDict, HttpUrl, PositiveInt
77
from pydantic.config import JsonDict
8+
from typing_extensions import TypedDict
89

910
from ..licenses import (
1011
VIP_DETAILS_EXAMPLE,
@@ -20,13 +21,38 @@
2021
# RPC
2122

2223

24+
class LicensedResourceFeaturesDict(TypedDict):
25+
age: NotRequired[str]
26+
date: date
27+
ethnicity: NotRequired[str]
28+
functionality: NotRequired[str]
29+
height: NotRequired[str]
30+
name: NotRequired[str]
31+
sex: NotRequired[str]
32+
species: NotRequired[str]
33+
version: NotRequired[str]
34+
weight: NotRequired[str]
35+
36+
37+
class LicensedResource(BaseModel):
38+
id: int
39+
description: str
40+
thumbnail: str
41+
features: LicensedResourceFeaturesDict
42+
doi: str | None
43+
license_key: str
44+
license_version: str
45+
protection: Literal["Code", "PayPal"]
46+
available_from_url: HttpUrl | None
47+
48+
2349
class LicensedItemRpcGet(BaseModel):
2450
licensed_item_id: LicensedItemID
2551
key: LicensedItemKey
2652
version: LicensedItemVersion
2753
display_name: str
2854
licensed_resource_type: LicensedResourceType
29-
licensed_resources: list[dict[str, Any]]
55+
licensed_resources: list[LicensedResource]
3056
pricing_plan_id: PricingPlanId
3157
is_hidden_on_market: bool
3258
created_at: datetime

services/api-server/openapi.json

Lines changed: 124 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6705,7 +6705,7 @@
67056705
},
67066706
"licensed_resources": {
67076707
"items": {
6708-
"type": "object"
6708+
"$ref": "#/components/schemas/LicensedResource"
67096709
},
67106710
"type": "array",
67116711
"title": "Licensed Resources"
@@ -6746,6 +6746,129 @@
67466746
],
67476747
"title": "LicensedItemGet"
67486748
},
6749+
"LicensedResource": {
6750+
"properties": {
6751+
"id": {
6752+
"type": "integer",
6753+
"title": "Id"
6754+
},
6755+
"description": {
6756+
"type": "string",
6757+
"title": "Description"
6758+
},
6759+
"thumbnail": {
6760+
"type": "string",
6761+
"title": "Thumbnail"
6762+
},
6763+
"features": {
6764+
"$ref": "#/components/schemas/LicensedResourceFeaturesDict"
6765+
},
6766+
"doi": {
6767+
"anyOf": [
6768+
{
6769+
"type": "string"
6770+
},
6771+
{
6772+
"type": "null"
6773+
}
6774+
],
6775+
"title": "Doi"
6776+
},
6777+
"license_key": {
6778+
"type": "string",
6779+
"title": "License Key"
6780+
},
6781+
"license_version": {
6782+
"type": "string",
6783+
"title": "License Version"
6784+
},
6785+
"protection": {
6786+
"type": "string",
6787+
"enum": [
6788+
"Code",
6789+
"PayPal"
6790+
],
6791+
"title": "Protection"
6792+
},
6793+
"available_from_url": {
6794+
"anyOf": [
6795+
{
6796+
"type": "string",
6797+
"maxLength": 2083,
6798+
"minLength": 1,
6799+
"format": "uri"
6800+
},
6801+
{
6802+
"type": "null"
6803+
}
6804+
],
6805+
"title": "Available From Url"
6806+
}
6807+
},
6808+
"type": "object",
6809+
"required": [
6810+
"id",
6811+
"description",
6812+
"thumbnail",
6813+
"features",
6814+
"doi",
6815+
"license_key",
6816+
"license_version",
6817+
"protection",
6818+
"available_from_url"
6819+
],
6820+
"title": "LicensedResource"
6821+
},
6822+
"LicensedResourceFeaturesDict": {
6823+
"properties": {
6824+
"age": {
6825+
"type": "string",
6826+
"title": "Age"
6827+
},
6828+
"date": {
6829+
"type": "string",
6830+
"format": "date",
6831+
"title": "Date"
6832+
},
6833+
"ethnicity": {
6834+
"type": "string",
6835+
"title": "Ethnicity"
6836+
},
6837+
"functionality": {
6838+
"type": "string",
6839+
"title": "Functionality"
6840+
},
6841+
"height": {
6842+
"type": "string",
6843+
"title": "Height"
6844+
},
6845+
"name": {
6846+
"type": "string",
6847+
"title": "Name"
6848+
},
6849+
"sex": {
6850+
"type": "string",
6851+
"title": "Sex"
6852+
},
6853+
"species": {
6854+
"type": "string",
6855+
"title": "Species"
6856+
},
6857+
"version": {
6858+
"type": "string",
6859+
"title": "Version"
6860+
},
6861+
"weight": {
6862+
"type": "string",
6863+
"title": "Weight"
6864+
}
6865+
},
6866+
"type": "object",
6867+
"required": [
6868+
"date"
6869+
],
6870+
"title": "LicensedResourceFeaturesDict"
6871+
},
67496872
"LicensedResourceType": {
67506873
"type": "string",
67516874
"enum": [

services/api-server/src/simcore_service_api_server/models/schemas/model_adapter.py

Lines changed: 65 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,21 @@
11
# Models added here "cover" models from within the deployment in order to restore backwards compatibility
22

3-
from datetime import datetime
3+
from datetime import date, datetime
44
from decimal import Decimal
5-
from typing import Annotated, Any
5+
from typing import Annotated, Literal, NotRequired
66

77
from models_library.api_schemas_api_server.pricing_plans import (
88
ServicePricingPlanGet as _ServicePricingPlanGet,
99
)
1010
from models_library.api_schemas_webserver.licensed_items import (
1111
LicensedItemRpcGet as _LicensedItemGet,
1212
)
13+
from models_library.api_schemas_webserver.licensed_items import (
14+
LicensedResource as _LicensedResource,
15+
)
16+
from models_library.api_schemas_webserver.licensed_items import (
17+
LicensedResourceFeaturesDict as _LicensedResourceFeaturesDict,
18+
)
1319
from models_library.api_schemas_webserver.licensed_items_checkouts import (
1420
LicensedItemCheckoutRpcGet as _LicensedItemCheckoutRpcGet,
1521
)
@@ -46,10 +52,12 @@
4652
BaseModel,
4753
ConfigDict,
4854
Field,
55+
HttpUrl,
4956
NonNegativeFloat,
5057
NonNegativeInt,
5158
PlainSerializer,
5259
)
60+
from typing_extensions import TypedDict
5361

5462

5563
class GetCreditPriceLegacy(BaseModel):
@@ -77,7 +85,7 @@ class GetCreditPriceLegacy(BaseModel):
7785
)
7886

7987

80-
assert set(GetCreditPriceLegacy.model_fields.keys()) == set(
88+
assert set(GetCreditPriceLegacy.model_fields.keys()) == set( # nosec
8189
_GetCreditPrice.model_fields.keys()
8290
)
8391

@@ -97,7 +105,7 @@ class PricingUnitGetLegacy(BaseModel):
97105
)
98106

99107

100-
assert set(PricingUnitGetLegacy.model_fields.keys()) == set(
108+
assert set(PricingUnitGetLegacy.model_fields.keys()) == set( # nosec
101109
_PricingUnitGet.model_fields.keys()
102110
)
103111

@@ -119,7 +127,7 @@ class WalletGetWithAvailableCreditsLegacy(BaseModel):
119127
)
120128

121129

122-
assert set(WalletGetWithAvailableCreditsLegacy.model_fields.keys()) == set(
130+
assert set(WalletGetWithAvailableCreditsLegacy.model_fields.keys()) == set( # nosec
123131
_WalletGetWithAvailableCredits.model_fields.keys()
124132
)
125133

@@ -137,18 +145,66 @@ class ServicePricingPlanGetLegacy(BaseModel):
137145
)
138146

139147

140-
assert set(ServicePricingPlanGetLegacy.model_fields.keys()) == set(
148+
assert set(ServicePricingPlanGetLegacy.model_fields.keys()) == set( # nosec
141149
_ServicePricingPlanGet.model_fields.keys()
142150
)
143151

144152

153+
class LicensedResourceFeaturesDict(TypedDict):
154+
age: NotRequired[str]
155+
date: date
156+
ethnicity: NotRequired[str]
157+
functionality: NotRequired[str]
158+
height: NotRequired[str]
159+
name: NotRequired[str]
160+
sex: NotRequired[str]
161+
species: NotRequired[str]
162+
version: NotRequired[str]
163+
weight: NotRequired[str]
164+
165+
166+
assert set(LicensedResourceFeaturesDict.__annotations__.keys()) == set( # nosec
167+
_LicensedResourceFeaturesDict.__annotations__.keys()
168+
), "LicensedResourceFeaturesDict keys do not match"
169+
170+
for key in LicensedResourceFeaturesDict.__annotations__:
171+
assert ( # nosec
172+
LicensedResourceFeaturesDict.__annotations__[key]
173+
== _LicensedResourceFeaturesDict.__annotations__[key]
174+
), f"Type of {key} in LicensedResourceFeaturesDict does not match"
175+
176+
177+
class LicensedResource(BaseModel):
178+
id: int
179+
description: str
180+
thumbnail: str
181+
features: LicensedResourceFeaturesDict
182+
doi: str | None
183+
license_key: str
184+
license_version: str
185+
protection: Literal["Code", "PayPal"]
186+
available_from_url: HttpUrl | None
187+
188+
189+
assert set(LicensedResource.model_fields.keys()) == set( # nosec
190+
_LicensedResource.model_fields.keys()
191+
), "LicensedResource keys do not match"
192+
193+
for key in LicensedResource.model_fields.keys():
194+
if key == "features":
195+
continue
196+
assert ( # nosec
197+
LicensedResource.__annotations__[key] == _LicensedResource.__annotations__[key]
198+
), f"Type of {key} in LicensedResource does not match"
199+
200+
145201
class LicensedItemGet(BaseModel):
146202
licensed_item_id: LicensedItemID
147203
key: LicensedItemKey
148204
version: LicensedItemVersion
149205
display_name: str
150206
licensed_resource_type: LicensedResourceType
151-
licensed_resources: list[dict[str, Any]]
207+
licensed_resources: list[LicensedResource]
152208
pricing_plan_id: PricingPlanId
153209
is_hidden_on_market: bool
154210
created_at: datetime
@@ -158,7 +214,7 @@ class LicensedItemGet(BaseModel):
158214
)
159215

160216

161-
assert set(LicensedItemGet.model_fields.keys()) == set(
217+
assert set(LicensedItemGet.model_fields.keys()) == set( # nosec
162218
_LicensedItemGet.model_fields.keys()
163219
)
164220

@@ -176,6 +232,6 @@ class LicensedItemCheckoutGet(BaseModel):
176232
num_of_seats: int
177233

178234

179-
assert set(LicensedItemCheckoutGet.model_fields.keys()) == set(
235+
assert set(LicensedItemCheckoutGet.model_fields.keys()) == set( # nosec
180236
_LicensedItemCheckoutRpcGet.model_fields.keys()
181237
)

services/api-server/src/simcore_service_api_server/services_rpc/wb_api_server.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,11 @@
4646
)
4747
from ..exceptions.service_errors_utils import service_exception_mapper
4848
from ..models.pagination import Page, PaginationParams
49-
from ..models.schemas.model_adapter import LicensedItemCheckoutGet, LicensedItemGet
49+
from ..models.schemas.model_adapter import (
50+
LicensedItemCheckoutGet,
51+
LicensedItemGet,
52+
LicensedResource,
53+
)
5054

5155
_exception_mapper = partial(service_exception_mapper, service_name="WebApiServer")
5256

@@ -62,7 +66,10 @@ def _create_licensed_items_get_page(
6266
version=elm.version,
6367
display_name=elm.display_name,
6468
licensed_resource_type=elm.licensed_resource_type,
65-
licensed_resources=elm.licensed_resources,
69+
licensed_resources=[
70+
LicensedResource.model_validate(res.model_dump())
71+
for res in elm.licensed_resources
72+
],
6673
pricing_plan_id=elm.pricing_plan_id,
6774
is_hidden_on_market=elm.is_hidden_on_market,
6875
created_at=elm.created_at,

services/storage/openapi.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2443,7 +2443,7 @@
24432443
"type": "string",
24442444
"format": "path",
24452445
"title": "Display Path",
2446-
"description": "the path to display with UUID replaced"
2446+
"description": "the path to display with UUID replaced (URL Encoded by parts as names may contain '/')"
24472447
},
24482448
"file_meta_data": {
24492449
"anyOf": [

services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12389,7 +12389,8 @@ components:
1238912389
type: string
1239012390
format: path
1239112391
title: Display Path
12392-
description: the path to display with UUID replaced
12392+
description: the path to display with UUID replaced (URL Encoded by parts
12393+
as names may contain '/')
1239312394
file_meta_data:
1239412395
anyOf:
1239512396
- $ref: '#/components/schemas/FileMetaDataGet'

0 commit comments

Comments
 (0)