fractal-server 2.10.0a0__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.
@@ -1 +1 @@
1
- __VERSION__ = "2.10.0a0"
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,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fractal-server
3
- Version: 2.10.0a0
3
+ Version: 2.10.1
4
4
  Summary: Server component of the Fractal analytics platform
5
5
  Home-page: https://github.com/fractal-analytics-platform/fractal-server
6
6
  License: BSD-3-Clause
@@ -1,4 +1,4 @@
1
- fractal_server/__init__.py,sha256=Qb19IXoi0fWBhP9l0Xx5EOFNybthKtzgo46qgF8V_s0,25
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=ciHTwXXFiFnMF7ZpJ3Xs0q6YfuZrFvIjqndlzAEdZpo,6969
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=ILWYZu_PfVVuZ8-qMRAuRuzBhne6nhS6sUzsigLcl-E,2557
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=vDdMktYbHeYBgB5OuWSv6wRPRXWqvetkeqQ7IC5YtfA,5751
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.0a0.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
244
- fractal_server-2.10.0a0.dist-info/METADATA,sha256=G-j04Q-B4uv3h77NOrY7lh-IEVFO_7AzmV3Lp3zqw8w,4546
245
- fractal_server-2.10.0a0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
246
- fractal_server-2.10.0a0.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
247
- fractal_server-2.10.0a0.dist-info/RECORD,,
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,,