fractal-server 2.0.0a10__py3-none-any.whl → 2.0.0a12__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.
Files changed (47) hide show
  1. fractal_server/__init__.py +1 -1
  2. fractal_server/app/models/__init__.py +5 -3
  3. fractal_server/app/models/v1/__init__.py +1 -0
  4. fractal_server/app/models/{state.py → v1/state.py} +2 -2
  5. fractal_server/app/models/v2/__init__.py +2 -0
  6. fractal_server/app/models/v2/collection_state.py +21 -0
  7. fractal_server/app/models/v2/job.py +2 -2
  8. fractal_server/app/models/v2/workflowtask.py +0 -39
  9. fractal_server/app/routes/admin/v1.py +5 -5
  10. fractal_server/app/routes/admin/v2.py +4 -4
  11. fractal_server/app/routes/api/v1/_aux_functions.py +6 -6
  12. fractal_server/app/routes/api/v1/dataset.py +4 -4
  13. fractal_server/app/routes/api/v1/project.py +4 -4
  14. fractal_server/app/routes/api/v1/task.py +2 -2
  15. fractal_server/app/routes/api/v1/task_collection.py +3 -3
  16. fractal_server/app/routes/api/v1/workflow.py +4 -4
  17. fractal_server/app/routes/api/v1/workflowtask.py +1 -1
  18. fractal_server/app/routes/api/v2/_aux_functions.py +2 -2
  19. fractal_server/app/routes/api/v2/dataset.py +10 -0
  20. fractal_server/app/routes/api/v2/job.py +1 -1
  21. fractal_server/app/routes/api/v2/project.py +5 -17
  22. fractal_server/app/routes/api/v2/submit.py +1 -1
  23. fractal_server/app/routes/api/v2/task_collection.py +5 -5
  24. fractal_server/app/routes/api/v2/workflowtask.py +10 -10
  25. fractal_server/app/routes/aux/_job.py +1 -1
  26. fractal_server/app/runner/task_files.py +1 -1
  27. fractal_server/app/runner/v1/__init__.py +4 -4
  28. fractal_server/app/runner/v1/_common.py +2 -2
  29. fractal_server/app/runner/v1/_local/__init__.py +3 -3
  30. fractal_server/app/runner/v2/runner.py +62 -25
  31. fractal_server/app/runner/v2/runner_functions.py +36 -10
  32. fractal_server/app/runner/v2/runner_functions_low_level.py +6 -13
  33. fractal_server/app/runner/v2/task_interface.py +4 -2
  34. fractal_server/app/schemas/__init__.py +0 -3
  35. fractal_server/app/schemas/v1/__init__.py +0 -6
  36. fractal_server/app/schemas/v2/__init__.py +2 -0
  37. fractal_server/app/schemas/v2/dataset.py +5 -0
  38. fractal_server/app/schemas/v2/workflowtask.py +60 -14
  39. fractal_server/images/tools.py +0 -1
  40. fractal_server/migrations/versions/{80e12e1bc4fd_v2.py → 5bf02391cfef_v2.py} +12 -4
  41. fractal_server/tasks/v1/background_operations.py +2 -2
  42. fractal_server/tasks/v2/background_operations.py +2 -2
  43. {fractal_server-2.0.0a10.dist-info → fractal_server-2.0.0a12.dist-info}/METADATA +1 -1
  44. {fractal_server-2.0.0a10.dist-info → fractal_server-2.0.0a12.dist-info}/RECORD +47 -46
  45. {fractal_server-2.0.0a10.dist-info → fractal_server-2.0.0a12.dist-info}/LICENSE +0 -0
  46. {fractal_server-2.0.0a10.dist-info → fractal_server-2.0.0a12.dist-info}/WHEEL +0 -0
  47. {fractal_server-2.0.0a10.dist-info → fractal_server-2.0.0a12.dist-info}/entry_points.txt +0 -0
@@ -1 +1 @@
1
- __VERSION__ = "2.0.0a10"
1
+ __VERSION__ = "2.0.0a12"
@@ -2,6 +2,8 @@
2
2
  `models` module
