fractal-server 1.4.2a5__py3-none-any.whl → 1.4.3a0__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__ = "1.4.2a5"
1
+ __VERSION__ = "1.4.3a0"
@@ -1,13 +1,16 @@
1
+ from datetime import datetime
1
2
  from typing import Any
2
3
  from typing import Optional
3
4
 
4
5
  from sqlalchemy import Column
5
6
  from sqlalchemy.ext.orderinglist import ordering_list
7
+ from sqlalchemy.types import DateTime
6
8
  from sqlalchemy.types import JSON
7
9
  from sqlmodel import Field
8
10
  from sqlmodel import Relationship
9
11
  from sqlmodel import SQLModel
10
12
 
13
+ from ...utils import get_timestamp
11
14
  from ..schemas.dataset import _DatasetBase
12
15
  from ..schemas.dataset import _ResourceBase
13
16
 
@@ -55,6 +58,11 @@ class Dataset(_DatasetBase, SQLModel, table=True):
55
58
  sa_column=Column(JSON, server_default="[]", nullable=False)
56
59
  )
57
60
 
61
+ timestamp_created: datetime = Field(
62
+ default_factory=get_timestamp,
63
+ sa_column=Column(DateTime(timezone=True), nullable=False),
64
+ )
65
+
58
66
  class Config:
59
67
  arbitrary_types_allowed = True
60
68
 
@@ -1,3 +1,4 @@
1
+ from datetime import datetime
1
2
  from typing import Any
2
3
  from typing import Optional
3
4
  from typing import Union
@@ -5,12 +6,13 @@ from typing import Union
5
6
  from pydantic import validator
6
7
  from sqlalchemy import Column
7
8
  from sqlalchemy.ext.orderinglist import ordering_list
9
+ from sqlalchemy.types import DateTime
8
10
  from sqlalchemy.types import JSON
9
11
  from sqlmodel import Field
10
12
  from sqlmodel import Relationship
11
13
  from sqlmodel import SQLModel
12
14
 
13
- from ..db import AsyncSession
15
+ from ...utils import get_timestamp
14
16
  from ..schemas.workflow import _WorkflowBase
15
17
  from ..schemas.workflow import _WorkflowTaskBase
16
18
  from .task import Task
@@ -49,8 +51,8 @@ class WorkflowTask(_WorkflowTaskBase, SQLModel, table=True):
49
51
 
50
52
  id: Optional[int] = Field(default=None, primary_key=True)
51
53
 
52
- workflow_id: Optional[int] = Field(foreign_key="workflow.id")
53
- task_id: Optional[int] = Field(foreign_key="task.id")
54
+ workflow_id: int = Field(foreign_key="workflow.id")
55
+ task_id: int = Field(foreign_key="task.id")
54
56
  order: Optional[int]
55
57
  meta: Optional[dict[str, Any]] = Field(sa_column=Column(JSON))
56
58
  args: Optional[dict[str, Any]] = Field(sa_column=Column(JSON))
@@ -117,58 +119,10 @@ class Workflow(_WorkflowBase, SQLModel, table=True):
117
119
  cascade="all, delete-orphan",
118
120
  ),
119
121
  )
120
-
121
- async def insert_task(
122
- self,
123
- task_id: int,
124
- *,
125
- args: Optional[dict[str, Any]] = None,
126
- meta: Optional[dict[str, Any]] = None,
127
- order: Optional[int] = None,
128
- db: AsyncSession,
129
- commit: bool = True,
130
- ) -> WorkflowTask:
131
- """
132
- Insert a new WorkflowTask into Workflow.task_list
133
-
134
- Args:
135
- task_id: TBD
136
- args: TBD
137
- meta: TBD
138
- order: TBD
139
- db: TBD
140
- commit: TBD
141
- """
142
- if order is None:
143
- order = len(self.task_list)
144
-
145
- # Get task from db, and extract default arguments via a Task property
146
- # method
147
- db_task = await db.get(Task, task_id)
148
- default_args = db_task.default_args_from_args_schema
149
- # Override default_args with args
150
- actual_args = default_args.copy()
151
- if args is not None:
152
- for k, v in args.items():
153
- actual_args[k] = v
154
- if not actual_args:
155
- actual_args = None
156
-
157
- # Combine meta (higher priority) and db_task.meta (lower priority)
158
- wt_meta = (db_task.meta or {}).copy()
159
- wt_meta.update(meta or {})
160
- if not wt_meta:
161
- wt_meta = None
162
-
163
- # Create DB entry
164
- wf_task = WorkflowTask(task_id=task_id, args=actual_args, meta=wt_meta)
165
- db.add(wf_task)
166
- self.task_list.insert(order, wf_task)
167
- self.task_list.reorder() # type: ignore
168
- if commit:
169
- await db.commit()
170
- await db.refresh(wf_task)
171
- return wf_task
122
+ timestamp_created: datetime = Field(
123
+ default_factory=get_timestamp,
124
+ sa_column=Column(DateTime(timezone=True), nullable=False),
125
+ )
172
126
 
