fractal-server 2.10.0__py3-none-any.whl → 2.10.1__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/app/routes/api/v2/workflowtask.py +110 -4
- fractal_server/app/schemas/v2/__init__.py +1 -0
- fractal_server/app/schemas/v2/workflowtask.py +7 -0
- {fractal_server-2.10.0.dist-info → fractal_server-2.10.1.dist-info}/METADATA +1 -1
- {fractal_server-2.10.0.dist-info → fractal_server-2.10.1.dist-info}/RECORD +9 -9
- {fractal_server-2.10.0.dist-info → fractal_server-2.10.1.dist-info}/LICENSE +0 -0
- {fractal_server-2.10.0.dist-info → fractal_server-2.10.1.dist-info}/WHEEL +0 -0
- {fractal_server-2.10.0.dist-info → fractal_server-2.10.1.dist-info}/entry_points.txt +0 -0
fractal_server/__init__.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
__VERSION__ = "2.10.
|
1
|
+
__VERSION__ = "2.10.1"
|
@@ -6,22 +6,129 @@ from fastapi import Depends
|
|
6
6
|
from fastapi import HTTPException
|
7
7
|
from fastapi import Response
|
8
8
|
from fastapi import status
|
9
|
+
from sqlalchemy.orm.attributes import flag_modified
|
9
10
|
|
10
11
|
from ....db import AsyncSession
|
11
12
|
from ....db import get_async_db
|
12
|
-
from ....schemas.v2 import WorkflowTaskCreateV2
|
13
|
-
from ....schemas.v2 import WorkflowTaskReadV2
|
14
|
-
from ....schemas.v2 import WorkflowTaskUpdateV2
|
15
13
|
from ._aux_functions import _get_workflow_check_owner
|
16
14
|
from ._aux_functions import _get_workflow_task_check_owner
|
17
15
|
from ._aux_functions import _workflow_insert_task
|
18
16
|
from ._aux_functions_tasks import _get_task_read_access
|
19
17
|
from fractal_server.app.models import UserOAuth
|
18
|
+
from fractal_server.app.models.v2 import WorkflowTaskV2
|
20
19
|
from fractal_server.app.routes.auth import current_active_user
|
20
|
+
from fractal_server.app.schemas.v2 import WorkflowTaskCreateV2
|
21
|
+
from fractal_server.app.schemas.v2 import WorkflowTaskReadV2
|
22
|
+
from fractal_server.app.schemas.v2 import WorkflowTaskReplaceV2
|
23
|
+
from fractal_server.app.schemas.v2 import WorkflowTaskUpdateV2
|
21
24
|
|
22
25
|
router = APIRouter()
|
23
26
|
|
24
27
|
|
28
|
+
@router.post(
|
29
|
+
"/project/{project_id}/workflow/{workflow_id}/wftask/replace-task/",
|
30
|
+
response_model=WorkflowTaskReadV2,
|
31
|
+
status_code=status.HTTP_201_CREATED,
|
32
|
+
)
|
33
|
+
async def replace_workflowtask(
|
34
|
+
project_id: int,
|
35
|
+
workflow_id: int,
|
36
|
+
workflow_task_id: int,
|
37
|
+
task_id: int,
|
38
|
+
replace: Optional[WorkflowTaskReplaceV2] = None,
|
39
|
+
user: UserOAuth = Depends(current_active_user),
|
40
|
+
db: AsyncSession = Depends(get_async_db),
|
41
|
+
) -> WorkflowTaskReadV2:
|
42
|
+
|
43
|
+
old_workflow_task, workflow = await _get_workflow_task_check_owner(
|
44
|
+
project_id=project_id,
|
45
|
+
workflow_id=workflow_id,
|
46
|
+
workflow_task_id=workflow_task_id,
|
47
|
+
user_id=user.id,
|
48
|
+
db=db,
|
49
|
+
)
|
50
|
+
|
51
|
+
task = await _get_task_read_access(
|
52
|
+
task_id=task_id, user_id=user.id, db=db, require_active=True
|
53
|
+
)
|
54
|
+
|
55
|
+
if task.type != old_workflow_task.task.type:
|
56
|
+
raise HTTPException(
|
57
|
+
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
58
|
+
detail=(
|
59
|
+
f"Cannot replace a Task '{old_workflow_task.task.type}' with a"
|
60
|
+
f" Task '{task.type}'."
|
61
|
+
),
|
62
|
+
)
|
63
|
+
|
64
|
+
_args_non_parallel = old_workflow_task.args_non_parallel
|
65
|
+
_args_parallel = old_workflow_task.args_parallel
|
66
|
+
if replace is not None:
|
67
|
+
if replace.args_non_parallel is not None:
|
68
|
+
if task.type == "parallel":
|
69
|
+
raise HTTPException(
|
70
|
+
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
71
|
+
detail=(
|
72
|
+
"Cannot set 'args_non_parallel' "
|
73
|
+
"when Task is 'parallel'."
|
74
|
+
),
|
75
|
+
)
|
76
|
+
else:
|
77
|
+
_args_non_parallel = replace.args_non_parallel
|
78
|
+
|
79
|
+
if replace.args_parallel is not None:
|
80
|
+
if task.type == "non_parallel":
|
81
|
+
raise HTTPException(
|
82
|
+
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
83
|
+
detail=(
|
84
|
+
"Cannot set 'args_parallel' "
|
85
|
+
"when Task is 'non_parallel'."
|
86
|
+
),
|
87
|
+
)
|
88
|
+
else:
|
89
|
+
_args_parallel = replace.args_parallel
|
90
|
+
|
91
|
+
# If user's changes to `meta_non_parallel` are compatible with new task,
|
92
|
+
# keep them;
|
93
|
+
# else, get `meta_non_parallel` from new task
|
94
|
+
if (
|
95
|
+
old_workflow_task.meta_non_parallel
|
96
|
+
!= old_workflow_task.task.meta_non_parallel
|
97
|
+
) and (old_workflow_task.task.meta_non_parallel == task.meta_non_parallel):
|
98
|
+
_meta_non_parallel = old_workflow_task.meta_non_parallel
|
99
|
+
else:
|
100
|
+
_meta_non_parallel = task.meta_non_parallel
|
101
|
+
# Same for `meta_parallel`
|
102
|
+
if (
|
103
|
+
old_workflow_task.meta_parallel != old_workflow_task.task.meta_parallel
|
104
|
+
) and (old_workflow_task.task.meta_parallel == task.meta_parallel):
|
105
|
+
_meta_parallel = old_workflow_task.meta_parallel
|
106
|
+
else:
|
107
|
+
_meta_parallel = task.meta_parallel
|
108
|
+
|
109
|
+
new_workflow_task = WorkflowTaskV2(
|
110
|
+
# new task
|
111
|
+
task_type=task.type,
|
112
|
+
task_id=task.id,
|
113
|
+
task=task,
|
114
|
+
# old values
|
115
|
+
order=old_workflow_task.order,
|
116
|
+
input_filters=old_workflow_task.input_filters,
|
117
|
+
# possibly new values
|
118
|
+
args_non_parallel=_args_non_parallel,
|
119
|
+
args_parallel=_args_parallel,
|
120
|
+
meta_non_parallel=_meta_non_parallel,
|
121
|
+
meta_parallel=_meta_parallel,
|
122
|
+
)
|
123
|
+
|
124
|
+
await db.delete(old_workflow_task)
|
125
|
+
workflow.task_list.insert(new_workflow_task.order, new_workflow_task)
|
126
|
+
flag_modified(workflow, "task_list")
|
127
|
+
await db.commit()
|
128
|
+
|
129
|
+
return new_workflow_task
|
130
|
+
|
131
|
+
|
25
132
|
@router.post(
|
26
133
|
"/project/{project_id}/workflow/{workflow_id}/wftask/",
|
27
134
|
response_model=WorkflowTaskReadV2,
|
@@ -73,7 +180,6 @@ async def create_workflowtask(
|
|
73
180
|
"is `non_parallel`."
|
74
181
|
),
|
75
182
|
)
|
76
|
-
|
77
183
|
workflow_task = await _workflow_insert_task(
|
78
184
|
workflow_id=workflow.id,
|
79
185
|
task_id=task_id,
|
@@ -45,5 +45,6 @@ from .workflowtask import WorkflowTaskExportV2 # noqa F401
|
|
45
45
|
from .workflowtask import WorkflowTaskImportV2 # noqa F401
|
46
46
|
from .workflowtask import WorkflowTaskReadV2 # noqa F401
|
47
47
|
from .workflowtask import WorkflowTaskReadV2WithWarning # noqa F401
|
48
|
+
from .workflowtask import WorkflowTaskReplaceV2 # noqa F401
|
48
49
|
from .workflowtask import WorkflowTaskStatusTypeV2 # noqa F401
|
49
50
|
from .workflowtask import WorkflowTaskUpdateV2 # noqa F401
|
@@ -82,6 +82,13 @@ class WorkflowTaskCreateV2(BaseModel, extra=Extra.forbid):
|
|
82
82
|
return value
|
83
83
|
|
84
84
|
|
85
|
+
class WorkflowTaskReplaceV2(BaseModel):
|
86
|
+
"""Used by 'replace-task' endpoint"""
|
87
|
+
|
88
|
+
args_non_parallel: Optional[dict[str, Any]] = None
|
89
|
+
args_parallel: Optional[dict[str, Any]] = None
|
90
|
+
|
91
|
+
|
85
92
|
class WorkflowTaskReadV2(BaseModel):
|
86
93
|
|
87
94
|
id: int
|
@@ -1,4 +1,4 @@
|
|
1
|
-
fractal_server/__init__.py,sha256=
|
1
|
+
fractal_server/__init__.py,sha256=mGoPL5QC9hw_tGv5lsEM4M_0NMrtig40cMpwnjY5kto,23
|
2
2
|
fractal_server/__main__.py,sha256=dEkCfzLLQrIlxsGC-HBfoR-RBMWnJDgNrxYTyzmE9c0,6146
|
3
3
|
fractal_server/alembic.ini,sha256=MWwi7GzjzawI9cCAK1LW7NxIBQDUqD12-ptJoq5JpP0,3153
|
4
4
|
fractal_server/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -59,7 +59,7 @@ fractal_server/app/routes/api/v2/task_group.py,sha256=4o2N0z7jK7VUVlJZMM4GveCCc4
|
|
59
59
|
fractal_server/app/routes/api/v2/task_group_lifecycle.py,sha256=3o9bCC8ubMwffQPPaxQZy-CjH9IB2RkIReIecI6L2_w,9300
|
60
60
|
fractal_server/app/routes/api/v2/workflow.py,sha256=vjCNRzMHaAB4YWbAEWGlELHXDN4GjtE26IkIiB15RGM,8682
|
61
61
|
fractal_server/app/routes/api/v2/workflow_import.py,sha256=-7Er3FWGF_1xI2qHFO9gfLVQAok5bojd7mbzQxa9Ofw,10858
|
62
|
-
fractal_server/app/routes/api/v2/workflowtask.py,sha256=
|
62
|
+
fractal_server/app/routes/api/v2/workflowtask.py,sha256=opA6hYfscPmoPhD-Xx1Z9DDeUf9Nnoo6jF2LUdNyGhM,10771
|
63
63
|
fractal_server/app/routes/auth/__init__.py,sha256=fao6CS0WiAjHDTvBzgBVV_bSXFpEAeDBF6Z6q7rRkPc,1658
|
64
64
|
fractal_server/app/routes/auth/_aux_auth.py,sha256=ifkNocTYatBSMYGwiR14qohmvR9SfMldceiEj6uJBrU,4783
|
65
65
|
fractal_server/app/routes/auth/current_user.py,sha256=I3aVY5etWAJ_SH6t65Mj5TjvB2X8sAGuu1KG7FxLyPU,5883
|
@@ -149,7 +149,7 @@ fractal_server/app/schemas/v1/state.py,sha256=tBXzp_qW2TNNNPBo-AWEaffEU-1GkMBtUo
|
|
149
149
|
fractal_server/app/schemas/v1/task.py,sha256=7BxOZ_qoRQ8n3YbQpDvB7VMcxB5fSYQmR5RLIWhuJ5U,3704
|
150
150
|
fractal_server/app/schemas/v1/task_collection.py,sha256=uvq9bcMaGD_qHsh7YtcpoSAkVAbw12eY4DocIO3MKOg,3057
|
151
151
|
fractal_server/app/schemas/v1/workflow.py,sha256=oRKamLSuAgrTcv3gMMxGcotDloLL2c3NNgPA39UEmmM,4467
|
152
|
-
fractal_server/app/schemas/v2/__init__.py,sha256=
|
152
|
+
fractal_server/app/schemas/v2/__init__.py,sha256=IT2a6fbRx3rt8h6jri_4gZWzTN9EVXewiWoIuBcZ-xA,2618
|
153
153
|
fractal_server/app/schemas/v2/dataset.py,sha256=zRlcO0wDZahTW1PINdVEuARZ7GZUuEqqop7UdE3-5do,2470
|
154
154
|
fractal_server/app/schemas/v2/dumps.py,sha256=s6dg-pHZFui6t2Ktm0SMxjKDN-v-ZqBHz9iTsBQF3eU,1712
|
155
155
|
fractal_server/app/schemas/v2/job.py,sha256=42V-bFfMvysRplwTKGsL_WshAVsWSM6yjFqypxwrY3k,3020
|
@@ -160,7 +160,7 @@ fractal_server/app/schemas/v2/task.py,sha256=FFAbYwDlqowB8gVMdjFVPVHvAM0T89PYLix
|
|
160
160
|
fractal_server/app/schemas/v2/task_collection.py,sha256=9c_yyFcVBXdAZpQQniy1bROhYnQT7G1BflOpMY1joPE,6250
|
161
161
|
fractal_server/app/schemas/v2/task_group.py,sha256=EPQ1WHjIA8WDrpsTfvfRESjwUVzu6jKiaKZx45b36N4,3215
|
162
162
|
fractal_server/app/schemas/v2/workflow.py,sha256=-KWvXnbHBFA3pj5n7mfSyLKJQSqkJmoziIEe7mpLl3M,1875
|
163
|
-
fractal_server/app/schemas/v2/workflowtask.py,sha256=
|
163
|
+
fractal_server/app/schemas/v2/workflowtask.py,sha256=FthKErVgx3a-k7WVk3nqJe1G-fl_iHND4rVrDXJ0F84,5942
|
164
164
|
fractal_server/app/security/__init__.py,sha256=MlWVrLFPj9M2Gug-k8yATM-Cw066RugVU4KK6kMRbnQ,13019
|
165
165
|
fractal_server/app/user_settings.py,sha256=OP1yiYKtPadxwM51_Q0hdPk3z90TCN4z1BLpQsXyWiU,1316
|
166
166
|
fractal_server/config.py,sha256=wRWJqyEeH4j2puH-fGlCYKLoKFh9pzRsQkS6q1VtO9M,23173
|
@@ -240,8 +240,8 @@ fractal_server/tasks/v2/utils_templates.py,sha256=MS8zu24qimJSktZaHruPxkwIl81ZoU
|
|
240
240
|
fractal_server/urls.py,sha256=5o_qq7PzKKbwq12NHSQZDmDitn5RAOeQ4xufu-2v9Zk,448
|
241
241
|
fractal_server/utils.py,sha256=utvmBx8K9I8hRWFquxna2pBaOqe0JifDL_NVPmihEJI,3525
|
242
242
|
fractal_server/zip_tools.py,sha256=GjDgo_sf6V_DDg6wWeBlZu5zypIxycn_l257p_YVKGc,4876
|
243
|
-
fractal_server-2.10.
|
244
|
-
fractal_server-2.10.
|
245
|
-
fractal_server-2.10.
|
246
|
-
fractal_server-2.10.
|
247
|
-
fractal_server-2.10.
|
243
|
+
fractal_server-2.10.1.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
|
244
|
+
fractal_server-2.10.1.dist-info/METADATA,sha256=r2HP2NsG-Jz9wcqob_X5XehPxQCzC8amUcW300aoPG4,4544
|
245
|
+
fractal_server-2.10.1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
246
|
+
fractal_server-2.10.1.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
|
247
|
+
fractal_server-2.10.1.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|