3
3
  """
4
4
  from .security import * # noqa: F401, F403
5
- from .state import State # noqa: F401
6
- from .v1 import * # noqa: F401, F403
7
- from .v2 import * # noqa: F401, F403
5
+ from .v1 import Project # noqa: F401
6
+ from .v2 import ProjectV2 # noqa: F401
7
+
8
+ # We include the project models to avoid issues with LinkUserProject
9
+ # (sometimes taking place in alembic autogenerate)
@@ -6,6 +6,7 @@ from .dataset import Resource # noqa: F401
6
6
  from .job import ApplyWorkflow # noqa: F403, F401
7
7
  from .job import JobStatusTypeV1 # noqa: F401, F403
8
8
  from .project import Project # noqa: F403, F401
9
+ from .state import State # noqa: F403, F401
9
10
  from .task import Task # noqa: F403, F401
10
11
  from .workflow import Workflow # noqa: F401, F403
11
12
  from .workflow import WorkflowTask # noqa: F401, F403
@@ -8,8 +8,8 @@ from sqlalchemy.types import JSON
8
8
  from sqlmodel import Field
9
9
  from sqlmodel import SQLModel
10
10
 
11
- from ...utils import get_timestamp
12
- from ..schemas.v1 import _StateBase
11
+ from ....utils import get_timestamp
12
+ from ...schemas.state import _StateBase
13
13
 
14
14
 
15
15
  class State(_StateBase, SQLModel, table=True):
@@ -2,6 +2,7 @@
2
2
  v2 `models` module
3
3
  """
4
4
  from ..linkuserproject import LinkUserProjectV2
5
+ from .collection_state import CollectionStateV2
5
6
  from .dataset import DatasetV2
6
7
  from .job import JobV2
7
8
  from .project import ProjectV2
