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.
- fractal_server/__init__.py +1 -1
- fractal_server/app/models/dataset.py +8 -0
- fractal_server/app/models/workflow.py +9 -55
- fractal_server/app/routes/api/v1/_aux_functions.py +61 -0
- fractal_server/app/routes/api/v1/project.py +15 -7
- fractal_server/app/routes/api/v1/workflow.py +3 -1
- fractal_server/app/routes/api/v1/workflowtask.py +3 -1
- fractal_server/app/schemas/applyworkflow.py +4 -4
- fractal_server/app/schemas/dataset.py +2 -0
- fractal_server/app/schemas/dumps.py +2 -0
- fractal_server/app/schemas/user.py +7 -3
- fractal_server/app/schemas/workflow.py +2 -0
- fractal_server/migrations/versions/4cedeb448a53_workflowtask_foreign_keys_not_nullables.py +42 -0
- fractal_server/migrations/versions/9fd26a2b0de4_add_workflow_timestamp_created.py +60 -0
- {fractal_server-1.4.2a5.dist-info → fractal_server-1.4.3a0.dist-info}/METADATA +2 -2
- {fractal_server-1.4.2a5.dist-info → fractal_server-1.4.3a0.dist-info}/RECORD +19 -17
- {fractal_server-1.4.2a5.dist-info → fractal_server-1.4.3a0.dist-info}/LICENSE +0 -0
- {fractal_server-1.4.2a5.dist-info → fractal_server-1.4.3a0.dist-info}/WHEEL +0 -0
- {fractal_server-1.4.2a5.dist-info → fractal_server-1.4.3a0.dist-info}/entry_points.txt +0 -0
fractal_server/__init__.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
__VERSION__ = "1.4.
|
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
|
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:
|
53
|
-
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
|
-
|
122
|
-
|
123
|
-
|
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(
|
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(
|
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
|
-
|
422
|
-
|
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
|
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
|
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:
|
138
|
+
project_dump: ProjectDump
|
139
139
|
user_email: str
|
140
140
|
slurm_account: Optional[str]
|
141
141
|
workflow_id: Optional[int]
|
142
|
-
workflow_dump:
|
142
|
+
workflow_dump: WorkflowDump
|
143
143
|
input_dataset_id: Optional[int]
|
144
|
-
input_dataset_dump:
|
144
|
+
input_dataset_dump: DatasetDump
|
145
145
|
output_dataset_id: Optional[int]
|
146
|
-
output_dataset_dump:
|
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
|
-
|
122
|
-
|
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.
|
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.
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
26
|
-
fractal_server/app/routes/api/v1/workflowtask.py,sha256=
|
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=
|
52
|
-
fractal_server/app/schemas/dataset.py,sha256=
|
53
|
-
fractal_server/app/schemas/dumps.py,sha256=
|
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=
|
61
|
-
fractal_server/app/schemas/workflow.py,sha256=
|
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.
|
88
|
-
fractal_server-1.4.
|
89
|
-
fractal_server-1.4.
|
90
|
-
fractal_server-1.4.
|
91
|
-
fractal_server-1.4.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|