fractal-server 2.17.2__py3-none-any.whl → 2.18.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- fractal_server/__init__.py +1 -1
- fractal_server/__main__.py +2 -1
- fractal_server/app/models/linkuserproject.py +40 -0
- fractal_server/app/models/security.py +7 -5
- fractal_server/app/models/v2/job.py +13 -2
- fractal_server/app/models/v2/resource.py +13 -0
- fractal_server/app/routes/admin/v2/__init__.py +11 -11
- fractal_server/app/routes/admin/v2/accounting.py +2 -2
- fractal_server/app/routes/admin/v2/job.py +34 -23
- fractal_server/app/routes/admin/v2/sharing.py +103 -0
- fractal_server/app/routes/admin/v2/task.py +9 -8
- fractal_server/app/routes/admin/v2/task_group.py +94 -16
- fractal_server/app/routes/admin/v2/task_group_lifecycle.py +20 -20
- fractal_server/app/routes/api/__init__.py +0 -9
- fractal_server/app/routes/api/v2/__init__.py +47 -47
- fractal_server/app/routes/api/v2/_aux_functions.py +65 -64
- fractal_server/app/routes/api/v2/_aux_functions_history.py +8 -3
- fractal_server/app/routes/api/v2/_aux_functions_sharing.py +97 -0
- fractal_server/app/routes/api/v2/_aux_functions_task_lifecycle.py +4 -4
- fractal_server/app/routes/api/v2/_aux_functions_tasks.py +2 -2
- fractal_server/app/routes/api/v2/dataset.py +89 -77
- fractal_server/app/routes/api/v2/history.py +28 -16
- fractal_server/app/routes/api/v2/images.py +22 -8
- fractal_server/app/routes/api/v2/job.py +40 -24
- fractal_server/app/routes/api/v2/pre_submission_checks.py +13 -6
- fractal_server/app/routes/api/v2/project.py +48 -25
- fractal_server/app/routes/api/v2/sharing.py +311 -0
- fractal_server/app/routes/api/v2/status_legacy.py +22 -33
- fractal_server/app/routes/api/v2/submit.py +76 -71
- fractal_server/app/routes/api/v2/task.py +15 -17
- fractal_server/app/routes/api/v2/task_collection.py +18 -18
- fractal_server/app/routes/api/v2/task_collection_custom.py +11 -13
- fractal_server/app/routes/api/v2/task_collection_pixi.py +9 -9
- fractal_server/app/routes/api/v2/task_group.py +18 -18
- fractal_server/app/routes/api/v2/task_group_lifecycle.py +26 -26
- fractal_server/app/routes/api/v2/task_version_update.py +12 -9
- fractal_server/app/routes/api/v2/workflow.py +41 -29
- fractal_server/app/routes/api/v2/workflow_import.py +25 -23
- fractal_server/app/routes/api/v2/workflowtask.py +25 -17
- fractal_server/app/routes/auth/_aux_auth.py +100 -0
- fractal_server/app/routes/auth/current_user.py +0 -63
- fractal_server/app/routes/auth/group.py +1 -30
- fractal_server/app/routes/auth/router.py +2 -0
- fractal_server/app/routes/auth/users.py +9 -0
- fractal_server/app/routes/auth/viewer_paths.py +43 -0
- fractal_server/app/schemas/user.py +29 -12
- fractal_server/app/schemas/user_group.py +0 -15
- fractal_server/app/schemas/v2/__init__.py +55 -48
- fractal_server/app/schemas/v2/dataset.py +35 -13
- fractal_server/app/schemas/v2/dumps.py +9 -9
- fractal_server/app/schemas/v2/job.py +11 -11
- fractal_server/app/schemas/v2/project.py +3 -3
- fractal_server/app/schemas/v2/resource.py +13 -4
- fractal_server/app/schemas/v2/sharing.py +99 -0
- fractal_server/app/schemas/v2/status_legacy.py +3 -3
- fractal_server/app/schemas/v2/task.py +6 -6
- fractal_server/app/schemas/v2/task_collection.py +4 -4
- fractal_server/app/schemas/v2/task_group.py +16 -16
- fractal_server/app/schemas/v2/workflow.py +16 -16
- fractal_server/app/schemas/v2/workflowtask.py +14 -14
- fractal_server/app/security/__init__.py +1 -1
- fractal_server/app/shutdown.py +6 -6
- fractal_server/config/__init__.py +0 -6
- fractal_server/config/_data.py +0 -79
- fractal_server/config/_main.py +6 -1
- fractal_server/data_migrations/2_18_0.py +30 -0
- fractal_server/images/models.py +1 -2
- fractal_server/main.py +72 -11
- fractal_server/migrations/versions/7910eed4cf97_user_project_dirs_and_usergroup_viewer_.py +60 -0
- fractal_server/migrations/versions/88270f589c9b_add_prevent_new_submissions.py +39 -0
- fractal_server/migrations/versions/bc0e8b3327a7_project_sharing.py +72 -0
- fractal_server/migrations/versions/f0702066b007_one_submitted_job_per_dataset.py +40 -0
- fractal_server/runner/config/_slurm.py +2 -0
- fractal_server/runner/executors/slurm_common/_batching.py +4 -10
- fractal_server/runner/executors/slurm_common/slurm_config.py +1 -0
- fractal_server/runner/executors/slurm_ssh/runner.py +1 -1
- fractal_server/runner/executors/slurm_sudo/runner.py +1 -1
- fractal_server/runner/v2/_local.py +4 -3
- fractal_server/runner/v2/_slurm_ssh.py +4 -3
- fractal_server/runner/v2/_slurm_sudo.py +4 -3
- fractal_server/runner/v2/runner.py +36 -17
- fractal_server/runner/v2/runner_functions.py +11 -14
- fractal_server/runner/v2/submit_workflow.py +22 -9
- fractal_server/tasks/v2/local/_utils.py +2 -2
- fractal_server/tasks/v2/local/collect.py +5 -6
- fractal_server/tasks/v2/local/collect_pixi.py +5 -6
- fractal_server/tasks/v2/local/deactivate.py +7 -7
- fractal_server/tasks/v2/local/deactivate_pixi.py +3 -3
- fractal_server/tasks/v2/local/delete.py +5 -5
- fractal_server/tasks/v2/local/reactivate.py +5 -5
- fractal_server/tasks/v2/local/reactivate_pixi.py +5 -5
- fractal_server/tasks/v2/ssh/collect.py +5 -5
- fractal_server/tasks/v2/ssh/collect_pixi.py +5 -5
- fractal_server/tasks/v2/ssh/deactivate.py +7 -7
- fractal_server/tasks/v2/ssh/deactivate_pixi.py +2 -2
- fractal_server/tasks/v2/ssh/delete.py +5 -5
- fractal_server/tasks/v2/ssh/reactivate.py +5 -5
- fractal_server/tasks/v2/ssh/reactivate_pixi.py +5 -5
- fractal_server/tasks/v2/utils_background.py +7 -7
- fractal_server/tasks/v2/utils_database.py +5 -5
- fractal_server/types/__init__.py +22 -0
- fractal_server/types/validators/__init__.py +3 -0
- fractal_server/types/validators/_common_validators.py +32 -0
- {fractal_server-2.17.2.dist-info → fractal_server-2.18.0.dist-info}/METADATA +3 -2
- {fractal_server-2.17.2.dist-info → fractal_server-2.18.0.dist-info}/RECORD +108 -98
- {fractal_server-2.17.2.dist-info → fractal_server-2.18.0.dist-info}/WHEEL +0 -0
- {fractal_server-2.17.2.dist-info → fractal_server-2.18.0.dist-info}/entry_points.txt +0 -0
- {fractal_server-2.17.2.dist-info → fractal_server-2.18.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -5,6 +5,7 @@ from fastapi import status
|
|
|
5
5
|
from pydantic.types import AwareDatetime
|
|
6
6
|
from sqlalchemy.sql.operators import is_
|
|
7
7
|
from sqlalchemy.sql.operators import is_not
|
|
8
|
+
from sqlmodel import func
|
|
8
9
|
from sqlmodel import select
|
|
9
10
|
|
|
10
11
|
from fractal_server.app.db import AsyncSession
|
|
@@ -16,12 +17,15 @@ from fractal_server.app.routes.auth import current_superuser_act
|
|
|
16
17
|
from fractal_server.app.routes.auth._aux_auth import (
|
|
17
18
|
_verify_user_belongs_to_group,
|
|
18
19
|
)
|
|
19
|
-
from fractal_server.app.
|
|
20
|
-
from fractal_server.app.
|
|
21
|
-
from fractal_server.app.
|
|
20
|
+
from fractal_server.app.routes.pagination import PaginationRequest
|
|
21
|
+
from fractal_server.app.routes.pagination import PaginationResponse
|
|
22
|
+
from fractal_server.app.routes.pagination import get_pagination_params
|
|
23
|
+
from fractal_server.app.schemas.v2 import TaskGroupActivityAction
|
|
24
|
+
from fractal_server.app.schemas.v2 import TaskGroupActivityRead
|
|
25
|
+
from fractal_server.app.schemas.v2 import TaskGroupActivityStatus
|
|
26
|
+
from fractal_server.app.schemas.v2 import TaskGroupOriginEnum
|
|
22
27
|
from fractal_server.app.schemas.v2 import TaskGroupReadSuperuser
|
|
23
|
-
from fractal_server.app.schemas.v2 import
|
|
24
|
-
from fractal_server.app.schemas.v2 import TaskGroupV2OriginEnum
|
|
28
|
+
from fractal_server.app.schemas.v2 import TaskGroupUpdate
|
|
25
29
|
from fractal_server.logger import set_logger
|
|
26
30
|
|
|
27
31
|
router = APIRouter()
|
|
@@ -29,39 +33,78 @@ router = APIRouter()
|
|
|
29
33
|
logger = set_logger(__name__)
|
|
30
34
|
|
|
31
35
|
|
|
32
|
-
@router.get(
|
|
36
|
+
@router.get(
|
|
37
|
+
"/activity/", response_model=PaginationResponse[TaskGroupActivityRead]
|
|
38
|
+
)
|
|
33
39
|
async def get_task_group_activity_list(
|
|
34
40
|
task_group_activity_id: int | None = None,
|
|
35
41
|
user_id: int | None = None,
|
|
36
42
|
taskgroupv2_id: int | None = None,
|
|
37
43
|
pkg_name: str | None = None,
|
|
38
|
-
status:
|
|
39
|
-
action:
|
|
44
|
+
status: TaskGroupActivityStatus | None = None,
|
|
45
|
+
action: TaskGroupActivityAction | None = None,
|
|
40
46
|
timestamp_started_min: AwareDatetime | None = None,
|
|
47
|
+
pagination: PaginationRequest = Depends(get_pagination_params),
|
|
41
48
|
superuser: UserOAuth = Depends(current_superuser_act),
|
|
42
49
|
db: AsyncSession = Depends(get_async_db),
|
|
43
|
-
) ->
|
|
44
|
-
|
|
50
|
+
) -> PaginationResponse[TaskGroupActivityRead]:
|
|
51
|
+
# Assign pagination parameters
|
|
52
|
+
page = pagination.page
|
|
53
|
+
page_size = pagination.page_size
|
|
54
|
+
|
|
55
|
+
stm = select(TaskGroupActivityV2).order_by(
|
|
56
|
+
TaskGroupActivityV2.timestamp_started.desc()
|
|
57
|
+
)
|
|
58
|
+
stm_count = select(func.count(TaskGroupActivityV2.id))
|
|
45
59
|
if task_group_activity_id is not None:
|
|
46
60
|
stm = stm.where(TaskGroupActivityV2.id == task_group_activity_id)
|
|
61
|
+
stm_count = stm_count.where(
|
|
62
|
+
TaskGroupActivityV2.id == task_group_activity_id
|
|
63
|
+
)
|
|
47
64
|
if user_id:
|
|
48
65
|
stm = stm.where(TaskGroupActivityV2.user_id == user_id)
|
|
66
|
+
stm_count = stm_count.where(TaskGroupActivityV2.user_id == user_id)
|
|
49
67
|
if taskgroupv2_id:
|
|
50
68
|
stm = stm.where(TaskGroupActivityV2.taskgroupv2_id == taskgroupv2_id)
|
|
69
|
+
stm_count = stm_count.where(
|
|
70
|
+
TaskGroupActivityV2.taskgroupv2_id == taskgroupv2_id
|
|
71
|
+
)
|
|
51
72
|
if pkg_name:
|
|
52
73
|
stm = stm.where(TaskGroupActivityV2.pkg_name.icontains(pkg_name))
|
|
74
|
+
stm_count = stm_count.where(
|
|
75
|
+
TaskGroupActivityV2.pkg_name.icontains(pkg_name)
|
|
76
|
+
)
|
|
53
77
|
if status:
|
|
54
78
|
stm = stm.where(TaskGroupActivityV2.status == status)
|
|
79
|
+
stm_count = stm_count.where(TaskGroupActivityV2.status == status)
|
|
55
80
|
if action:
|
|
56
81
|
stm = stm.where(TaskGroupActivityV2.action == action)
|
|
82
|
+
stm_count = stm_count.where(TaskGroupActivityV2.action == action)
|
|
57
83
|
if timestamp_started_min is not None:
|
|
58
84
|
stm = stm.where(
|
|
59
85
|
TaskGroupActivityV2.timestamp_started >= timestamp_started_min
|
|
60
86
|
)
|
|
87
|
+
stm_count = stm_count.where(
|
|
88
|
+
TaskGroupActivityV2.timestamp_started >= timestamp_started_min
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
# Find total number of elements
|
|
92
|
+
res_total_count = await db.execute(stm_count)
|
|
93
|
+
total_count = res_total_count.scalar()
|
|
94
|
+
if page_size is None:
|
|
95
|
+
page_size = total_count
|
|
96
|
+
else:
|
|
97
|
+
stm = stm.offset((page - 1) * page_size).limit(page_size)
|
|
61
98
|
|
|
62
99
|
res = await db.execute(stm)
|
|
63
100
|
activities = res.scalars().all()
|
|
64
|
-
|
|
101
|
+
|
|
102
|
+
return dict(
|
|
103
|
+
total_count=total_count,
|
|
104
|
+
page_size=page_size,
|
|
105
|
+
current_page=page,
|
|
106
|
+
items=activities,
|
|
107
|
+
)
|
|
65
108
|
|
|
66
109
|
|
|
67
110
|
@router.get("/{task_group_id}/", response_model=TaskGroupReadSuperuser)
|
|
@@ -79,21 +122,27 @@ async def query_task_group(
|
|
|
79
122
|
return task_group
|
|
80
123
|
|
|
81
124
|
|
|
82
|
-
@router.get("/", response_model=
|
|
125
|
+
@router.get("/", response_model=PaginationResponse[TaskGroupReadSuperuser])
|
|
83
126
|
async def query_task_group_list(
|
|
84
127
|
user_id: int | None = None,
|
|
85
128
|
user_group_id: int | None = None,
|
|
86
129
|
private: bool | None = None,
|
|
87
130
|
active: bool | None = None,
|
|
88
131
|
pkg_name: str | None = None,
|
|
89
|
-
origin:
|
|
132
|
+
origin: TaskGroupOriginEnum | None = None,
|
|
90
133
|
timestamp_last_used_min: AwareDatetime | None = None,
|
|
91
134
|
timestamp_last_used_max: AwareDatetime | None = None,
|
|
92
135
|
resource_id: int | None = None,
|
|
136
|
+
pagination: PaginationRequest = Depends(get_pagination_params),
|
|
93
137
|
user: UserOAuth = Depends(current_superuser_act),
|
|
94
138
|
db: AsyncSession = Depends(get_async_db),
|
|
95
|
-
) ->
|
|
139
|
+
) -> PaginationResponse[TaskGroupReadSuperuser]:
|
|
140
|
+
# Assign pagination parameters
|
|
141
|
+
page = pagination.page
|
|
142
|
+
page_size = pagination.page_size
|
|
143
|
+
|
|
96
144
|
stm = select(TaskGroupV2)
|
|
145
|
+
stm_count = select(func.count(TaskGroupV2.id))
|
|
97
146
|
|
|
98
147
|
if user_group_id is not None and private is True:
|
|
99
148
|
raise HTTPException(
|
|
@@ -105,43 +154,72 @@ async def query_task_group_list(
|
|
|
105
154
|
)
|
|
106
155
|
if user_id is not None:
|
|
107
156
|
stm = stm.where(TaskGroupV2.user_id == user_id)
|
|
157
|
+
stm_count = stm_count.where(TaskGroupV2.user_id == user_id)
|
|
108
158
|
if user_group_id is not None:
|
|
109
159
|
stm = stm.where(TaskGroupV2.user_group_id == user_group_id)
|
|
160
|
+
stm_count = stm_count.where(TaskGroupV2.user_group_id == user_group_id)
|
|
110
161
|
if private is not None:
|
|
111
162
|
if private is True:
|
|
112
163
|
stm = stm.where(is_(TaskGroupV2.user_group_id, None))
|
|
164
|
+
stm_count = stm_count.where(is_(TaskGroupV2.user_group_id, None))
|
|
113
165
|
else:
|
|
114
166
|
stm = stm.where(is_not(TaskGroupV2.user_group_id, None))
|
|
167
|
+
stm_count = stm_count.where(is_not(TaskGroupV2.user_group_id, None))
|
|
115
168
|
if active is not None:
|
|
116
169
|
if active is True:
|
|
117
170
|
stm = stm.where(is_(TaskGroupV2.active, True))
|
|
171
|
+
stm_count = stm_count.where(is_(TaskGroupV2.active, True))
|
|
118
172
|
else:
|
|
119
173
|
stm = stm.where(is_(TaskGroupV2.active, False))
|
|
174
|
+
stm_count = stm_count.where(is_(TaskGroupV2.active, False))
|
|
120
175
|
if origin is not None:
|
|
121
176
|
stm = stm.where(TaskGroupV2.origin == origin)
|
|
177
|
+
stm_count = stm_count.where(TaskGroupV2.origin == origin)
|
|
122
178
|
if pkg_name is not None:
|
|
123
179
|
stm = stm.where(TaskGroupV2.pkg_name.icontains(pkg_name))
|
|
180
|
+
stm_count = stm_count.where(TaskGroupV2.pkg_name.icontains(pkg_name))
|
|
124
181
|
if timestamp_last_used_min is not None:
|
|
125
182
|
stm = stm.where(
|
|
126
183
|
TaskGroupV2.timestamp_last_used >= timestamp_last_used_min
|
|
127
184
|
)
|
|
185
|
+
stm_count = stm_count.where(
|
|
186
|
+
TaskGroupV2.timestamp_last_used >= timestamp_last_used_min
|
|
187
|
+
)
|
|
128
188
|
if timestamp_last_used_max is not None:
|
|
129
189
|
stm = stm.where(
|
|
130
190
|
TaskGroupV2.timestamp_last_used <= timestamp_last_used_max
|
|
131
191
|
)
|
|
192
|
+
stm_count = stm_count.where(
|
|
193
|
+
TaskGroupV2.timestamp_last_used <= timestamp_last_used_max
|
|
194
|
+
)
|
|
132
195
|
if resource_id is not None:
|
|
133
196
|
stm = stm.where(TaskGroupV2.resource_id == resource_id)
|
|
197
|
+
stm_count = stm_count.where(TaskGroupV2.resource_id == resource_id)
|
|
198
|
+
|
|
199
|
+
# Find total number of elements
|
|
200
|
+
res_total_count = await db.execute(stm_count)
|
|
201
|
+
total_count = res_total_count.scalar()
|
|
202
|
+
if page_size is None:
|
|
203
|
+
page_size = total_count
|
|
204
|
+
else:
|
|
205
|
+
stm = stm.offset((page - 1) * page_size).limit(page_size)
|
|
134
206
|
|
|
135
207
|
stm = stm.order_by(TaskGroupV2.id)
|
|
136
208
|
res = await db.execute(stm)
|
|
137
209
|
task_groups_list = res.scalars().all()
|
|
138
|
-
|
|
210
|
+
|
|
211
|
+
return dict(
|
|
212
|
+
total_count=total_count,
|
|
213
|
+
page_size=page_size,
|
|
214
|
+
current_page=page,
|
|
215
|
+
items=task_groups_list,
|
|
216
|
+
)
|
|
139
217
|
|
|
140
218
|
|
|
141
219
|
@router.patch("/{task_group_id}/", response_model=TaskGroupReadSuperuser)
|
|
142
220
|
async def patch_task_group(
|
|
143
221
|
task_group_id: int,
|
|
144
|
-
task_group_update:
|
|
222
|
+
task_group_update: TaskGroupUpdate,
|
|
145
223
|
user: UserOAuth = Depends(current_superuser_act),
|
|
146
224
|
db: AsyncSession = Depends(get_async_db),
|
|
147
225
|
) -> list[TaskGroupReadSuperuser]:
|
|
@@ -26,10 +26,10 @@ from fractal_server.app.routes.aux.validate_user_profile import (
|
|
|
26
26
|
validate_user_profile,
|
|
27
27
|
)
|
|
28
28
|
from fractal_server.app.schemas.v2 import ResourceType
|
|
29
|
-
from fractal_server.app.schemas.v2 import
|
|
30
|
-
from fractal_server.app.schemas.v2 import
|
|
31
|
-
from fractal_server.app.schemas.v2 import
|
|
32
|
-
from fractal_server.app.schemas.v2 import
|
|
29
|
+
from fractal_server.app.schemas.v2 import TaskGroupActivityAction
|
|
30
|
+
from fractal_server.app.schemas.v2 import TaskGroupActivityRead
|
|
31
|
+
from fractal_server.app.schemas.v2 import TaskGroupActivityStatus
|
|
32
|
+
from fractal_server.app.schemas.v2 import TaskGroupOriginEnum
|
|
33
33
|
from fractal_server.logger import set_logger
|
|
34
34
|
from fractal_server.tasks.v2.local import deactivate_local
|
|
35
35
|
from fractal_server.tasks.v2.local import delete_local
|
|
@@ -46,7 +46,7 @@ logger = set_logger(__name__)
|
|
|
46
46
|
|
|
47
47
|
@router.post(
|
|
48
48
|
"/{task_group_id}/deactivate/",
|
|
49
|
-
response_model=
|
|
49
|
+
response_model=TaskGroupActivityRead,
|
|
50
50
|
)
|
|
51
51
|
async def deactivate_task_group(
|
|
52
52
|
task_group_id: int,
|
|
@@ -54,7 +54,7 @@ async def deactivate_task_group(
|
|
|
54
54
|
response: Response,
|
|
55
55
|
superuser: UserOAuth = Depends(current_superuser_act),
|
|
56
56
|
db: AsyncSession = Depends(get_async_db),
|
|
57
|
-
) ->
|
|
57
|
+
) -> TaskGroupActivityRead:
|
|
58
58
|
"""
|
|
59
59
|
Deactivate task-group venv
|
|
60
60
|
"""
|
|
@@ -78,13 +78,13 @@ async def deactivate_task_group(
|
|
|
78
78
|
await check_no_submitted_job(task_group_id=task_group.id, db=db)
|
|
79
79
|
|
|
80
80
|
# Shortcut for task-group with origin="other"
|
|
81
|
-
if task_group.origin ==
|
|
81
|
+
if task_group.origin == TaskGroupOriginEnum.OTHER:
|
|
82
82
|
task_group.active = False
|
|
83
83
|
task_group_activity = TaskGroupActivityV2(
|
|
84
84
|
user_id=task_group.user_id,
|
|
85
85
|
taskgroupv2_id=task_group.id,
|
|
86
|
-
status=
|
|
87
|
-
action=
|
|
86
|
+
status=TaskGroupActivityStatus.OK,
|
|
87
|
+
action=TaskGroupActivityAction.DEACTIVATE,
|
|
88
88
|
pkg_name=task_group.pkg_name,
|
|
89
89
|
version=(task_group.version or "N/A"),
|
|
90
90
|
log=(
|
|
@@ -103,8 +103,8 @@ async def deactivate_task_group(
|
|
|
103
103
|
task_group_activity = TaskGroupActivityV2(
|
|
104
104
|
user_id=task_group.user_id,
|
|
105
105
|
taskgroupv2_id=task_group.id,
|
|
106
|
-
status=
|
|
107
|
-
action=
|
|
106
|
+
status=TaskGroupActivityStatus.PENDING,
|
|
107
|
+
action=TaskGroupActivityAction.DEACTIVATE,
|
|
108
108
|
pkg_name=task_group.pkg_name,
|
|
109
109
|
version=task_group.version,
|
|
110
110
|
timestamp_started=get_timestamp(),
|
|
@@ -140,7 +140,7 @@ async def deactivate_task_group(
|
|
|
140
140
|
|
|
141
141
|
@router.post(
|
|
142
142
|
"/{task_group_id}/reactivate/",
|
|
143
|
-
response_model=
|
|
143
|
+
response_model=TaskGroupActivityRead,
|
|
144
144
|
)
|
|
145
145
|
async def reactivate_task_group(
|
|
146
146
|
task_group_id: int,
|
|
@@ -148,7 +148,7 @@ async def reactivate_task_group(
|
|
|
148
148
|
response: Response,
|
|
149
149
|
superuser: UserOAuth = Depends(current_superuser_act),
|
|
150
150
|
db: AsyncSession = Depends(get_async_db),
|
|
151
|
-
) ->
|
|
151
|
+
) -> TaskGroupActivityRead:
|
|
152
152
|
"""
|
|
153
153
|
Deactivate task-group venv
|
|
154
154
|
"""
|
|
@@ -173,13 +173,13 @@ async def reactivate_task_group(
|
|
|
173
173
|
await check_no_submitted_job(task_group_id=task_group.id, db=db)
|
|
174
174
|
|
|
175
175
|
# Shortcut for task-group with origin="other"
|
|
176
|
-
if task_group.origin ==
|
|
176
|
+
if task_group.origin == TaskGroupOriginEnum.OTHER:
|
|
177
177
|
task_group.active = True
|
|
178
178
|
task_group_activity = TaskGroupActivityV2(
|
|
179
179
|
user_id=task_group.user_id,
|
|
180
180
|
taskgroupv2_id=task_group.id,
|
|
181
|
-
status=
|
|
182
|
-
action=
|
|
181
|
+
status=TaskGroupActivityStatus.OK,
|
|
182
|
+
action=TaskGroupActivityAction.REACTIVATE,
|
|
183
183
|
pkg_name=task_group.pkg_name,
|
|
184
184
|
version=(task_group.version or "N/A"),
|
|
185
185
|
log=(
|
|
@@ -206,8 +206,8 @@ async def reactivate_task_group(
|
|
|
206
206
|
task_group_activity = TaskGroupActivityV2(
|
|
207
207
|
user_id=task_group.user_id,
|
|
208
208
|
taskgroupv2_id=task_group.id,
|
|
209
|
-
status=
|
|
210
|
-
action=
|
|
209
|
+
status=TaskGroupActivityStatus.PENDING,
|
|
210
|
+
action=TaskGroupActivityAction.REACTIVATE,
|
|
211
211
|
pkg_name=task_group.pkg_name,
|
|
212
212
|
version=task_group.version,
|
|
213
213
|
timestamp_started=get_timestamp(),
|
|
@@ -259,8 +259,8 @@ async def delete_task_group(
|
|
|
259
259
|
task_group_activity = TaskGroupActivityV2(
|
|
260
260
|
user_id=task_group.user_id,
|
|
261
261
|
taskgroupv2_id=task_group.id,
|
|
262
|
-
status=
|
|
263
|
-
action=
|
|
262
|
+
status=TaskGroupActivityStatus.PENDING,
|
|
263
|
+
action=TaskGroupActivityAction.DELETE,
|
|
264
264
|
pkg_name=task_group.pkg_name,
|
|
265
265
|
version=(task_group.version or "N/A"),
|
|
266
266
|
timestamp_started=get_timestamp(),
|
|
@@ -8,7 +8,6 @@ from fastapi import Depends
|
|
|
8
8
|
import fractal_server
|
|
9
9
|
from fractal_server.app.models import UserOAuth
|
|
10
10
|
from fractal_server.app.routes.auth import current_superuser_act
|
|
11
|
-
from fractal_server.config import get_data_settings
|
|
12
11
|
from fractal_server.config import get_db_settings
|
|
13
12
|
from fractal_server.config import get_email_settings
|
|
14
13
|
from fractal_server.config import get_oauth_settings
|
|
@@ -50,14 +49,6 @@ async def view_email_settings(
|
|
|
50
49
|
return settings.model_dump()
|
|
51
50
|
|
|
52
51
|
|
|
53
|
-
@router_api.get("/settings/data/")
|
|
54
|
-
async def view_data_settings(
|
|
55
|
-
user: UserOAuth = Depends(current_superuser_act),
|
|
56
|
-
):
|
|
57
|
-
settings = Inject(get_data_settings)
|
|
58
|
-
return settings.model_dump()
|
|
59
|
-
|
|
60
|
-
|
|
61
52
|
@router_api.get("/settings/oauth/")
|
|
62
53
|
async def view_oauth_settings(
|
|
63
54
|
user: UserOAuth = Depends(current_superuser_act),
|
|
@@ -7,66 +7,66 @@ from fastapi import APIRouter
|
|
|
7
7
|
from fractal_server.config import get_settings
|
|
8
8
|
from fractal_server.syringe import Inject
|
|
9
9
|
|
|
10
|
-
from .dataset import router as
|
|
11
|
-
from .history import router as
|
|
12
|
-
from .images import router as
|
|
13
|
-
from .job import router as
|
|
10
|
+
from .dataset import router as dataset_router
|
|
11
|
+
from .history import router as history_router
|
|
12
|
+
from .images import router as images_routes
|
|
13
|
+
from .job import router as job_router
|
|
14
14
|
from .pre_submission_checks import router as pre_submission_checks_router
|
|
15
|
-
from .project import router as
|
|
16
|
-
from .
|
|
17
|
-
from .
|
|
18
|
-
from .
|
|
19
|
-
from .
|
|
20
|
-
from .
|
|
21
|
-
from .
|
|
22
|
-
from .
|
|
23
|
-
from .
|
|
24
|
-
from .
|
|
25
|
-
from .
|
|
26
|
-
from .
|
|
27
|
-
from .
|
|
15
|
+
from .project import router as project_router
|
|
16
|
+
from .sharing import router as sharing_router
|
|
17
|
+
from .status_legacy import router as status_legacy_router
|
|
18
|
+
from .submit import router as submit_job_router
|
|
19
|
+
from .task import router as task_router
|
|
20
|
+
from .task_collection import router as task_collection_router
|
|
21
|
+
from .task_collection_custom import router as task_collection_router_custom
|
|
22
|
+
from .task_collection_pixi import router as task_collection_pixi_router
|
|
23
|
+
from .task_group import router as task_group_router
|
|
24
|
+
from .task_group_lifecycle import router as task_group_lifecycle_router
|
|
25
|
+
from .task_version_update import router as task_version_update_router
|
|
26
|
+
from .workflow import router as workflow_router
|
|
27
|
+
from .workflow_import import router as workflow_import_router
|
|
28
|
+
from .workflowtask import router as workflowtask_router
|
|
28
29
|
|
|
29
|
-
|
|
30
|
+
router_api = APIRouter()
|
|
30
31
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
32
|
+
router_api.include_router(dataset_router, tags=["Dataset"])
|
|
33
|
+
router_api.include_router(pre_submission_checks_router, tags=["Job"])
|
|
34
|
+
router_api.include_router(job_router, tags=["Job"])
|
|
35
|
+
router_api.include_router(images_routes, tags=["Images"])
|
|
36
|
+
router_api.include_router(sharing_router, tags=["Project Sharing"])
|
|
37
|
+
router_api.include_router(project_router, tags=["Project"])
|
|
38
|
+
router_api.include_router(submit_job_router, tags=["Job"])
|
|
39
|
+
router_api.include_router(history_router, tags=["History"])
|
|
40
|
+
router_api.include_router(status_legacy_router, tags=["Status Legacy"])
|
|
39
41
|
|
|
40
42
|
|
|
41
43
|
settings = Inject(get_settings)
|
|
42
|
-
|
|
43
|
-
|
|
44
|
+
router_api.include_router(
|
|
45
|
+
task_collection_router,
|
|
44
46
|
prefix="/task",
|
|
45
|
-
tags=["
|
|
47
|
+
tags=["Task Lifecycle"],
|
|
46
48
|
)
|
|
47
|
-
|
|
48
|
-
|
|
49
|
+
router_api.include_router(
|
|
50
|
+
task_collection_router_custom,
|
|
49
51
|
prefix="/task",
|
|
50
|
-
tags=["
|
|
52
|
+
tags=["Task Lifecycle"],
|
|
51
53
|
)
|
|
52
|
-
|
|
53
|
-
|
|
54
|
+
router_api.include_router(
|
|
55
|
+
task_collection_pixi_router,
|
|
54
56
|
prefix="/task",
|
|
55
|
-
tags=["
|
|
57
|
+
tags=["Task Lifecycle"],
|
|
56
58
|
)
|
|
57
|
-
|
|
58
|
-
|
|
59
|
+
router_api.include_router(
|
|
60
|
+
task_group_lifecycle_router,
|
|
59
61
|
prefix="/task-group",
|
|
60
|
-
tags=["
|
|
62
|
+
tags=["Task Lifecycle"],
|
|
61
63
|
)
|
|
62
64
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
65
|
+
router_api.include_router(task_router, prefix="/task", tags=["Task"])
|
|
66
|
+
router_api.include_router(task_version_update_router, tags=["Task"])
|
|
67
|
+
router_api.include_router(
|
|
68
|
+
task_group_router, prefix="/task-group", tags=["TaskGroup"]
|
|
67
69
|
)
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
)
|
|
72
|
-
router_api_v2.include_router(workflowtask_router_v2, tags=["V2 WorkflowTask"])
|
|
70
|
+
router_api.include_router(workflow_router, tags=["Workflow"])
|
|
71
|
+
router_api.include_router(workflow_import_router, tags=["Workflow Import"])
|
|
72
|
+
router_api.include_router(workflowtask_router, tags=["WorkflowTask"])
|