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 @@ -142,12 +142,12 @@ qx.Class.define("osparc.data.Resources", {
getPageSearch: {
useCache: false,
method: "GET",
url: statics.API + "/projects:search?offset={offset}&limit={limit}&text={text}&tag_ids={tagIds}&order_by={orderBy}"
url: statics.API + "/projects:search?offset={offset}&limit={limit}&text={text}&tag_ids={tagIds}&order_by={orderBy}&type=user"
},
getPageTrashed: {
useCache: false,
method: "GET",
url: statics.API + "/projects:search?filters={%22trashed%22:%22true%22}&offset={offset}&limit={limit}&order_by={orderBy}"
url: statics.API + "/projects:search?filters={%22trashed%22:%22true%22}&offset={offset}&limit={limit}&order_by={orderBy}&type=user"
},
postToTemplate: {
method: "POST",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4608,6 +4608,20 @@ paths:
type: integer
default: 0
title: Offset
- name: type
in: query
required: false
schema:
$ref: '#/components/schemas/ProjectTypeAPI'
default: all
- name: template_type
in: query
required: false
schema:
anyOf:
- $ref: '#/components/schemas/ProjectTemplateType'
- type: 'null'
title: Template Type
- name: text
in: query
required: false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,8 @@ async def list_projects_full_search(request: web.Request):
user_id=req_ctx.user_id,
product_name=req_ctx.product_name,
trashed=query_params.filters.trashed,
filter_by_project_type=query_params.project_type,
filter_by_template_type=query_params.template_type,
search_by_multi_columns=query_params.text,
search_by_project_name=query_params.filters.search_by_project_name,
offset=query_params.offset,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,8 @@ class ProjectSearchExtraQueryParams(
PageQueryParameters,
FiltersQueryParameters[ProjectFilters],
):
project_type: Annotated[ProjectTypeAPI, Field(alias="type")] = ProjectTypeAPI.all
template_type: ProjectTemplateType | None = None
text: Annotated[
str | None,
Field(
Expand All @@ -227,6 +229,20 @@ class ProjectSearchExtraQueryParams(
empty_str_to_none_pre_validator
)

_template_type_null_or_none_str_to_none_validator = field_validator(
"template_type", mode="before"
)(null_or_none_str_to_none_validator)

@model_validator(mode="after")
def _check_template_type_compatibility(self):
if (
self.project_type in [ProjectTypeAPI.all, ProjectTypeAPI.user]
and self.template_type is not None
):
msg = f"When {self.project_type=} is `all` or `user` the {self.template_type=} should be None"
raise ValueError(msg)
return self


class ProjectsSearchQueryParams(
ProjectSearchExtraQueryParams, ProjectsListOrderParams # type: ignore[misc, valid-type]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,15 @@

from aiohttp import web
from models_library.folders import FolderID, FolderQuery, FolderScope
from models_library.projects import ProjectTemplateType
from models_library.projects import ProjectTemplateType, ProjectType
from models_library.rest_ordering import OrderBy
from models_library.users import UserID
from models_library.workspaces import WorkspaceID, WorkspaceQuery, WorkspaceScope
from pydantic import NonNegativeInt
from servicelib.utils import logged_gather
from simcore_postgres_database.models.projects import ProjectType
from simcore_postgres_database.webserver_models import (
ProjectTemplateType as ProjectTemplateTypeDB,
)
from simcore_postgres_database.webserver_models import ProjectType as ProjectTypeDB

from ..folders import _folders_repository
from ..users.api import get_user_email_legacy
Expand Down Expand Up @@ -80,7 +78,7 @@ async def _aggregate_data_to_projects_from_other_sources(
_projects_service.add_project_states_for_user(
user_id=user_id,
project=prj,
is_template=prj["type"] == ProjectTypeDB.TEMPLATE.value,
is_template=prj["type"] == ProjectType.TEMPLATE.value,
app=app,
)
for prj in db_projects
Expand Down Expand Up @@ -202,13 +200,15 @@ async def list_projects( # pylint: disable=too-many-arguments
return final_projects, total_number_projects


async def list_projects_full_depth(
async def list_projects_full_depth( # pylint: disable=too-many-arguments
app: web.Application,
*,
user_id: UserID,
product_name: str,
# attrs filter
trashed: bool | None,
filter_by_project_type: ProjectTypeAPI,
filter_by_template_type: ProjectTemplateType | None,
# pagination
offset: NonNegativeInt,
limit: int,
Expand All @@ -225,7 +225,14 @@ async def list_projects_full_depth(
workspace_query=WorkspaceQuery(workspace_scope=WorkspaceScope.ALL),
folder_query=FolderQuery(folder_scope=FolderScope.ALL),
filter_trashed=trashed,
filter_by_project_type=ProjectType.STANDARD,
filter_by_project_type=ProjectTypeAPI.to_project_type_db(
filter_by_project_type
),
filter_by_template_type=(
ProjectTemplateTypeDB(filter_by_template_type)
if filter_by_template_type
else None
),
search_by_multi_columns=search_by_multi_columns,
search_by_project_name=search_by_project_name,
offset=offset,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
ProjectRunningConflictError,
ProjectsBatchDeleteError,
)
from .models import ProjectDict, ProjectPatchInternalExtended
from .models import ProjectDict, ProjectPatchInternalExtended, ProjectTypeAPI

_logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -172,6 +172,8 @@ async def list_explicitly_trashed_projects(
user_id=user_id,
product_name=product_name,
trashed=True,
filter_by_project_type=ProjectTypeAPI.user,
filter_by_template_type=None,
offset=page_params.offset,
limit=page_params.limit,
order_by=OrderBy(field=IDStr("trashed"), direction=OrderDirection.ASC),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -980,7 +980,7 @@ async def test_trash_project_in_subfolder(
assert f"{url}" == "/v0/projects:search"

resp = await client.get(
"/v0/projects:search", params={"filters": '{"trashed": true}'}
"/v0/projects:search", params={"filters": '{"trashed": true}', "type": "user"}
)
await assert_status(resp, status.HTTP_200_OK)
page = Page[ProjectGet].model_validate(await resp.json())
Expand Down Expand Up @@ -1008,14 +1008,14 @@ async def test_trash_project_in_subfolder(
await assert_status(resp, status.HTTP_204_NO_CONTENT)

resp = await client.get(
"/v0/projects:search", params={"filters": '{"trashed": true}'}
"/v0/projects:search", params={"filters": '{"trashed": true}', "type": "user"}
)
await assert_status(resp, status.HTTP_200_OK)
page = Page[ProjectGet].model_validate(await resp.json())
assert page.meta.total == 0

resp = await client.get(
"/v0/projects:search", params={"filters": '{"trashed": false}'}
"/v0/projects:search", params={"filters": '{"trashed": false}', "type": "user"}
)
await assert_status(resp, status.HTTP_200_OK)
page = Page[ProjectGet].model_validate(await resp.json())
Expand Down Expand Up @@ -1043,7 +1043,9 @@ async def test_trash_project_explitictly_and_empty_trash_bin(
await assert_status(resp, status.HTTP_204_NO_CONTENT)

# LIST trashed projects
resp = await client.get("/v0/projects", params={"filters": '{"trashed": true}'})
resp = await client.get(
"/v0/projects", params={"filters": '{"trashed": true}', "type": "user"}
)
await assert_status(resp, status.HTTP_200_OK)

page = Page[ProjectListItem].model_validate(await resp.json())
Expand Down Expand Up @@ -1126,7 +1128,7 @@ async def test_trash_folder_with_subfolder_and_project_and_empty_bin(

# - LIST trashed projects (will show only explicit!)
resp = await client.get(
"/v0/projects:search", params={"filters": '{"trashed": true}'}
"/v0/projects:search", params={"filters": '{"trashed": true}', "type": "user"}
)
await assert_status(resp, status.HTTP_200_OK)
page = Page[ProjectListItem].model_validate(await resp.json())
Expand Down Expand Up @@ -1186,7 +1188,7 @@ async def test_trash_folder_with_subfolder_and_project_and_empty_bin(

# - LIST trashed projects (will show only explicit!)
resp = await client.get(
"/v0/projects:search", params={"filters": '{"trashed": true}'}
"/v0/projects:search", params={"filters": '{"trashed": true}', "type": "user"}
)
await assert_status(resp, status.HTTP_200_OK)
page = Page[ProjectListItem].model_validate(await resp.json())
Expand Down
Loading
Loading