173
127
  @property
174
128
  def input_type(self):
@@ -1,7 +1,9 @@
1
1
  """
2
2
  Auxiliary functions to get object from the database or perform simple checks
3
3
  """
4
+ from typing import Any
4
5
  from typing import Literal
6
+ from typing import Optional
5
7
  from typing import Union
6
8
 
7
9
  from fastapi import HTTPException
@@ -378,3 +380,62 @@ def _get_active_jobs_statement() -> SelectOfScalar:
378
380
  )
379
381
  )
380
382
  return stm
383
+
384
+
385
+ async def _workflow_insert_task(
386
+ *,
387
+ workflow_id: int,
388
+ task_id: int,
389
+ args: Optional[dict[str, Any]] = None,
390
+ meta: Optional[dict[str, Any]] = None,
391
+ order: Optional[int] = None,
392
+ db: AsyncSession,
393
+ ) -> WorkflowTask:
394
+ """
395
+ Insert a new WorkflowTask into Workflow.task_list
396
+
397
+ Args:
398
+ task_id: TBD
399
+ args: TBD
400
+ meta: TBD
401
+ order: TBD
402
+ db: TBD
403
+ commit: TBD
404
+ """
405
+ db_workflow = await db.get(Workflow, workflow_id)
406
+ if db_workflow is None:
407
+ raise ValueError(f"Workflow {workflow_id} does not exist")
408
+
409
+ if order is None:
410
+ order = len(db_workflow.task_list)
411
+
412
+ # Get task from db, and extract default arguments via a Task property
413
+ # method
414
+ db_task = await db.get(Task, task_id)
415
+ if db_task is None:
416
+ raise ValueError(f"Task {task_id} does not exist")
417
+
418
+ default_args = db_task.default_args_from_args_schema
419
+ # Override default_args with args
420
+ actual_args = default_args.copy()
421
+ if args is not None:
422
+ for k, v in args.items():
423
+ actual_args[k] = v
424
+ if not actual_args:
425
+ actual_args = None
426
+
427
+ # Combine meta (higher priority) and db_task.meta (lower priority)
428
+ wt_meta = (db_task.meta or {}).copy()
429
+ wt_meta.update(meta or {})
430
+ if not wt_meta:
431
+ wt_meta = None
432
+
433
+ # Create DB entry
434
+ wf_task = WorkflowTask(task_id=task_id, args=actual_args, meta=wt_meta)
435
+ db.add(wf_task)
436
+ db_workflow.task_list.insert(order, wf_task)
437
+ db_workflow.task_list.reorder() # type: ignore
438
+ await db.commit()
439
+ await db.refresh(wf_task)
440
+
441
+ return wf_task
@@ -1,4 +1,3 @@
1
- import json
2
1
  from typing import Optional
3
2
 
4
3
  from fastapi import APIRouter
