Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,68 @@
from typing import Annotated, TypeAlias
from uuid import uuid4

from models_library.projects import NodesDict, ProjectID
from models_library.projects_nodes import Node
from models_library.rpc_pagination import PageRpc
from pydantic import BaseModel, ConfigDict, Field
from pydantic.config import JsonDict

from ...projects import NodesDict, ProjectID
from ...projects_nodes import Node
from ...rpc_pagination import PageRpc


class MetadataFilterItem(BaseModel):
name: str
pattern: str


class ListProjectsMarkedAsJobRpcFilters(BaseModel):
"""Filters model for the list_projects_marked_as_jobs RPC.

NOTE: Filters models are used to validate all possible filters in an API early on,
particularly to ensure compatibility and prevent conflicts between different filters.
"""

job_parent_resource_name_prefix: str | None = None

any_custom_metadata: Annotated[
list[MetadataFilterItem] | None,
Field(description="Searchs for matches of any of the custom metadata fields"),
] = None

@staticmethod
def _update_json_schema_extra(schema: JsonDict) -> None:
schema.update(
{
"examples": [
{
"job_parent_resource_name_prefix": "solvers/solver123",
"any_custom_metadata": [
{
"name": "solver_type",
"pattern": "FEM",
},
{
"name": "mesh_cells",
"pattern": "1*",
},
],
},
{
"any_custom_metadata": [
{
"name": "solver_type",
"pattern": "*CFD*",
}
],
},
{"job_parent_resource_name_prefix": "solvers/solver123"},
]
}
)

model_config = ConfigDict(
json_schema_extra=_update_json_schema_extra,
)


class ProjectJobRpcGet(BaseModel):
"""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from models_library.projects import ProjectID
from models_library.rest_pagination import PageOffsetInt
from models_library.rpc.webserver.projects import (
ListProjectsMarkedAsJobRpcFilters,
PageRpcProjectJobRpcGet,
ProjectJobRpcGet,
)
Expand Down Expand Up @@ -56,24 +57,24 @@ async def list_projects_marked_as_jobs(
# pagination
offset: PageOffsetInt = 0,
limit: PageLimitInt = DEFAULT_NUMBER_OF_ITEMS_PER_PAGE,
# filters
job_parent_resource_name_prefix: str | None = None,
filters: ListProjectsMarkedAsJobRpcFilters | None = None,
) -> PageRpcProjectJobRpcGet:
assert rpc_client
assert product_name
assert user_id

if job_parent_resource_name_prefix:
assert not job_parent_resource_name_prefix.startswith("/")
assert not job_parent_resource_name_prefix.endswith("%")
assert not job_parent_resource_name_prefix.startswith("%")
if filters and filters.job_parent_resource_name_prefix:
assert not filters.job_parent_resource_name_prefix.startswith("/")
assert not filters.job_parent_resource_name_prefix.endswith("%")
assert not filters.job_parent_resource_name_prefix.startswith("%")

items = [
item
for item in ProjectJobRpcGet.model_json_schema()["examples"]
if job_parent_resource_name_prefix is None
if filters is None
or filters.job_parent_resource_name_prefix is None
or item.get("job_parent_resource_name").startswith(
job_parent_resource_name_prefix
filters.job_parent_resource_name_prefix
)
]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@
from models_library.projects import ProjectID
from models_library.rabbitmq_basic_types import RPCMethodName
from models_library.rest_pagination import PageOffsetInt
from models_library.rpc.webserver.projects import PageRpcProjectJobRpcGet
from models_library.rpc.webserver.projects import (
ListProjectsMarkedAsJobRpcFilters,
PageRpcProjectJobRpcGet,
)
from models_library.rpc_pagination import (
DEFAULT_NUMBER_OF_ITEMS_PER_PAGE,
PageLimitInt,
Expand Down Expand Up @@ -51,8 +54,7 @@ async def list_projects_marked_as_jobs(
# pagination
offset: PageOffsetInt = 0,
limit: PageLimitInt = DEFAULT_NUMBER_OF_ITEMS_PER_PAGE,
# filters
job_parent_resource_name_prefix: str | None = None,
filters: ListProjectsMarkedAsJobRpcFilters | None = None,
) -> PageRpcProjectJobRpcGet:
result = await rpc_client.request(
WEBSERVER_RPC_NAMESPACE,
Expand All @@ -61,7 +63,7 @@ async def list_projects_marked_as_jobs(
user_id=user_id,
offset=offset,
limit=limit,
job_parent_resource_name_prefix=job_parent_resource_name_prefix,
filters=filters,
)
assert TypeAdapter(PageRpcProjectJobRpcGet).validate_python(result) # nosec
return cast(PageRpcProjectJobRpcGet, result)
Loading
Loading