Skip to content

Commit 5f61219

Browse files
work
1 parent 708c107 commit 5f61219

File tree

5 files changed

+39
-10
lines changed

5 files changed

+39
-10
lines changed

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3962,6 +3962,14 @@ paths:
39623962
schema:
39633963
$ref: '#/components/schemas/ProjectTypeAPI'
39643964
default: all
3965+
- name: template_type
3966+
in: query
3967+
required: false
3968+
schema:
3969+
anyOf:
3970+
- $ref: '#/components/schemas/ProjectTemplateType'
3971+
- type: 'null'
3972+
title: Template Type
39653973
- name: show_hidden
39663974
in: query
39673975
required: false

services/web/server/src/simcore_service_webserver/projects/_controller/projects_rest.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ async def list_projects(request: web.Request):
153153
user_id=req_ctx.user_id,
154154
product_name=req_ctx.product_name,
155155
project_type=query_params.project_type,
156+
template_type=query_params.template_type,
156157
show_hidden=query_params.show_hidden,
157158
trashed=query_params.filters.trashed,
158159
folder_id=query_params.folder_id,

services/web/server/src/simcore_service_webserver/projects/_controller/projects_rest_schemas.py

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
from typing import Annotated, Literal, Self
1+
from typing import Annotated, Self
22

33
from models_library.basic_types import IDStr
44
from models_library.folders import FolderID
5-
from models_library.projects import ProjectID
5+
from models_library.projects import ProjectID, ProjectTemplateType
66
from models_library.projects_nodes_io import NodeID
77
from models_library.rest_base import RequestParameters
88
from models_library.rest_filters import Filters, FiltersQueryParameters
@@ -118,12 +118,6 @@ class ProjectFilters(Filters):
118118
description="A search query to filter projects with associated job_parent_resource_name",
119119
),
120120
] = None
121-
template_type: Annotated[
122-
Literal["TEMPLATE", "HYPERTOOL", "TUTORIAL"] | None,
123-
Field(
124-
description="A search query to filter projects with associated job_parent_resource_name",
125-
),
126-
] = None
127121

128122

129123
ProjectsListOrderParams = create_ordering_query_model_class(
@@ -142,6 +136,7 @@ class ProjectFilters(Filters):
142136

143137
class ProjectsListExtraQueryParams(RequestParameters):
144138
project_type: Annotated[ProjectTypeAPI, Field(alias="type")] = ProjectTypeAPI.all
139+
template_type: Annotated[ProjectTemplateType | None, Field(...)] = None
145140
show_hidden: Annotated[
146141
bool, Field(description="includes projects marked as hidden in the listing")
147142
] = False
@@ -173,6 +168,22 @@ def _search_check_empty_string(cls, v):
173168
return None
174169
return v
175170

171+
_template_type_null_or_none_str_to_none_validator = field_validator(
172+
"template_type", mode="before"
173+
)(null_or_none_str_to_none_validator)
174+
175+
@model_validator(mode="after")
176+
def check_template_type_compatibility(self):
177+
if (
178+
self.project_type in [ProjectTypeAPI.all, ProjectTypeAPI.user]
179+
and self.template_type is not None
180+
):
181+
msg = (
182+
"When project type is `all` or `user` the template_type should be None"
183+
)
184+
raise ValueError(msg)
185+
return self
186+
176187
_null_or_none_str_to_none_validator = field_validator("folder_id", mode="before")(
177188
null_or_none_str_to_none_validator
178189
)

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
from aiohttp import web
1212
from models_library.folders import FolderID, FolderQuery, FolderScope
13-
from models_library.projects import ProjectID
13+
from models_library.projects import ProjectID, ProjectTemplateType
1414
from models_library.rest_ordering import OrderBy
1515
from models_library.users import UserID
1616
from models_library.workspaces import WorkspaceID, WorkspaceQuery, WorkspaceScope
@@ -91,6 +91,7 @@ async def list_projects( # pylint: disable=too-many-arguments
9191
folder_id: FolderID | None,
9292
# attrs filter
9393
project_type: ProjectTypeAPI,
94+
template_type: ProjectTemplateType | None,
9495
show_hidden: bool, # NOTE: Be careful, this filters only hidden projects
9596
trashed: bool | None,
9697
# search
@@ -148,7 +149,7 @@ async def list_projects( # pylint: disable=too-many-arguments
148149
),
149150
# attrs
150151
filter_by_project_type=ProjectTypeAPI.to_project_type_db(project_type),
151-
filter_by_template_type=None,
152+
filter_by_template_type=template_type,
152153
filter_by_services=user_available_services,
153154
filter_trashed=trashed,
154155
filter_hidden=show_hidden,

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -583,6 +583,7 @@ def _create_shared_workspace_query(
583583
def _create_attributes_filters(
584584
*,
585585
filter_by_project_type: ProjectType | None,
586+
filter_by_template_type: ProjectTemplateType | None,
586587
filter_hidden: bool | None,
587588
filter_published: bool | None,
588589
filter_trashed: bool | None,
@@ -595,6 +596,11 @@ def _create_attributes_filters(
595596
if filter_by_project_type is not None:
596597
attributes_filters.append(projects.c.type == filter_by_project_type.value)
597598

599+
if filter_by_template_type is not None:
600+
attributes_filters.append(
601+
projects.c.template_type == filter_by_template_type.value
602+
)
603+
598604
if filter_hidden is not None:
599605
attributes_filters.append(projects.c.hidden.is_(filter_hidden))
600606

@@ -647,6 +653,7 @@ async def list_projects_dicts( # pylint: disable=too-many-arguments,too-many-st
647653
folder_query: FolderQuery,
648654
# attribute filters
649655
filter_by_project_type: ProjectType | None = None,
656+
filter_by_template_type: ProjectTemplateType | None = None,
650657
filter_by_services: list[dict] | None = None,
651658
filter_published: bool | None = None,
652659
filter_hidden: bool | None = False,
@@ -697,6 +704,7 @@ async def list_projects_dicts( # pylint: disable=too-many-arguments,too-many-st
697704

698705
attributes_filters = self._create_attributes_filters(
699706
filter_by_project_type=filter_by_project_type,
707+
filter_by_template_type=filter_by_template_type,
700708
filter_hidden=filter_hidden,
701709
filter_published=filter_published,
702710
filter_trashed=filter_trashed,

0 commit comments

Comments
 (0)