Skip to content

Commit a66b765

Browse files
committed
@matusdrobuliak66 review: adds map
1 parent 90fa182 commit a66b765

File tree

4 files changed

+33
-27
lines changed

4 files changed

+33
-27
lines changed

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

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,28 @@ def create_ordering_query_model_classes(
4040
*,
4141
ordering_fields: set[str],
4242
default: OrderBy,
43+
ordering_fields_api_to_column_map: dict[str, str] | None = None,
4344
) -> type[_BaseOrderQueryParams]:
45+
"""Factory to create an uniform model used as ordering parameters in a query
46+
47+
Arguments:
48+
ordering_fields -- A set of valid fields that can be used for ordering.
49+
These should correspond to API field names.
50+
default -- The default ordering configuration to be applied if no explicit
51+
ordering is provided
52+
53+
Keyword Arguments:
54+
ordering_fields_api_to_column_map -- A mapping of API field names to
55+
database column names. If provided, fields specified in the API
56+
will be automatically translated to their corresponding database
57+
column names for seamless integration with database queries.
4458
"""
45-
Factory to create an uniform model used as ordering parameters in a query
59+
ordering_fields_api_to_column_map = ordering_fields_api_to_column_map or {}
60+
61+
assert set(ordering_fields_api_to_column_map.keys()).issubset( # nosec
62+
ordering_fields
63+
)
4664

47-
"""
4865
assert default.field in ordering_fields # nosec
4966

5067
msg_field_options = "|".join(sorted(ordering_fields))
@@ -60,7 +77,12 @@ def _check_if_ordering_field(cls, v):
6077
f"Fields supported are {msg_field_options}."
6178
)
6279
raise ValueError(msg)
63-
return v
80+
81+
@validator("field", allow_reuse=True, always=True)
82+
@classmethod
83+
def _post_rename_order_by_field_as_db_column(cls, v):
84+
# API field name -> DB column_name
85+
return ordering_fields_api_to_column_map.get(v, v)
6486

6587
order_by_example: dict[str, Any] = OrderBy.Config.schema_extra["example"]
6688
order_by_example_json = json_dumps(order_by_example)

services/web/server/src/simcore_service_webserver/folders/_models.py

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ class FolderFilters(Filters):
4646
"name",
4747
},
4848
default=OrderBy(field=IDStr("modified_at"), direction=OrderDirection.DESC),
49+
ordering_fields_api_to_column_map={"modified_at": "modified"},
4950
)
5051

5152

@@ -73,13 +74,6 @@ class Config:
7374
"workspace_id", allow_reuse=True, pre=True
7475
)(null_or_none_str_to_none_validator)
7576

76-
@validator("order_by", always=True)
77-
@classmethod
78-
def _post_rename_order_by_field_as_db_column(cls, v):
79-
if v.field == "modified_at": # API field
80-
v.field = "modified" # DB column
81-
return v
82-
8377

8478
class FolderSearchQueryParams(
8579
PageQueryParameters, _FolderOrderQueryParams, FiltersQueryParameters[FolderFilters] # type: ignore[misc, valid-type]

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

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
from models_library.rest_pagination import Page, PageQueryParameters
2222
from models_library.rest_pagination_utils import paginate_data
2323
from models_library.wallets import WalletID
24-
from pydantic import Extra, Field, Json, parse_obj_as, validator
24+
from pydantic import Extra, Field, Json, parse_obj_as
2525
from servicelib.aiohttp.requests_validation import parse_request_query_parameters_as
2626
from servicelib.aiohttp.typing_extension import Handler
2727
from servicelib.mimetype_constants import MIMETYPE_APPLICATION_JSON
@@ -75,6 +75,9 @@ async def wrapper(request: web.Request) -> web.StreamResponse:
7575
"transaction_status",
7676
},
7777
default=OrderBy(field=IDStr("started_at"), direction=OrderDirection.DESC),
78+
ordering_fields_api_to_column_map={
79+
"credit_cost": "osparc_credits",
80+
},
7881
)
7982

8083

@@ -91,13 +94,6 @@ class ServicesResourceUsagesReportQueryParams(
9194
example='{"started_at": {"from": "yyyy-mm-dd", "until": "yyyy-mm-dd"}}',
9295
)
9396

94-
@validator("order_by", always=True)
95-
@classmethod
96-
def _post_rename_order_by_field_as_db_column(cls, v):
97-
if v.field == "credit_cost": # API field
98-
v.field = "osparc_credits" # DB column
99-
return v
100-
10197
class Config:
10298
extra = Extra.forbid
10399

services/web/server/src/simcore_service_webserver/workspaces/_workspaces_handlers.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
from models_library.rest_pagination_utils import paginate_data
2020
from models_library.users import UserID
2121
from models_library.workspaces import WorkspaceID
22-
from pydantic import Field, parse_obj_as, validator
22+
from pydantic import Field, parse_obj_as
2323
from servicelib.aiohttp import status
2424
from servicelib.aiohttp.requests_validation import (
2525
parse_request_body_as,
@@ -81,21 +81,15 @@ class WorkspacesPathParams(StrictRequestParameters):
8181
"name",
8282
},
8383
default=OrderBy(field=IDStr("modified_at"), direction=OrderDirection.DESC),
84+
ordering_fields_api_to_column_map={"modified_at": "modified"},
8485
)
8586

8687

8788
class WorkspacesListQueryParams(
8889
PageQueryParameters,
8990
WorkspacesListOrderQueryParams, # type: ignore[misc, valid-type]
9091
):
91-
@validator("order_by", always=True)
92-
@classmethod
93-
def _post_rename_order_by_field_as_db_column(cls, v):
94-
# NOTE: PC->MD this is very error-prone (e.g. w/ defaults).
95-
# Rather create a map to a db interface
96-
if v.field == "modified_at": # API field
97-
v.field = "modified" # DB column
98-
return v
92+
...
9993

10094

10195
@routes.post(f"/{VTAG}/workspaces", name="create_workspace")

0 commit comments

Comments
 (0)