Skip to content

Commit 521a27d

Browse files
introduce implicit trashing of projects/folders when workspace is trashed
1 parent 7c7dbe7 commit 521a27d

File tree

11 files changed

+39
-32
lines changed

11 files changed

+39
-32
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ async def update(
386386
parent_folder_id: FolderID | None | UnSet = UnSet.VALUE,
387387
trashed: datetime | None | UnSet = UnSet.VALUE,
388388
trashed_explicitly: bool | UnSet = UnSet.VALUE,
389-
trashed_by: UserID | UnSet = UnSet.VALUE, # who trashed
389+
trashed_by: UserID | None | UnSet = UnSet.VALUE, # who trashed
390390
workspace_id: WorkspaceID | None | UnSet = UnSet.VALUE,
391391
user_id: UserID | None | UnSet = UnSet.VALUE, # ownership
392392
) -> FolderDB:

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ async def delete_folder_group(request: web.Request):
209209
req_ctx = FoldersRequestContext.model_validate(request)
210210
path_params = parse_request_path_parameters_as(FoldersPathParams, request)
211211

212-
await _folders_service.delete_folder(
212+
await _folders_service.delete_folder_with_all_content(
213213
app=request.app,
214214
user_id=req_ctx.user_id,
215215
folder_id=path_params.folder_id,

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ async def update_folder(
317317
)
318318

319319

320-
async def delete_folder(
320+
async def delete_folder_with_all_content(
321321
app: web.Application,
322322
user_id: UserID,
323323
folder_id: FolderID,

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ async def trash_folder(request: web.Request):
3939
user_id=user_id,
4040
folder_id=path_params.folder_id,
4141
force_stop_first=query_params.force,
42+
explicit=True,
4243
)
4344

4445
return web.json_response(status=status.HTTP_204_NO_CONTENT)

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

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -63,23 +63,24 @@ async def _check_exists_and_access(
6363
return workspace_is_private
6464

6565

66-
async def _folders_db_update(
66+
async def _folders_db_trashed_state_update(
6767
app: web.Application,
6868
connection: AsyncConnection | None = None,
6969
*,
7070
product_name: ProductName,
7171
folder_id: FolderID,
7272
trashed_at: datetime | None,
73-
trashed_by: UserID,
73+
trashed_explicitly: bool,
74+
trashed_by: UserID | None,
7475
):
75-
# EXPLICIT un/trash
76+
# EXPLICIT or IMPLICIT un/trash
7677
await _folders_repository.update(
7778
app,
7879
connection,
7980
folders_id_or_ids=folder_id,
8081
product_name=product_name,
8182
trashed=trashed_at,
82-
trashed_explicitly=trashed_at is not None,
83+
trashed_explicitly=trashed_explicitly,
8384
trashed_by=trashed_by,
8485
)
8586

@@ -111,6 +112,7 @@ async def trash_folder(
111112
user_id: UserID,
112113
folder_id: FolderID,
113114
force_stop_first: bool,
115+
explicit: bool,
114116
):
115117

116118
workspace_is_private = await _check_exists_and_access(
@@ -123,12 +125,13 @@ async def trash_folder(
123125
async with transaction_context(get_asyncpg_engine(app)) as connection:
124126

125127
# 1. Trash folder and children
126-
await _folders_db_update(
128+
await _folders_db_trashed_state_update(
127129
app,
128130
connection,
129131
folder_id=folder_id,
130132
product_name=product_name,
131133
trashed_at=trashed_at,
134+
trashed_explicitly=explicit,
132135
trashed_by=user_id,
133136
)
134137

@@ -172,12 +175,13 @@ async def untrash_folder(
172175
# 3. UNtrash
173176

174177
# 3.1 UNtrash folder and children
175-
await _folders_db_update(
178+
await _folders_db_trashed_state_update(
176179
app,
177180
folder_id=folder_id,
178181
product_name=product_name,
179182
trashed_at=None,
180-
trashed_by=user_id,
183+
trashed_by=None,
184+
trashed_explicitly=False,
181185
)
182186

183187
# 3.2 UNtrash all child projects that I am an owner
@@ -278,7 +282,7 @@ async def delete_trashed_folder(
278282
)
279283

280284
# NOTE: this function deletes folder AND its content recursively!
281-
await _folders_service.delete_folder(
285+
await _folders_service.delete_folder_with_all_content(
282286
app, user_id=user_id, folder_id=folder_id, product_name=product_name
283287
)
284288

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
from ._folders_service import delete_folder, list_folders
1+
from ._folders_service import delete_folder_with_all_content, list_folders
22

33
__all__: tuple[str, ...] = (
44
"list_folders",
5-
"delete_folder",
5+
"delete_folder_with_all_content",
66
)
77

88
# nopycln: file

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ async def list_projects( # pylint: disable=too-many-arguments
9191
folder_id: FolderID | None,
9292
# attrs filter
9393
project_type: ProjectTypeAPI,
94-
show_hidden: bool,
94+
show_hidden: bool, # NOTE: Be careful, this filters only hidden projects
9595
trashed: bool | None,
9696
# search
9797
search_by_multi_columns: str | None = None,

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

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,16 @@
1717
WorkspaceUpdates,
1818
)
1919
from simcore_postgres_database.utils_repos import transaction_context
20+
from simcore_service_webserver.folders.service import list_folders
21+
from simcore_service_webserver.projects.api import list_projects
22+
from simcore_service_webserver.projects.models import ProjectTypeAPI
2023

2124
from ..db.plugin import get_asyncpg_engine
22-
from ..folders._folders_service import list_folders
2325
from ..folders._trash_service import (
2426
batch_delete_folders_with_content_in_root_workspace_as_admin,
2527
trash_folder,
2628
untrash_folder,
2729
)
28-
from ..projects._crud_api_read import ProjectTypeAPI, list_projects
2930
from ..projects._trash_service import (
3031
batch_delete_projects_in_root_workspace_as_admin,
3132
trash_project,
@@ -53,7 +54,7 @@ async def _check_exists_and_access(
5354
)
5455

5556

56-
async def _list_child_folders(
57+
async def _list_root_child_folders(
5758
app: web.Application,
5859
*,
5960
product_name: ProductName,
@@ -83,7 +84,7 @@ async def _list_child_folders(
8384
return child_folders
8485

8586

86-
async def _list_child_projects(
87+
async def _list_root_child_projects(
8788
app: web.Application,
8889
*,
8990
product_name: ProductName,
@@ -100,14 +101,14 @@ async def _list_child_projects(
100101
app,
101102
user_id=user_id,
102103
product_name=product_name,
103-
show_hidden=True,
104+
show_hidden=False,
104105
workspace_id=workspace_id,
105106
project_type=ProjectTypeAPI.all,
106107
folder_id=None,
107108
trashed=None,
108109
offset=page_params.offset,
109110
limit=page_params.limit,
110-
order_by=OrderBy(field=IDStr("trashed"), direction=OrderDirection.ASC),
111+
order_by=OrderBy(field=IDStr("id"), direction=OrderDirection.ASC),
111112
)
112113

113114
child_projects.extend([Project(**project).uuid for project in projects])
@@ -140,7 +141,7 @@ async def trash_workspace(
140141
)
141142

142143
# IMPLICIT trash
143-
child_folders: list[FolderID] = await _list_child_folders(
144+
child_folders: list[FolderID] = await _list_root_child_folders(
144145
app,
145146
product_name=product_name,
146147
user_id=user_id,
@@ -154,9 +155,10 @@ async def trash_workspace(
154155
user_id=user_id,
155156
folder_id=folder_id,
156157
force_stop_first=force_stop_first,
158+
explicit=False,
157159
)
158160

159-
child_projects: list[ProjectID] = await _list_child_projects(
161+
child_projects: list[ProjectID] = await _list_root_child_projects(
160162
app,
161163
product_name=product_name,
162164
user_id=user_id,
@@ -195,7 +197,7 @@ async def untrash_workspace(
195197
updates=WorkspaceUpdates(trashed=None, trashed_by=None),
196198
)
197199

198-
child_folders: list[FolderID] = await _list_child_folders(
200+
child_folders: list[FolderID] = await _list_root_child_folders(
199201
app,
200202
product_name=product_name,
201203
user_id=user_id,
@@ -210,7 +212,7 @@ async def untrash_workspace(
210212
folder_id=folder_id,
211213
)
212214

213-
child_projects: list[ProjectID] = await _list_child_projects(
215+
child_projects: list[ProjectID] = await _list_root_child_projects(
214216
app,
215217
product_name=product_name,
216218
user_id=user_id,
@@ -264,7 +266,7 @@ async def delete_trashed_workspace(
264266
)
265267

266268
# NOTE: this function deletes workspace AND its content recursively!
267-
await _workspaces_service.delete_workspace(
269+
await _workspaces_service.delete_workspace_with_all_content(
268270
app,
269271
user_id=user_id,
270272
product_name=product_name,

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ async def get_workspace_db_get(
206206
connection: AsyncConnection | None = None,
207207
*,
208208
workspace_id: WorkspaceID,
209-
):
209+
) -> WorkspaceDBGet:
210210
async with pass_or_acquire_connection(get_asyncpg_engine(app), connection) as conn:
211211
result = await conn.execute(
212212
select(
@@ -218,7 +218,7 @@ async def get_workspace_db_get(
218218
row = result.one_or_none()
219219
if row is None:
220220
raise WorkspaceNotFoundError(reason=f"Workspace {workspace_id} not found.")
221-
return WorkspaceDBGet.model_validate(row)
221+
return WorkspaceDBGet.model_validate(row)
222222

223223

224224
async def update_workspace(

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ async def delete_workspace(request: web.Request):
153153
req_ctx = WorkspacesRequestContext.model_validate(request)
154154
path_params = parse_request_path_parameters_as(WorkspacesPathParams, request)
155155

156-
await _workspaces_service.delete_workspace(
156+
await _workspaces_service.delete_workspace_with_all_content(
157157
app=request.app,
158158
user_id=req_ctx.user_id,
159159
workspace_id=path_params.workspace_id,

0 commit comments

Comments
 (0)