@@ -395,31 +394,40 @@ async def apply_workflow(
395
394
  workflow_id=workflow_id,
396
395
  user_email=user.email,
397
396
  input_dataset_dump=dict(
398
- input_dataset.model_dump(exclude={"resource_list"}),
397
+ **input_dataset.model_dump(
398
+ exclude={"resource_list", "timestamp_created"}
399
+ ),
400
+ timestamp_created=str(input_dataset.timestamp_created),
399
401
  resource_list=[
400
402
  resource.model_dump()
401
403
  for resource in input_dataset.resource_list
402
404
  ],
403
405
  ),
404
406
  output_dataset_dump=dict(
405
- output_dataset.model_dump(exclude={"resource_list"}),
407
+ **output_dataset.model_dump(
408
+ exclude={"resource_list", "timestamp_created"}
409
+ ),
410
+ timestamp_created=str(output_dataset.timestamp_created),
406
411
  resource_list=[
407
412
  resource.model_dump()
408
413
  for resource in output_dataset.resource_list
409
414
  ],
410
415
  ),
411
416
  workflow_dump=dict(
412
- workflow.model_dump(exclude={"task_list"}),
417
+ **workflow.model_dump(exclude={"task_list", "timestamp_created"}),
418
+ timestamp_created=str(workflow.timestamp_created),
413
419
  task_list=[
414
420
  dict(
415
- wf_task.model_dump(exclude={"task"}),
421
+ **wf_task.model_dump(exclude={"task"}),
416
422
  task=wf_task.task.model_dump(),
417
423
  )
418
424
  for wf_task in workflow.task_list
419
425
  ],
420
426
  ),
421
- # we use (project.json + json.loads) to serialize datetime
422
- project_dump=json.loads(project.json(exclude={"user_list"})),
427
+ project_dump=dict(
428
+ **project.model_dump(exclude={"user_list", "timestamp_created"}),
429
+ timestamp_created=str(project.timestamp_created),
430
+ ),
423
431
  **apply_workflow.dict(),
424
432
  )
425
433
  db.add(job)
@@ -39,6 +39,7 @@ from ._aux_functions import _check_workflow_exists
39
39
  from ._aux_functions import _get_active_jobs_statement
40
40
  from ._aux_functions import _get_project_check_owner
41
41
  from ._aux_functions import _get_workflow_check_owner
42
+ from ._aux_functions import _workflow_insert_task
42
43
 
43
44
 
44
45
  router = APIRouter()
@@ -323,8 +324,9 @@ async def import_workflow(
323
324
  **wf_task.dict(exclude_none=True),
324
325
  )
325
326
  # Insert task
