Skip to content

Commit a38d25f

Browse files
committed
Merge branch 'master' into add-functions-locust-test
2 parents 1dbc632 + c01b1d3 commit a38d25f

File tree

18 files changed

+448
-94
lines changed

18 files changed

+448
-94
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ The SIM-CORE, named **o<sup>2</sup>S<sup>2</sup>PARC** – **O**pen **O**nline *
3333
The aim of o<sup>2</sup>S<sup>2</sup>PARC is to establish a comprehensive, freely accessible, intuitive, and interactive online platform for simulating peripheral nerve system neuromodulation/ stimulation and its impact on organ physiology in a precise and predictive manner.
3434
To achieve this, the platform will comprise both state-of-the art and highly detailed animal and human anatomical models with realistic tissue property distributions that make it possible to perform simulations ranging from the molecular scale up to the complexity of the human body.
3535

36+
3637
## Getting Started
3738

3839
A production instance of **o<sup>2</sup>S<sup>2</sup>PARC** is running at [oSPARC.io](https://osparc.io).

packages/models-library/src/models_library/api_schemas_api_server/functions.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
FunctionJobCollection,
1616
FunctionJobCollectionID,
1717
FunctionJobCollectionIDNotFoundError,
18+
FunctionJobCollectionsListFilters,
1819
FunctionJobCollectionStatus,
1920
FunctionJobID,
2021
FunctionJobIDNotFoundError,
@@ -53,6 +54,7 @@
5354
"FunctionJobCollectionID",
5455
"FunctionJobCollectionIDNotFoundError",
5556
"FunctionJobCollectionStatus",
57+
"FunctionJobCollectionsListFilters",
5658
"FunctionJobID",
5759
"FunctionJobIDNotFoundError",
5860
"FunctionJobStatus",

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
FunctionJobCollection,
1919
FunctionJobCollectionID,
2020
FunctionJobCollectionIDNotFoundError,
21+
FunctionJobCollectionsListFilters,
2122
FunctionJobCollectionStatus,
2223
FunctionJobID,
2324
FunctionJobIDNotFoundError,
@@ -70,6 +71,7 @@
7071
"FunctionJobCollectionIDNotFoundError",
7172
"FunctionJobCollectionStatus",
7273
"FunctionJobCollectionStatus",
74+
"FunctionJobCollectionsListFilters",
7375
"FunctionJobID",
7476
"FunctionJobID",
7577
"FunctionJobIDNotFoundError",

packages/models-library/src/models_library/functions.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
from common_library.errors_classes import OsparcErrorMixin
77
from models_library import projects
8+
from models_library.basic_regex import UUID_RE_BASE
9+
from models_library.basic_types import ConstrainedStr
810
from models_library.services_types import ServiceKey, ServiceVersion
911
from pydantic import BaseModel, Field
1012

@@ -274,3 +276,13 @@ class FunctionJobCollectionDB(BaseModel):
274276

275277
class RegisteredFunctionJobCollectionDB(FunctionJobCollectionDB):
276278
uuid: FunctionJobCollectionID
279+
280+
281+
class FunctionIDString(ConstrainedStr):
282+
pattern = UUID_RE_BASE
283+
284+
285+
class FunctionJobCollectionsListFilters(BaseModel):
286+
"""Filters for listing function job collections"""
287+
288+
has_function_id: FunctionIDString | None = None

packages/service-library/src/servicelib/rabbitmq/rpc_interfaces/webserver/functions/functions_rpc_interface.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
FunctionJob,
1010
FunctionJobCollection,
1111
FunctionJobCollectionID,
12+
FunctionJobCollectionsListFilters,
1213
FunctionJobID,
1314
FunctionOutputSchema,
1415
RegisteredFunction,
@@ -146,12 +147,14 @@ async def list_function_job_collections(
146147
*,
147148
pagination_limit: int,
148149
pagination_offset: int,
150+
filters: FunctionJobCollectionsListFilters | None = None,
149151
) -> tuple[list[RegisteredFunctionJobCollection], PageMetaInfoLimitOffset]:
150152
result = await rabbitmq_rpc_client.request(
151153
WEBSERVER_RPC_NAMESPACE,
152154
TypeAdapter(RPCMethodName).validate_python("list_function_job_collections"),
153155
pagination_offset=pagination_offset,
154156
pagination_limit=pagination_limit,
157+
filters=filters,
155158
)
156159
return TypeAdapter(
157160
tuple[list[RegisteredFunctionJobCollection], PageMetaInfoLimitOffset]

services/api-server/openapi.json

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5695,6 +5695,23 @@
56955695
"default": 0,
56965696
"title": "Offset"
56975697
}
5698+
},
5699+
{
5700+
"name": "has_function_id",
5701+
"in": "query",
5702+
"required": false,
5703+
"schema": {
5704+
"anyOf": [
5705+
{
5706+
"type": "string",
5707+
"pattern": "[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}"
5708+
},
5709+
{
5710+
"type": "null"
5711+
}
5712+
],
5713+
"title": "Has Function Id"
5714+
}
56985715
}
56995716
],
57005717
"responses": {
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from typing import Any
2+
3+
from pydantic.fields import FieldInfo
4+
5+
6+
def _get_query_params(field: FieldInfo) -> dict[str, Any]:
7+
params = {}
8+
9+
if field.description:
10+
params["description"] = field.description
11+
if field.examples:
12+
params["example"] = next(
13+
(example for example in field.examples if "*" in example), field.examples[0]
14+
)
15+
return params
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from typing import Annotated
2+
3+
from fastapi import Query
4+
from models_library.functions import FunctionIDString, FunctionJobCollectionsListFilters
5+
6+
from ._utils import _get_query_params
7+
8+
9+
def get_function_job_collections_filters(
10+
# pylint: disable=unsubscriptable-object
11+
has_function_id: Annotated[
12+
FunctionIDString | None,
13+
Query(
14+
**_get_query_params(
15+
FunctionJobCollectionsListFilters.model_fields["has_function_id"]
16+
)
17+
),
18+
] = None,
19+
) -> FunctionJobCollectionsListFilters:
20+
return FunctionJobCollectionsListFilters(
21+
has_function_id=has_function_id,
22+
)

services/api-server/src/simcore_service_api_server/api/dependencies/models_schemas_solvers_filters.py

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,10 @@
1-
from typing import Annotated, Any
1+
from typing import Annotated
22

33
from fastapi import Query
44
from models_library.basic_types import SafeQueryStr
5-
from pydantic.fields import FieldInfo
65

76
from ...models.schemas.solvers_filters import SolversListFilters
8-
9-
10-
def _get_query_params(field: FieldInfo) -> dict[str, Any]:
11-
params = {}
12-
13-
if field.description:
14-
params["description"] = field.description
15-
if field.examples:
16-
params["example"] = next(
17-
(example for example in field.examples if "*" in example), field.examples[0]
18-
)
19-
return params
7+
from ._utils import _get_query_params
208

219

2210
def get_solvers_filters(

services/api-server/src/simcore_service_api_server/api/routes/function_job_collections_routes.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from models_library.api_schemas_webserver.functions import (
77
FunctionJobCollection,
88
FunctionJobCollectionID,
9+
FunctionJobCollectionsListFilters,
910
FunctionJobCollectionStatus,
1011
RegisteredFunctionJob,
1112
RegisteredFunctionJobCollection,
@@ -17,6 +18,9 @@
1718
from ...services_http.director_v2 import DirectorV2Api
1819
from ...services_rpc.wb_api_server import WbApiRpcClient
1920
from ..dependencies.authentication import get_current_user_id
21+
from ..dependencies.models_schemas_function_filters import (
22+
get_function_job_collections_filters,
23+
)
2024
from ..dependencies.services import get_api_client
2125
from ..dependencies.webserver_rpc import get_wb_api_rpc_client
2226
from ._constants import FMSG_CHANGELOG_NEW_IN_VERSION, create_route_description
@@ -48,10 +52,14 @@
4852
async def list_function_job_collections(
4953
wb_api_rpc: Annotated[WbApiRpcClient, Depends(get_wb_api_rpc_client)],
5054
page_params: Annotated[PaginationParams, Depends()],
55+
filters: Annotated[
56+
FunctionJobCollectionsListFilters, Depends(get_function_job_collections_filters)
57+
],
5158
):
5259
function_job_collection_list, meta = await wb_api_rpc.list_function_job_collections(
5360
pagination_offset=page_params.offset,
5461
pagination_limit=page_params.limit,
62+
filters=filters,
5563
)
5664
return create_page(
5765
function_job_collection_list,

0 commit comments

Comments
 (0)