@@ -14,6 +15,7 @@ __all__ = [
14
15
  "DatasetV2",
15
16
  "JobV2",
16
17
  "ProjectV2",
18
+ "CollectionStateV2",
17
19
  "TaskV2",
18
20
  "WorkflowTaskV2",
19
21
  "WorkflowV2",
@@ -0,0 +1,21 @@
1
+ from datetime import datetime
2
+ from typing import Any
3
+ from typing import Optional
4
+
5
+ from sqlalchemy import Column
6
+ from sqlalchemy.types import DateTime
7
+ from sqlalchemy.types import JSON
8
+ from sqlmodel import Field
9
+ from sqlmodel import SQLModel
10
+
11
+ from ....utils import get_timestamp
12
+
13
+
14
+ class CollectionStateV2(SQLModel, table=True):
15
+
16
+ id: Optional[int] = Field(default=None, primary_key=True)
17
+ data: dict[str, Any] = Field(sa_column=Column(JSON), default={})
18
+ timestamp: datetime = Field(
19
+ default_factory=get_timestamp,
20
+ sa_column=Column(DateTime(timezone=True)),
21
+ )
@@ -9,7 +9,7 @@ from sqlmodel import Field
9
9
  from sqlmodel import SQLModel
10
10
 
11
11
  from ....utils import get_timestamp
12
- from ...schemas.v1 import JobStatusTypeV1
12
+ from ...schemas.v2 import JobStatusTypeV2
13
13
 
14
14
 
15
15
  class JobV2(SQLModel, table=True):
@@ -47,5 +47,5 @@ class JobV2(SQLModel, table=True):
47
47
  end_timestamp: Optional[datetime] = Field(
48
48
  default=None, sa_column=Column(DateTime(timezone=True))
49
49
  )
50
- status: str = JobStatusTypeV1.SUBMITTED
50
+ status: str = JobStatusTypeV2.SUBMITTED
51
51
  log: Optional[str] = None
@@ -2,7 +2,6 @@ from typing import Any
2
2
  from typing import Literal
3
3
  from typing import Optional
4
4
 
5
- from pydantic import validator
6
5
  from sqlalchemy import Column
7
6
  from sqlalchemy.types import JSON
8
7
  from sqlmodel import Field
@@ -48,41 +47,3 @@ class WorkflowTaskV2(SQLModel, table=True):
48
47
  task_legacy: Optional[Task] = Relationship(
49
48
  sa_relationship_kwargs=dict(lazy="selectin")
50
49
  )
51
-
52
- @validator("args_non_parallel")
53
- def validate_args_non_parallel(cls, value):
54
- if value is None:
55
- return
56
- forbidden_args_keys = {
57
- "zarr_dir",
58
- "zarr_url",
59
- "zarr_urls",
60
- "init_args",
61
- }
62
- args_keys = set(value.keys())
63
- intersect_keys = forbidden_args_keys.intersection(args_keys)
64
- if intersect_keys:
65
- raise ValueError(
66
- "`args` contains the following forbidden keys: "
67
- f"{intersect_keys}"
68
- )
69
- return value
70
-
71
- @validator("args_parallel")
72
- def validate_args_parallel(cls, value):
73
- if value is None:
74
- return
75
- forbidden_args_keys = {
76
- "zarr_dir",
77
- "zarr_url",
78
- "zarr_urls",
79
- "init_args",
80
- }
81
- args_keys = set(value.keys())
82
- intersect_keys = forbidden_args_keys.intersection(args_keys)
83
- if intersect_keys:
84
- raise ValueError(
85
- "`args` contains the following forbidden keys: "
86
- f"{intersect_keys}"
87
- )
88
- return value
@@ -20,12 +20,12 @@ from ....syringe import Inject
20
20
  from ....utils import get_timestamp
21
21
  from ...db import AsyncSession
22
22
  from ...db import get_async_db
23
- from ...models import ApplyWorkflow
24
- from ...models import Dataset
25
- from ...models import JobStatusTypeV1
26
- from ...models import Project
27
- from ...models import Workflow
28
23
  from ...models.security import UserOAuth as User
24
+ from ...models.v1 import ApplyWorkflow
25
+ from ...models.v1 import Dataset
26
+ from ...models.v1 import JobStatusTypeV1
27
+ from ...models.v1 import Project
28
+ from ...models.v1 import Workflow
29
29
  from ...runner.filenames import WORKFLOW_LOG_FILENAME
30
30
  from ...schemas.v1 import ApplyWorkflowReadV1
31
31
  from ...schemas.v1 import ApplyWorkflowUpdateV1
@@ -20,13 +20,13 @@ from ....syringe import Inject
20
20
  from ....utils import get_timestamp
21
21
  from ...db import AsyncSession
22
22
  from ...db import get_async_db
23
- from ...models import JobStatusTypeV1
24
23
  from ...models.security import UserOAuth as User
25
24
  from ...models.v1 import Task
26
25
  from ...models.v2 import JobV2
27
26
  from ...models.v2 import ProjectV2
28
27
  from ...runner.filenames import WORKFLOW_LOG_FILENAME
29
28
  from ...schemas.v2 import JobReadV2
29
+ from ...schemas.v2 import JobStatusTypeV2
30
30
  from ...schemas.v2 import JobUpdateV2
31
31
  from ...schemas.v2 import ProjectReadV2
32
32
  from ...security import current_active_superuser
@@ -90,7 +90,7 @@ async def view_job(
90
90
  project_id: Optional[int] = None,
91
91
  dataset_id: Optional[int] = None,
92
92
  workflow_id: Optional[int] = None,
93
- status: Optional[JobStatusTypeV1] = None,
93
+ status: Optional[JobStatusTypeV2] = None,
94
94
  start_timestamp_min: Optional[datetime] = None,
95
95
  start_timestamp_max: Optional[datetime] = None,
96
96
  end_timestamp_min: Optional[datetime] = None,
@@ -175,7 +175,7 @@ async def view_single_job(
175
175
  )
176
176
  await db.close()
177
177
 
178
- if show_tmp_logs and (job.status == JobStatusTypeV1.SUBMITTED):
178
+ if show_tmp_logs and (job.status == JobStatusTypeV2.SUBMITTED):
179
179
  try:
180
180
  with open(f"{job.working_dir}/{WORKFLOW_LOG_FILENAME}", "r") as f:
181
181
  job.log = f.read()
@@ -208,7 +208,7 @@ async def update_job(
208
208
  detail=f"Job {job_id} not found",
209
209
  )
210
210
 
211
- if job_update.status != JobStatusTypeV1.FAILED:
211
+ if job_update.status != JobStatusTypeV2.FAILED:
212
212
  raise HTTPException(
213
213
  status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
214
214
  detail=f"Cannot set job status to {job_update.status}",
@@ -12,13 +12,13 @@ from sqlmodel import select
12
12
  from sqlmodel.sql.expression import SelectOfScalar
13
13
 
14
14
  from ....db import AsyncSession
15
- from ....models import ApplyWorkflow
16
- from ....models import Dataset
17
15
  from ....models import LinkUserProject
18
- from ....models import Project
19
- from ....models import Task
20
- from ....models import Workflow
21
- from ....models import WorkflowTask
16
+ from ....models.v1 import ApplyWorkflow
17
+ from ....models.v1 import Dataset
18
+ from ....models.v1 import Project
19
+ from ....models.v1 import Task
20
+ from ....models.v1 import Workflow
21
+ from ....models.v1 import WorkflowTask
22
22
  from ....schemas.v1 import JobStatusTypeV1
23
23
  from ....security import User
24
24
 
@@ -13,10 +13,10 @@ from sqlmodel import select
13
13
 
14
14
  from ....db import AsyncSession
15
15
  from ....db import get_async_db
16
- from ....models import ApplyWorkflow
17
- from ....models import Dataset
18
- from ....models import Project
19
- from ....models import Resource
16
+ from ....models.v1 import ApplyWorkflow
17
+ from ....models.v1 import Dataset
18
+ from ....models.v1 import Project
19
+ from ....models.v1 import Resource
20
20
  from ....runner.filenames import HISTORY_FILENAME
21
21
  from ....schemas.v1 import DatasetCreateV1
22
22
  from ....schemas.v1 import DatasetReadV1
@@ -18,11 +18,11 @@ from .....logger import set_logger
18
18
  from .....syringe import Inject
19
19
  from ....db import AsyncSession
20
20
  from ....db import get_async_db
21
- from ....models import ApplyWorkflow
22
- from ....models import Dataset
23
21
  from ....models import LinkUserProject
24
- from ....models import Project
25
- from ....models import Workflow
22
+ from ....models.v1 import ApplyWorkflow
23
+ from ....models.v1 import Dataset
24
+ from ....models.v1 import Project
25
+ from ....models.v1 import Workflow
26
26
  from ....runner.set_start_and_last_task_index import (
27
27
  set_start_and_last_task_index,
28
28
  )
@@ -11,8 +11,8 @@ from sqlmodel import select
11
11
  from .....logger import set_logger
12
12
  from ....db import AsyncSession
13
13
  from ....db import get_async_db
14
- from ....models import Task
15
- from ....models import WorkflowTask
14
+ from ....models.v1 import Task
15
+ from ....models.v1 import WorkflowTask
16
16
  from ....models.v2 import TaskV2
17
17
  from ....schemas.v1 import TaskCreateV1
18
18
  from ....schemas.v1 import TaskReadV1
@@ -17,9 +17,9 @@ from .....logger import set_logger
17
17
  from .....syringe import Inject
18
18
  from ....db import AsyncSession
19
19
  from ....db import get_async_db
20
- from ....models import State
21
- from ....models import Task
22
- from ....schemas.v1 import StateRead
20
+ from ....models.v1 import State
21
+ from ....models.v1 import Task
22
+ from ....schemas.state import StateRead
23
23
  from ....schemas.v1 import TaskCollectPipV1
24
24
  from ....schemas.v1 import TaskCollectStatusV1
25
25
  from ....security import current_active_user
@@ -23,10 +23,10 @@ from .....logger import close_logger
23
23
  from .....logger import set_logger
24
24
  from ....db import AsyncSession
25
25
  from ....db import get_async_db
26
- from ....models import ApplyWorkflow
27
- from ....models import Project
28
- from ....models import Task
29
- from ....models import Workflow
26
+ from ....models.v1 import ApplyWorkflow
27
+ from ....models.v1 import Project
28
+ from ....models.v1 import Task
29
+ from ....models.v1 import Workflow
30
30
  from ....schemas.v1 import WorkflowCreateV1
31
31
  from ....schemas.v1 import WorkflowExportV1
32
32
  from ....schemas.v1 import WorkflowImportV1
@@ -22,7 +22,7 @@ from fastapi import status
22
22
 
23
23
  from ....db import AsyncSession
24
24
  from ....db import get_async_db
25
- from ....models import Task
25
+ from ....models.v1 import Task
26
26
  from ....schemas.v1 import WorkflowTaskCreateV1
27
27
  from ....schemas.v1 import WorkflowTaskReadV1
28
28
  from ....schemas.v1 import WorkflowTaskUpdateV1
@@ -21,7 +21,7 @@ from ....models.v2 import ProjectV2
21
21
  from ....models.v2 import TaskV2
22
22
  from ....models.v2 import WorkflowTaskV2
23
23
  from ....models.v2 import WorkflowV2
24
- from ....schemas.v1 import JobStatusTypeV1
24
+ from ....schemas.v2 import JobStatusTypeV2
25
25
  from ....security import User
26
26
  from fractal_server.images import Filters
27
27
 
@@ -384,7 +384,7 @@ def _get_submitted_jobs_statement() -> SelectOfScalar:
384
384
  A sqlmodel statement that selects all `Job`s with
385
385
  `Job.status` equal to `submitted`.
386
386
  """
387
- stm = select(JobV2).where(JobV2.status == JobStatusTypeV1.SUBMITTED)
387
+ stm = select(JobV2).where(JobV2.status == JobStatusTypeV2.SUBMITTED)
388
388
  return stm
389
389
 
390
390
 
@@ -270,6 +270,16 @@ async def import_dataset(
270
270
  db=db,
271
271
  )
272
272
 
273
+ for image in dataset.images:
274
+ if not image.zarr_url.startswith(dataset.zarr_dir):
275
+ raise HTTPException(
276
+ status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
277
+ detail=(
278
+ f"Cannot import dataset: zarr_url {image.zarr_url} is not "
279
+ f"relative to zarr_dir={dataset.zarr_dir}."
280
+ ),
281
+ )
282
+
273
283
  # Create new Dataset
274
284
  db_dataset = DatasetV2(
275
285
  project_id=project_id,
@@ -12,7 +12,7 @@ from ....db import AsyncSession
12
12
  from ....db import get_async_db
13
13
  from ....models.v2 import JobV2
14
14
  from ....models.v2 import ProjectV2
15
- from ....runner.filenames import WORKFLOW_LOG_FILENAME # FIXME
15
+ from ....runner.filenames import WORKFLOW_LOG_FILENAME
16
16
  from ....schemas.v2 import JobReadV2
17
17
  from ....schemas.v2 import JobStatusTypeV2
18
18
  from ....security import current_active_user
@@ -5,11 +5,8 @@ from fastapi import Depends
5
5
  from fastapi import HTTPException
6
6
  from fastapi import Response
7
7
  from fastapi import status
8
- from sqlalchemy.exc import IntegrityError
9
8
  from sqlmodel import select
10
9
 
11
- from .....logger import close_logger
12
- from .....logger import set_logger
13
10
  from ....db import AsyncSession
14
11
  from ....db import get_async_db
15
12
  from ....models.v2 import DatasetV2
@@ -65,20 +62,11 @@ async def create_project(
65
62
 
66
63
  db_project = ProjectV2(**project.dict())
67
64
  db_project.user_list.append(user)
68
- try:
69
- db.add(db_project)
70
- await db.commit()
71
- await db.refresh(db_project)
72
- await db.close()
73
- except IntegrityError as e:
74
- await db.rollback()
75
- logger = set_logger("create_project")
76
- logger.error(str(e))
77
- close_logger(logger)
78
- raise HTTPException(
79
- status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
80
- detail=str(e),
81
- )
65
+
66
+ db.add(db_project)
67
+ await db.commit()
68
+ await db.refresh(db_project)
69
+ await db.close()
82
70
 
83
71
  return db_project
84
72
 
@@ -17,7 +17,7 @@ from ....db import get_async_db
17
17
  from ....models.v2 import JobV2
18
18
  from ....runner.set_start_and_last_task_index import (
19
19
  set_start_and_last_task_index,
20
- ) # FIXME V2
20
+ )
21
21
  from ....runner.v2 import submit_workflow
22
22
  from ....schemas.v2 import JobCreateV2
23
23
  from ....schemas.v2 import JobReadV2
@@ -17,9 +17,9 @@ from .....logger import set_logger
17
17
  from .....syringe import Inject
18
18
  from ....db import AsyncSession
19
19
  from ....db import get_async_db
20
- from ....models import State
20
+ from ....models.v2 import CollectionStateV2
21
21
  from ....models.v2 import TaskV2
22
- from ....schemas import StateRead
22
+ from ....schemas.state import StateRead
23
23
  from ....schemas.v2 import TaskCollectPipV2
24
24
  from ....schemas.v2 import TaskCollectStatusV2
25
25
  from ....security import current_active_user
@@ -151,7 +151,7 @@ async def collect_tasks_pip(
151
151
  ),
152
152
  )
153
153
  task_collect_status.info = "Already installed"
154
- state = State(data=task_collect_status.sanitised_dict())
154
+ state = CollectionStateV2(data=task_collect_status.sanitised_dict())
155
155
  response.status_code == status.HTTP_200_OK
156
156
  await db.close()
157
157
  return state
@@ -181,7 +181,7 @@ async def collect_tasks_pip(
181
181
  # Create State object (after casting venv_path to string)
182
182
  collection_status_dict = collection_status.dict()
183
183
  collection_status_dict["venv_path"] = str(collection_status.venv_path)
184
- state = State(data=collection_status_dict)
184
+ state = CollectionStateV2(data=collection_status_dict)
185
185
  db.add(state)
186
186
  await db.commit()
187
187
  await db.refresh(state)
@@ -220,7 +220,7 @@ async def check_collection_status(
220
220
  """
221
221
  logger = set_logger(logger_name="check_collection_status")
222
222
  logger.debug(f"Querying state for state.id={state_id}")
223
- state = await db.get(State, state_id)
223
+ state = await db.get(CollectionStateV2, state_id)
224
224
  if not state:
225
225
  await db.close()
226
226
  raise HTTPException(
@@ -46,6 +46,11 @@ async def create_workflowtask(
46
46
 
47
47
  if new_task.is_legacy_task is True:
48
48
  task = await db.get(Task, task_id)
49
+ if not task:
50
+ raise HTTPException(
51
+ status_code=status.HTTP_404_NOT_FOUND,
52
+ detail=f"Task {task_id} not found.",
53
+ )
49
54
  if not task.is_v2_compatible:
50
55
  raise HTTPException(
51
56
  status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
@@ -53,16 +58,11 @@ async def create_workflowtask(
53
58
  )
54
59
  else:
55
60
  task = await db.get(TaskV2, task_id)
56
-
57
- if not task:
58
- if new_task.is_legacy_task:
59
- error = f"Task {task_id} not found."
60
- else:
61
- error = f"TaskV2 {task_id} not found."
62
-
63
- raise HTTPException(
64
- status_code=status.HTTP_404_NOT_FOUND, detail=error
65
- )
61
+ if not task:
62
+ raise HTTPException(
63
+ status_code=status.HTTP_404_NOT_FOUND,
64
+ detail=f"TaskV2 {task_id} not found.",
65
+ )
66
66
 
67
67
  if new_task.is_legacy_task is True or task.type == "parallel":
68
68
  if (
@@ -3,7 +3,7 @@ from pathlib import Path
3
3
  from zipfile import ZIP_DEFLATED
4
4
  from zipfile import ZipFile
5
5
 
6
- from ...models import ApplyWorkflow
6
+ from ...models.v1 import ApplyWorkflow
7
7
  from ...runner.filenames import SHUTDOWN_FILENAME
8
8
 
9
9
 
@@ -42,7 +42,7 @@ class TaskFiles:
42
42
  workflow_dir: Path
43
43
  workflow_dir_user: Path
44
44
  task_order: Optional[int] = None
45
- component: Optional[str] = None # FIXME: this is actually for V1 only
45
+ component: Optional[str] = None
46
46
 
47
47
  file_prefix: str
48
48
  args: Path
@@ -26,10 +26,10 @@ from ....logger import set_logger
26
26
  from ....syringe import Inject
27
27
  from ....utils import get_timestamp
28
28
  from ...db import DB
29
- from ...models import ApplyWorkflow
30
- from ...models import Dataset
31
- from ...models import Workflow
32
- from ...models import WorkflowTask
29
+ from ...models.v1 import ApplyWorkflow
30
+ from ...models.v1 import Dataset
31
+ from ...models.v1 import Workflow
32
+ from ...models.v1 import WorkflowTask
33
33
  from ...schemas.v1 import JobStatusTypeV1
34
34
  from ..exceptions import JobExecutionError
35
35
  from ..exceptions import TaskExecutionError
@@ -21,8 +21,8 @@ from typing import Optional
21
21
  from ....config import get_settings
22
22
  from ....logger import get_logger
23
23
  from ....syringe import Inject
24
- from ...models import Task
25
- from ...models import WorkflowTask
24
+ from ...models.v1 import Task
25
+ from ...models.v1 import WorkflowTask
26
26
  from ...schemas.v1 import WorkflowTaskStatusTypeV1
27
27
  from ..exceptions import JobExecutionError
28
28
  from ..exceptions import TaskExecutionError
@@ -23,11 +23,11 @@ from pathlib import Path
23
23
  from typing import Any
24
24
  from typing import Optional
25
25
 
26
- from ....models import Workflow # FIXME: this is v1 specific
26
+ from ....models.v1 import Workflow
27
27
  from ...async_wrap import async_wrap
28
28
  from ...set_start_and_last_task_index import set_start_and_last_task_index
29
- from .._common import execute_tasks # FIXME: this is v1 specific
30
- from ..common import TaskParameters # FIXME: this is v1 specific
29
+ from .._common import execute_tasks
30
+ from ..common import TaskParameters
31
31
  from ._submit_setup import _local_submit_setup
32
32
  from .executor import FractalThreadPoolExecutor
33
33