326
- await db_workflow.insert_task(
327
+ await _workflow_insert_task(
327
328
  **new_wf_task.dict(),
329
+ workflow_id=db_workflow.id,
328
330
  task_id=task_id,
329
331
  db=db,
330
332
  )
@@ -30,6 +30,7 @@ from ....security import current_active_user
30
30
  from ....security import User
31
31
  from ._aux_functions import _get_workflow_check_owner
32
32
  from ._aux_functions import _get_workflow_task_check_owner
33
+ from ._aux_functions import _workflow_insert_task
33
34
 
34
35
  router = APIRouter()
35
36
 
@@ -64,8 +65,9 @@ async def create_workflowtask(
64
65
  )
65
66
 
66
67
  async with db:
67
- workflow_task = await workflow.insert_task(
68
+ workflow_task = await _workflow_insert_task(
68
69
  **new_task.dict(),
70
+ workflow_id=workflow.id,
69
71
  task_id=task_id,
70
72
  db=db,
71
73
  )
@@ -135,15 +135,15 @@ class ApplyWorkflowRead(_ApplyWorkflowBase):
135
135
 
136
136
  id: int
137
137
  project_id: Optional[int]
138
- project_dump: Optional[ProjectDump]
138
+ project_dump: ProjectDump
139
139
  user_email: str
140
140
  slurm_account: Optional[str]
141
141
  workflow_id: Optional[int]
142
- workflow_dump: Optional[WorkflowDump]
142
+ workflow_dump: WorkflowDump
143
143
  input_dataset_id: Optional[int]
144
- input_dataset_dump: Optional[DatasetDump]
144
+ input_dataset_dump: DatasetDump
145
145
  output_dataset_id: Optional[int]
146
- output_dataset_dump: Optional[DatasetDump]
146
+ output_dataset_dump: DatasetDump
147
147
  start_timestamp: datetime
148
148
  end_timestamp: Optional[datetime]
149
149
  status: str
@@ -1,3 +1,4 @@
1
+ from datetime import datetime
1
2
  from typing import Any
2
3
  from typing import Optional
3
4
 
@@ -147,6 +148,7 @@ class DatasetRead(_DatasetBase):
147
148
  project_id: int
148
149
  read_only: bool
149
150
  project: ProjectRead
151
+ timestamp_created: datetime
150
152
 
151
153
 
152
154
  class DatasetStatusRead(BaseModel):
@@ -46,6 +46,7 @@ class WorkflowDump(BaseModel):
46
46
  name: str
47
47
  project_id: int
48
48
  task_list: list[WorkflowTaskDump]
49
+ timestamp_created: str
49
50
 
50
51
 
51
52
  class ResourceDump(BaseModel):
@@ -61,3 +62,4 @@ class DatasetDump(BaseModel):
61
62
  read_only: bool
62
63
  resource_list: list[ResourceDump]
63
64
  project_id: int
65
+ timestamp_created: str
@@ -118,9 +118,13 @@ class UserCreate(schemas.BaseUserCreate):
118
118
 
119
119
  # Validators
120
120
 
121
- _slurm_accounts = validator("slurm_accounts", allow_reuse=True)(
122
- val_unique_list("slurm_accounts")
123
- )
121
+ @validator("slurm_accounts")
122
+ def slurm_accounts_validator(cls, value):
123
+ for i, element in enumerate(value):
124
+ value[i] = valstr(attribute=f"slurm_accounts[{i}]")(element)
125
+ val_unique_list("slurm_accounts")(value)
126
+ return value
127
+
124
128
  _slurm_user = validator("slurm_user", allow_reuse=True)(
125
129
  valstr("slurm_user")
126
130
  )
@@ -1,3 +1,4 @@
1
+ from datetime import datetime
1
2
  from enum import Enum
2
3
  from typing import Any
3
4
  from typing import Optional
@@ -131,6 +132,7 @@ class WorkflowRead(_WorkflowBase):
131
132
  project_id: int
132
133
  task_list: list[WorkflowTaskRead]
133
134
  project: ProjectRead
135
+ timestamp_created: datetime
134
136
 
135
137
 
136
138
  class WorkflowCreate(_WorkflowBase):
@@ -0,0 +1,42 @@
1
+ """WorkflowTask foreign keys not nullables
2
+
3
+ Revision ID: 4cedeb448a53
4
+ Revises: efa89c30e0a4
5
+ Create Date: 2024-01-16 13:57:47.891931
6
+
7
+ """
8
+ import sqlalchemy as sa
9
+ from alembic import op
10
+
11
+
12
+ # revision identifiers, used by Alembic.
13
+ revision = "4cedeb448a53"
14
+ down_revision = "efa89c30e0a4"
15
+ branch_labels = None
16
+ depends_on = None
17
+
18
+
19
+ def upgrade() -> None:
20
+ # ### commands auto generated by Alembic - please adjust! ###
21
+ with op.batch_alter_table("workflowtask", schema=None) as batch_op:
22
+ batch_op.alter_column(
23
+ "workflow_id", existing_type=sa.INTEGER(), nullable=False
24
+ )
25
+ batch_op.alter_column(
26
+ "task_id", existing_type=sa.INTEGER(), nullable=False
27
+ )
28
+
29
+ # ### end Alembic commands ###
30
+
31
+
32
+ def downgrade() -> None:
33
+ # ### commands auto generated by Alembic - please adjust! ###
34
+ with op.batch_alter_table("workflowtask", schema=None) as batch_op:
35
+ batch_op.alter_column(
36
+ "task_id", existing_type=sa.INTEGER(), nullable=True
37
+ )
38
+ batch_op.alter_column(
39
+ "workflow_id", existing_type=sa.INTEGER(), nullable=True
40
+ )
41
+
42
+ # ### end Alembic commands ###
@@ -0,0 +1,60 @@
1
+ """add Workflow.timestamp_created and Dataset.timestamp_created
2
+
3
+ Revision ID: 9fd26a2b0de4
4
+ Revises: efa89c30e0a4
5
+ Create Date: 2024-01-11 09:31:20.950090
6
+
7
+ """
8
+ from datetime import datetime
9
+ from datetime import timezone
10
+
11
+ import sqlalchemy as sa
12
+ from alembic import op
13
+
14
+
15
+ # revision identifiers, used by Alembic.
16
+ revision = "9fd26a2b0de4"
17
+ down_revision = "4cedeb448a53"
18
+ branch_labels = None
19
+ depends_on = None
20
+
21
+
22
+ def upgrade() -> None:
23
+ # ### commands auto generated by Alembic - please adjust! ###
24
+ with op.batch_alter_table("workflow", schema=None) as batch_op:
25
+ batch_op.add_column(
26
+ sa.Column(
27
+ "timestamp_created",
28
+ sa.DateTime(timezone=True),
29
+ nullable=False,
30
+ server_default=str(datetime(2000, 1, 1, tzinfo=timezone.utc)),
31
+ )
32
+ )
33
+
34
+ with op.batch_alter_table("workflow", schema=None) as batch_op:
35
+ batch_op.alter_column("timestamp_created", server_default=None)
36
+
37
+ with op.batch_alter_table("dataset", schema=None) as batch_op:
38
+ batch_op.add_column(
39
+ sa.Column(
40
+ "timestamp_created",
41
+ sa.DateTime(timezone=True),
42
+ nullable=False,
43
+ server_default=str(datetime(2000, 1, 1, tzinfo=timezone.utc)),
44
+ )
45
+ )
46
+
47
+ with op.batch_alter_table("dataset", schema=None) as batch_op:
48
+ batch_op.alter_column("timestamp_created", server_default=None)
49
+ # ### end Alembic commands ###
50
+
51
+
52
+ def downgrade() -> None:
53
+ # ### commands auto generated by Alembic - please adjust! ###
54
+ with op.batch_alter_table("dataset", schema=None) as batch_op:
55
+ batch_op.drop_column("timestamp_created")
56
+
57
+ with op.batch_alter_table("workflow", schema=None) as batch_op:
58
+ batch_op.drop_column("timestamp_created")
59
+
60
+ # ### end Alembic commands ###
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fractal-server
3
- Version: 1.4.2a5
3
+ Version: 1.4.3a0
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
@@ -27,7 +27,7 @@ Requires-Dist: fastapi-users[oauth] (>=12.1.0,<13.0.0)
27
27
  Requires-Dist: gunicorn (>=20.1.0,<21.0.0) ; extra == "gunicorn"
28
28
  Requires-Dist: psycopg2 (>=2.9.5,<3.0.0) ; extra == "postgres"
29
29
  Requires-Dist: pydantic (>=1.10.8,<2)
30
- Requires-Dist: python-dotenv (>=0.20.0,<0.21.0)
30
+ Requires-Dist: python-dotenv (>=0.21.0,<0.22.0)
31
31
  Requires-Dist: sqlalchemy[asyncio] (>=2.0.23,<2.1)
32
32
  Requires-Dist: sqlmodel (>=0.0.14,<0.0.15)
33
33
  Requires-Dist: uvicorn (>=0.20.0,<0.21.0)
@@ -1,29 +1,29 @@
1
- fractal_server/__init__.py,sha256=RB03RZbzzLjGh6kFHgvS1wbV4b8S1zkIn7CMd8H3BLg,24
1
+ fractal_server/__init__.py,sha256=c7VnyctolFPHRpW0iJqGeGZ7qOEUv4CzGL4vKUeJoKI,24
2
2
  fractal_server/__main__.py,sha256=znijcImbcEC4P26ICOhEJ9VY3_5vWdMwQcl-WP25sYA,2202
3
3
  fractal_server/alembic.ini,sha256=MWwi7GzjzawI9cCAK1LW7NxIBQDUqD12-ptJoq5JpP0,3153
4
4
  fractal_server/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  fractal_server/app/db/__init__.py,sha256=OIio0fPE35xC5V9Vom_25-NmUz_vuZNmlJnDZpp1ZnM,3742
6
6
  fractal_server/app/models/__init__.py,sha256=RuxWH8fsmkTWsjLhYjrxSt-mvk74coCilAQlX2Q6OO0,353
7
- fractal_server/app/models/dataset.py,sha256=0LRXXS1mGrEZL1KnC1OEQv7I5gwVNCrihR50xvzyoyE,1743
7
+ fractal_server/app/models/dataset.py,sha256=nydU9syGVXSVuj3sTsVXIiU2vhTUrdwcUZipM-p00GY,2000
8
8
  fractal_server/app/models/job.py,sha256=t0O9EKGQO4aPuTtc_N9SzLF2vrc-pevjsHumLeCPvM8,3287
9
9
  fractal_server/app/models/linkuserproject.py,sha256=RVtl25Q_N99uoVDE7wx0IN0SgFjc7Id5XbScsgrjv_E,309
10
10
  fractal_server/app/models/project.py,sha256=lK2CObOto_ozeNQ0gzHiioqaMIavCc-Zh_GE8yWbBTQ,848
11
11
  fractal_server/app/models/security.py,sha256=Lvf1Z50oQneDSJeJxYjQcmNTJHAb64EW3hnjfu_ahUY,3135
12
12
  fractal_server/app/models/state.py,sha256=rSTjYPfPZntEfdQudKp6yu5vsdyfHA7nMYNRIBWsiAQ,1087
13
13
  fractal_server/app/models/task.py,sha256=APndtea9A7EF7TtpVK8kWapBM01a6nk3FFCrQbbioI8,2632
14
- fractal_server/app/models/workflow.py,sha256=OHLdl-axcgerRDNpqcu8m_p9UVwGeVij7G9-QFLa_3Q,5302
14
+ fractal_server/app/models/workflow.py,sha256=B6v3qqNDb6hvAyDN63n5vkemNueR2aH6zpwSGLlcRNE,3933
15
15
  fractal_server/app/routes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
16
  fractal_server/app/routes/admin.py,sha256=71I4alHKObLWfhoRJ_6wtCuGepsdaqBEyOkaRjmaoZg,10272
17
17
  fractal_server/app/routes/api/__init__.py,sha256=EVyZrEq3I_1643QGTPCC5lgCp4xH_auYbrFfogTm4pc,315
18
18
  fractal_server/app/routes/api/v1/__init__.py,sha256=V4nhYyMIqhlJxbotLTYikq_ghb6KID0ZKOOYaOq7C-g,944
19
- fractal_server/app/routes/api/v1/_aux_functions.py,sha256=QtJRQioeQtcYEOAcOG7YSbg6FiHeG_bdA_w4ppt0ISc,10358
19
+ fractal_server/app/routes/api/v1/_aux_functions.py,sha256=_kbJprGMsAFvg982L0WEwY5seJ5LR323ClX1ogRidWI,12027
20
20
  fractal_server/app/routes/api/v1/dataset.py,sha256=W1bNCt4ZEIcL0aTSizTQlxskmQp01k0G8bV1neFDows,16196
21
21
  fractal_server/app/routes/api/v1/job.py,sha256=5WpqEZ31Kl4ZyU5Ws1Y0ySy1Jk7-TDsIMKIQvD9BwI8,4740
22
- fractal_server/app/routes/api/v1/project.py,sha256=NgPYIMxgHcJueVXMuLClMVBpLmlhsydZpyCus0snba8,14059
22
+ fractal_server/app/routes/api/v1/project.py,sha256=hT_qa0JHQVP9xD_QJH7EQmWSrdE_wlg4ZaC1A2VyXis,14419
23
23
  fractal_server/app/routes/api/v1/task.py,sha256=ZSw6aXe0NjO02x2k8X6-ZN3eM_V7Ec-NduY52G-ypXI,5576
24
24
  fractal_server/app/routes/api/v1/task_collection.py,sha256=7-kdQ07ByDwEjQCDhF0LPufqMixmlKhLvb9X63AVBf0,11864
25
- fractal_server/app/routes/api/v1/workflow.py,sha256=PPwJGgCvb8P55GEE5SUHD0_3wex4_uUGzcCV6SiFEKE,10739
26
- fractal_server/app/routes/api/v1/workflowtask.py,sha256=ZXmZBymcQgt838Bywoxcy6M0l1z2uatHJxq_e45-8T0,5432
25
+ fractal_server/app/routes/api/v1/workflow.py,sha256=nWmNykN_CuNINoi-FDIVh5S9mI6Pdst7mLQDMvvriH4,10831
26
+ fractal_server/app/routes/api/v1/workflowtask.py,sha256=nf15BmyJYfJGX4s2Z_RSxLzqmrymgkLNuFrlhLW1nwA,5520
27
27
  fractal_server/app/routes/auth.py,sha256=aBR0ZICrbJpOgPO972HN5lJ1YqfkrO0avwdrSRvI9aQ,4873
28
28
  fractal_server/app/routes/aux/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
29
  fractal_server/app/routes/aux/_job.py,sha256=whx2G9PCCt-Hw_lgsZa1ECQlhDKNq4eHvwqgpgvBgwg,1246
@@ -48,17 +48,17 @@ fractal_server/app/runner/common.py,sha256=nz0ZuIro0iwZm-OV-e-Y-PrtgKcLK0d7Brzeb
48
48
  fractal_server/app/runner/handle_failed_job.py,sha256=Kov_Ha1rcPNdoLuQx8Dq4fz7s2naR25ce4oQaUy-7TI,4653
49
49
  fractal_server/app/schemas/__init__.py,sha256=tTUrAQ492v_w7Ab_oa2dq3pMjcmROaBJRg-9bt6mGEk,1969
50
50
  fractal_server/app/schemas/_validators.py,sha256=dsLMEZ3fdY3NGFodeKdWPizsf1Ifxoz1oGL2_FVYBiE,2114
51
- fractal_server/app/schemas/applyworkflow.py,sha256=AtFNfOBUdUPcsrglhcDTja0Sm3Rhu-_esDp_IJZyU78,4246
52
- fractal_server/app/schemas/dataset.py,sha256=dHgcumJN_d8h625f4bsFgTMJDRw_NLXFAFnXXbeGxCQ,3163
53
- fractal_server/app/schemas/dumps.py,sha256=AMKM5CSWY10ecf9QdLtKAJMe6MOS84qaffboyI-p8b8,1242
51
+ fractal_server/app/schemas/applyworkflow.py,sha256=s3-B_18nu0JTlxMbfqgUMYORUKye50pPJIBdkIeniGA,4206
52
+ fractal_server/app/schemas/dataset.py,sha256=Qgkn_qDI4FRfKRvRF-IzxKSqbzspkGX1M1kN3lFb9Ec,3225
53
+ fractal_server/app/schemas/dumps.py,sha256=GPeTeg2yoQCPgaQoj_jHA8Lnt1fL_j4QBOb0IKH0lv8,1296
54
54
  fractal_server/app/schemas/json_schemas/manifest.json,sha256=yXYKHbYXPYSkSXMTLfTpfCUGBtmQuPTk1xuSXscdba4,1787
55
55
  fractal_server/app/schemas/manifest.py,sha256=xxTd39dAXMK9Ox1y-p3gbyg0zd5udW99pV4JngCUGwM,3819
56
56
  fractal_server/app/schemas/project.py,sha256=zAOWyr6UVqyCn6UOAt7Ulx8J7b7IEsp2cCBN_UyNxdc,1046
57
57
  fractal_server/app/schemas/state.py,sha256=cBco_ViYRvlbWjoeycHAQyADGuiebIntJjf6xdbyod8,549
58
58
  fractal_server/app/schemas/task.py,sha256=2TBE5Ne9tO_-a2-Es0PRXMT8ZddSInTOPMor7u8-gx0,3671
59
59
  fractal_server/app/schemas/task_collection.py,sha256=DPdBPL96e1q88pZeXmjd7e7iRZ_xPkYI_npF4sekF6o,3158
60
- fractal_server/app/schemas/user.py,sha256=cUvvmcoLEMRGj21S8WsaUaBM7UC9gjwmodh_V3s_IdM,2963
61
- fractal_server/app/schemas/workflow.py,sha256=GkPPfn7n2dxktXgj-O2YfgHptpnXWsBQs5OrxxCXzto,4312
60
+ fractal_server/app/schemas/user.py,sha256=rE8WgBz-ceVUs0Sz2ZwcjUrSTZTnS0ys5SBtD2XD9r8,3113
61
+ fractal_server/app/schemas/workflow.py,sha256=DKKsKVMwUeZXjLEMviLvPKhNgSya9GKt5rOMS6oJEC0,4374
62
62
  fractal_server/app/security/__init__.py,sha256=d1BjGxz0FWZO6p6TVUt78aprvpzLFnQsstIrW55JPcY,11185
63
63
  fractal_server/config.py,sha256=2HB74iFQV4MDH7Ub66uke532G6YoyBWmLYfbfYApJqc,14457
64
64
  fractal_server/logger.py,sha256=keri8i960WHT8Zz9Rm2MwfnrA2dw9TsrfCmojqtGDLs,4562
@@ -67,6 +67,7 @@ fractal_server/migrations/README,sha256=4rQvyDfqodGhpJw74VYijRmgFP49ji5chyEemWGH
67
67
  fractal_server/migrations/env.py,sha256=05EoWw0p43ojTNiz7UVG4lsl057B4ImSgXiHmiU-M80,2690
68
68
  fractal_server/migrations/script.py.mako,sha256=oMXw9LC3zRbinWWPPDgeZ4z9FJrV2zhRWiYdS5YgNbI,526
69
69
  fractal_server/migrations/versions/4c308bcaea2b_add_task_args_schema_and_task_args_.py,sha256=-wHe-fOffmYeAm0JXVl_lxZ7hhDkaEVqxgxpHkb_uL8,954
70
+ fractal_server/migrations/versions/4cedeb448a53_workflowtask_foreign_keys_not_nullables.py,sha256=Mob8McGYAcmgvrseyyYOa54E6Gsgr-4SiGdC-r9O4_A,1157
70
71
  fractal_server/migrations/versions/50a13d6138fd_initial_schema.py,sha256=zwXegXs9J40eyCWi3w0c_iIBVJjXNn4VdVnQaT3KxDg,8770
71
72
  fractal_server/migrations/versions/70e77f1c38b0_add_applyworkflow_first_task_index_and_.py,sha256=Q-DsMzG3IcUV2Ol1dhJWosDvKERamBE6QvA2zzS5zpQ,1632
72
73
  fractal_server/migrations/versions/71eefd1dd202_add_slurm_accounts.py,sha256=mbWuCkTpRAdGbRhW7lhXs_e5S6O37UAcCN6JfoY5H8A,1353
@@ -74,6 +75,7 @@ fractal_server/migrations/versions/84bf0fffde30_add_dumps_to_applyworkflow.py,sh
74
75
  fractal_server/migrations/versions/8f79bd162e35_add_docs_info_and_docs_link_to_task_.py,sha256=6pgODDtyAxevZvAJBj9IJ41inhV1RpwbpZr_qfPPu1A,1115
75
76
  fractal_server/migrations/versions/97f444d47249_add_applyworkflow_project_dump.py,sha256=eKTZm3EgUgapXBxO0RuHkEfTKic-TZG3ADaMpGLuc0k,1057
76
77
  fractal_server/migrations/versions/99ea79d9e5d2_add_dataset_history.py,sha256=0im6TxDr53sKKcjiPgeH4ftVRGnRXZSh2lPbRQ1Ir9w,883
78
+ fractal_server/migrations/versions/9fd26a2b0de4_add_workflow_timestamp_created.py,sha256=4l1AHGUsa0ONoJVZlr3fTXw_xbbQ8O7wlD92Az2aRfM,1849
77
79
  fractal_server/migrations/versions/a7f4d6137b53_add_workflow_dump_to_applyworkflow.py,sha256=ekDUML7ILpmdoqEclKbEUdyLi4uw9HSG_sTjG2hp_JE,867
78
80
  fractal_server/migrations/versions/d4fe3708d309_make_applyworkflow_workflow_dump_non_.py,sha256=6cHEZFuTXiQg9yu32Y3RH1XAl71av141WQ6UMbiITIg,949
79
81
  fractal_server/migrations/versions/e75cac726012_make_applyworkflow_start_timestamp_not_.py,sha256=lOggSvzGWqQvnxxFuSM6W50Ui49R918A-uBuiZJ0pNM,963
@@ -84,8 +86,8 @@ fractal_server/syringe.py,sha256=3qSMW3YaMKKnLdgnooAINOPxnCOxP7y2jeAQYB21Gdo,278
84
86
  fractal_server/tasks/__init__.py,sha256=Wzuxf5EoH1v0fYzRpAZHG_S-Z9f6DmbIsuSvllBCGvc,72
85
87
  fractal_server/tasks/collection.py,sha256=POKvQyS5G5ySybH0r0v21I_ZQ5AREe9kAqr_uFfGyaU,17627
86
88
  fractal_server/utils.py,sha256=b7WwFdcFZ8unyT65mloFToYuEDXpQoHRcmRNqrhd_dQ,2115
87
- fractal_server-1.4.2a5.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
88
- fractal_server-1.4.2a5.dist-info/METADATA,sha256=otlWARfdAvQXOj74fhRlGFkdZh7iIVRPtNE8Q2fA7jc,4225
89
- fractal_server-1.4.2a5.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
90
- fractal_server-1.4.2a5.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
91
- fractal_server-1.4.2a5.dist-info/RECORD,,
89
+ fractal_server-1.4.3a0.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
90
+ fractal_server-1.4.3a0.dist-info/METADATA,sha256=lqQNo3aIYAac78m6-5EGliZhXUJJzYccec6ZR0vgxb4,4225
91
+ fractal_server-1.4.3a0.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
92
+ fractal_server-1.4.3a0.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
93
+ fractal_server-1.4.3a0.dist-info/RECORD,,