Skip to content

Commit ca3925d

Browse files
committed
implements batch_delete_trashed_projects_as_admin
1 parent 6e91fc6 commit ca3925d

File tree

3 files changed

+60
-10
lines changed

3 files changed

+60
-10
lines changed

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,7 @@ async def batch_delete_trashed_folders_as_admin(
292292
FolderBatchDeleteError: if error and fail_fast=False
293293
Exception: any other exception during delete_recursively
294294
"""
295+
errors: list[tuple[FolderID, Exception]] = []
295296

296297
for page_params in iter_pagination_params(limit=MAXIMUM_NUMBER_OF_ITEMS_PER_PAGE):
297298
(
@@ -306,8 +307,7 @@ async def batch_delete_trashed_folders_as_admin(
306307
order_by=OrderBy(field=IDStr("trashed"), direction=OrderDirection.ASC),
307308
)
308309

309-
# batch delete
310-
errors: list[tuple[FolderID, Exception]] = []
310+
# BATCH delete
311311
for folder in expired_trashed_folders:
312312
try:
313313
await _folders_repository.delete_recursively(
@@ -318,7 +318,7 @@ async def batch_delete_trashed_folders_as_admin(
318318
raise
319319
errors.append((folder.folder_id, err))
320320

321-
if errors:
322-
raise FolderBatchDeleteError(
323-
errors=errors, trashed_before=trashed_before, product_name=product_name
324-
)
321+
if errors:
322+
raise FolderBatchDeleteError(
323+
errors=errors, trashed_before=trashed_before, product_name=product_name
324+
)

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

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,16 @@
1717

1818
from ..director_v2 import api as director_v2_api
1919
from ..dynamic_scheduler import api as dynamic_scheduler_api
20-
from . import _crud_api_read, projects_service
20+
from . import _crud_api_read
21+
from . import _projects_db as _projects_repository
22+
from . import projects_service
2123
from ._access_rights_api import check_user_project_permission
24+
from ._projects_db import _OLDEST_TRASHED_FIRST
2225
from .exceptions import (
2326
ProjectNotFoundError,
2427
ProjectNotTrashedError,
2528
ProjectRunningConflictError,
29+
ProjectsBatchDeleteError,
2630
)
2731
from .models import ProjectDict, ProjectPatchInternalExtended
2832

@@ -241,10 +245,52 @@ async def delete_explicitly_trashed_project(
241245

242246
async def batch_delete_trashed_projects_as_admin(
243247
app: web.Application,
244-
trashed_before: datetime,
245248
*,
246249
product_name: ProductName,
250+
trashed_before: datetime,
247251
fail_fast: bool,
248-
) -> None:
252+
) -> list[ProjectID]:
253+
254+
deleted_project_ids: list[ProjectID] = []
255+
errors: list[tuple[ProjectID, Exception]] = []
256+
257+
for page_params in iter_pagination_params(limit=MAXIMUM_NUMBER_OF_ITEMS_PER_PAGE):
258+
(
259+
page_params.total_number_of_items,
260+
expired_trashed_projects,
261+
) = await _projects_repository.list_trashed_projects(
262+
app,
263+
trashed_explicitly=True,
264+
trashed_before=trashed_before,
265+
offset=page_params.offset,
266+
limit=page_params.limit,
267+
order_by=_OLDEST_TRASHED_FIRST,
268+
)
269+
# BATCH delete
270+
for project in expired_trashed_projects:
271+
272+
assert project.trashed # nosec
273+
assert project.trashed_explicitly # nosec
274+
275+
try:
276+
_logger.debug(
277+
# TODO: _projects_service_delete.delete_project_as_admin
278+
"await _projects_service_delete.delete_project_as_admin(app, project_id=%s, product_name=%s)",
279+
project.uuid,
280+
product_name,
281+
)
282+
deleted_project_ids.append(project.uuid)
283+
except Exception as err: # pylint: disable=broad-exception-caught
284+
if fail_fast:
285+
raise
286+
errors.append((project.uuid, err))
287+
288+
if errors:
289+
raise ProjectsBatchDeleteError(
290+
errors=errors,
291+
trashed_before=trashed_before,
292+
product_name=product_name,
293+
deleted_project_ids=deleted_project_ids,
294+
)
249295

250-
raise NotImplementedError
296+
return deleted_project_ids

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ def __init__(self, *, project_uuid, reason, **ctx):
7979
self.reason = reason
8080

8181

82+
class ProjectsBatchDeleteError(BaseProjectError):
83+
msg_template = "One or more projects could not be deleted in the batch: {errors}"
84+
85+
8286
class ProjectTrashError(BaseProjectError):
8387
...
8488

0 commit comments

Comments
 (0)