fractal-server 2.17.2__py3-none-any.whl → 2.18.0a0__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 (34) hide show
  1. fractal_server/__init__.py +1 -1
  2. fractal_server/app/models/linkuserproject.py +40 -0
  3. fractal_server/app/routes/admin/v2/__init__.py +2 -0
  4. fractal_server/app/routes/admin/v2/job.py +17 -6
  5. fractal_server/app/routes/admin/v2/sharing.py +103 -0
  6. fractal_server/app/routes/admin/v2/task.py +1 -0
  7. fractal_server/app/routes/api/v2/__init__.py +2 -0
  8. fractal_server/app/routes/api/v2/_aux_functions.py +43 -17
  9. fractal_server/app/routes/api/v2/_aux_functions_history.py +8 -3
  10. fractal_server/app/routes/api/v2/_aux_functions_sharing.py +97 -0
  11. fractal_server/app/routes/api/v2/dataset.py +23 -17
  12. fractal_server/app/routes/api/v2/history.py +21 -11
  13. fractal_server/app/routes/api/v2/images.py +22 -8
  14. fractal_server/app/routes/api/v2/job.py +28 -12
  15. fractal_server/app/routes/api/v2/pre_submission_checks.py +13 -6
  16. fractal_server/app/routes/api/v2/project.py +37 -14
  17. fractal_server/app/routes/api/v2/sharing.py +312 -0
  18. fractal_server/app/routes/api/v2/status_legacy.py +7 -4
  19. fractal_server/app/routes/api/v2/submit.py +11 -5
  20. fractal_server/app/routes/api/v2/task_version_update.py +7 -4
  21. fractal_server/app/routes/api/v2/workflow.py +23 -11
  22. fractal_server/app/routes/api/v2/workflow_import.py +14 -12
  23. fractal_server/app/routes/api/v2/workflowtask.py +41 -7
  24. fractal_server/app/schemas/v2/__init__.py +7 -0
  25. fractal_server/app/schemas/v2/sharing.py +99 -0
  26. fractal_server/migrations/versions/bc0e8b3327a7_project_sharing.py +72 -0
  27. fractal_server/runner/executors/slurm_common/_batching.py +4 -10
  28. fractal_server/runner/executors/slurm_ssh/runner.py +1 -1
  29. fractal_server/runner/executors/slurm_sudo/runner.py +1 -1
  30. {fractal_server-2.17.2.dist-info → fractal_server-2.18.0a0.dist-info}/METADATA +3 -2
  31. {fractal_server-2.17.2.dist-info → fractal_server-2.18.0a0.dist-info}/RECORD +34 -29
  32. {fractal_server-2.17.2.dist-info → fractal_server-2.18.0a0.dist-info}/WHEEL +0 -0
  33. {fractal_server-2.17.2.dist-info → fractal_server-2.18.0a0.dist-info}/entry_points.txt +0 -0
  34. {fractal_server-2.17.2.dist-info → fractal_server-2.18.0a0.dist-info}/licenses/LICENSE +0 -0
@@ -5,18 +5,21 @@ from fastapi import Depends
5
5
  from fastapi import HTTPException
6
6
  from fastapi import Response
7
7
  from fastapi import status
8
+ from sqlmodel import select
8
9
 
9
10
  from fractal_server.app.db import AsyncSession
10
11
  from fractal_server.app.db import get_async_db
11
12
  from fractal_server.app.models import UserOAuth
13
+ from fractal_server.app.models.linkuserproject import LinkUserProjectV2
12
14
  from fractal_server.app.routes.auth import current_user_act_ver_prof
13
15
  from fractal_server.app.schemas.v2 import TaskType
14
16
  from fractal_server.app.schemas.v2 import WorkflowTaskCreateV2
15
17
  from fractal_server.app.schemas.v2 import WorkflowTaskReadV2
16
18
  from fractal_server.app.schemas.v2 import WorkflowTaskUpdateV2
19
+ from fractal_server.app.schemas.v2.sharing import ProjectPermissions
17
20
 
18
- from ._aux_functions import _get_workflow_check_owner
19
- from ._aux_functions import _get_workflow_task_check_owner
21
+ from ._aux_functions import _get_workflow_check_access
22
+ from ._aux_functions import _get_workflow_task_check_access
20
23
  from ._aux_functions import _workflow_has_submitted_job
21
24
  from ._aux_functions import _workflow_insert_task
22
25
  from ._aux_functions_tasks import _check_type_filters_compatibility
@@ -42,10 +45,38 @@ async def create_workflowtask(
42
45
  Add a WorkflowTask to a Workflow
43
46
  """
44
47
 
45
- workflow = await _get_workflow_check_owner(
46
- project_id=project_id, workflow_id=workflow_id, user_id=user.id, db=db
48
+ workflow = await _get_workflow_check_access(
49
+ project_id=project_id,
50
+ workflow_id=workflow_id,
51
+ user_id=user.id,
52
+ required_permissions=ProjectPermissions.WRITE,
53
+ db=db,
47
54
  )
48
55
 
56
+ res = await db.execute(
57
+ select(UserOAuth.id)
58
+ .join(LinkUserProjectV2, LinkUserProjectV2.user_id == UserOAuth.id)
59
+ .where(LinkUserProjectV2.project_id == project_id)
60
+ .where(LinkUserProjectV2.is_owner.is_(True))
61
+ )
62
+ project_owner_id = res.scalar_one()
63
+ if project_owner_id != user.id:
64
+ try:
65
+ await _get_task_read_access(
66
+ task_id=task_id,
67
+ user_id=project_owner_id,
68
+ db=db,
69
+ require_active=True,
70
+ )
71
+ except HTTPException as e:
72
+ if e.status_code == 403:
73
+ raise HTTPException(
74
+ status_code=status.HTTP_422_UNPROCESSABLE_CONTENT,
75
+ detail="The task must be accessible to the project owner.",
76
+ )
77
+ else:
78
+ raise e
79
+
49
80
  task = await _get_task_read_access(
50
81
  task_id=task_id, user_id=user.id, db=db, require_active=True
51
82
  )
@@ -104,11 +135,12 @@ async def read_workflowtask(
104
135
  user: UserOAuth = Depends(current_user_act_ver_prof),
105
136
  db: AsyncSession = Depends(get_async_db),
106
137
  ):
107
- workflow_task, _ = await _get_workflow_task_check_owner(
138
+ workflow_task, _ = await _get_workflow_task_check_access(
108
139
  project_id=project_id,
109
140
  workflow_task_id=workflow_task_id,
110
141
  workflow_id=workflow_id,
111
142
  user_id=user.id,
143
+ required_permissions=ProjectPermissions.READ,
112
144
  db=db,
113
145
  )
114
146
  return workflow_task
@@ -130,11 +162,12 @@ async def update_workflowtask(
130
162
  Edit a WorkflowTask of a Workflow
131
163
  """
132
164
 
133
- db_wf_task, db_workflow = await _get_workflow_task_check_owner(
165
+ db_wf_task, db_workflow = await _get_workflow_task_check_access(
134
166
  project_id=project_id,
135
167
  workflow_task_id=workflow_task_id,
136
168
  workflow_id=workflow_id,
137
169
  user_id=user.id,
170
+ required_permissions=ProjectPermissions.WRITE,
138
171
  db=db,
139
172
  )
140
173
  if workflow_task_update.type_filters is not None:
@@ -215,11 +248,12 @@ async def delete_workflowtask(
215
248
  Delete a WorkflowTask of a Workflow
216
249
  """
217
250
 
218
- db_workflow_task, db_workflow = await _get_workflow_task_check_owner(
251
+ db_workflow_task, db_workflow = await _get_workflow_task_check_access(
219
252
  project_id=project_id,
220
253
  workflow_task_id=workflow_task_id,
221
254
  workflow_id=workflow_id,
222
255
  user_id=user.id,
256
+ required_permissions=ProjectPermissions.WRITE,
223
257
  db=db,
224
258
  )
225
259
 
@@ -30,6 +30,13 @@ from .profile import ValidProfileSlurmSudo # noqa F401
30
30
  from .project import ProjectCreateV2 # noqa F401
31
31
  from .project import ProjectReadV2 # noqa F401
32
32
  from .project import ProjectUpdateV2 # noqa F401
33
+ from .sharing import ProjectPermissions # noqa F401
34
+ from .sharing import ProjectGuestCreate # noqa F401
35
+ from .sharing import ProjectAccessRead # noqa F401
36
+ from .sharing import ProjectInvitationRead # noqa F401
37
+ from .sharing import ProjectGuestRead # noqa F401
38
+ from .sharing import ProjectGuestUpdate # noqa F401
39
+ from .sharing import LinkUserProjectRead # noqa F401
33
40
  from .resource import ResourceCreate # noqa F401
34
41
  from .resource import ResourceRead # noqa F401
35
42
  from .resource import ResourceType # noqa F401
@@ -0,0 +1,99 @@
1
+ from enum import StrEnum
2
+
3
+ from pydantic import BaseModel
4
+
5
+
6
+ class ProjectPermissions(StrEnum):
7
+ """
8
+ Available permissions for accessing Project
9
+ Attributes:
10
+ READ:
11
+ WRITE:
12
+ EXECUTE:
13
+ """
14
+
15
+ READ = "r"
16
+ WRITE = "rw"
17
+ EXECUTE = "rwx"
18
+
19
+
20
+ class ProjectGuestCreate(BaseModel):
21
+ """
22
+ Request body for project-sharing invitation.
23
+
24
+ Attributes:
25
+ permissions:
26
+ """
27
+
28
+ permissions: ProjectPermissions
29
+
30
+
31
+ class ProjectGuestRead(BaseModel):
32
+ """
33
+ Information about a guest.
34
+
35
+ Attributes:
36
+ email: Guest email.
37
+ is_verified: Project/guest verification status.
38
+ permissions: Guest permissions for project.
39
+ """
40
+
41
+ email: str
42
+ is_verified: bool
43
+ permissions: str
44
+
45
+
46
+ class ProjectGuestUpdate(BaseModel):
47
+ """
48
+ Request body for updating permissions of an existing guest.
49
+
50
+ Attributes:
51
+ permissions: New permissions for guest.
52
+ """
53
+
54
+ permissions: ProjectPermissions
55
+
56
+
57
+ class ProjectAccessRead(BaseModel):
58
+ """
59
+ Project-access information for current user.
60
+
61
+ Attributes:
62
+ is_owner: Whether current user is owner.
63
+ permissions: Current user permissions.
64
+ owner_email: Email of project owner
65
+ """
66
+
67
+ is_owner: bool
68
+ permissions: str
69
+ owner_email: str
70
+
71
+
72
+ class ProjectInvitationRead(BaseModel):
73
+ """
74
+ Info about a pending invitation.
75
+
76
+ Attributes:
77
+ project_id:
78
+ project_name:
79
+ owner_email:
80
+ guest_permissions:
81
+ """
82
+
83
+ project_id: int
84
+ project_name: str
85
+ owner_email: str
86
+ guest_permissions: str
87
+
88
+
89
+ class LinkUserProjectRead(BaseModel):
90
+ # User info
91
+ user_id: int
92
+ user_email: str
93
+ # Project info
94
+ project_id: int
95
+ project_name: str
96
+ # Permissions
97
+ is_verified: bool
98
+ is_owner: bool
99
+ permissions: str
@@ -0,0 +1,72 @@
1
+ """Project sharing
2
+
3
+ Revision ID: bc0e8b3327a7
4
+ Revises: e0e717ae2f26
5
+ Create Date: 2025-11-20 11:40:03.796112
6
+
7
+ """
8
+
9
+ import sqlalchemy as sa
10
+ from alembic import op
11
+
12
+ # revision identifiers, used by Alembic.
13
+ revision = "bc0e8b3327a7"
14
+ down_revision = "e0e717ae2f26"
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("linkuserprojectv2", schema=None) as batch_op:
22
+ batch_op.add_column(
23
+ sa.Column(
24
+ "is_owner", sa.BOOLEAN(), server_default="true", nullable=False
25
+ )
26
+ )
27
+ batch_op.add_column(
28
+ sa.Column(
29
+ "is_verified",
30
+ sa.BOOLEAN(),
31
+ server_default="true",
32
+ nullable=False,
33
+ )
34
+ )
35
+ batch_op.add_column(
36
+ sa.Column(
37
+ "permissions", sa.String(), server_default="rwx", nullable=False
38
+ )
39
+ )
40
+ batch_op.create_index(
41
+ "ix_linkuserprojectv2_one_owner_per_project",
42
+ ["project_id"],
43
+ unique=True,
44
+ postgresql_where=sa.text("is_owner IS true"),
45
+ )
46
+
47
+ # ### end Alembic commands ###
48
+
49
+ # Manually add check constraints
50
+ batch_op.create_check_constraint(
51
+ "owner_is_verified", "NOT (is_owner AND NOT is_verified)"
52
+ )
53
+ batch_op.create_check_constraint(
54
+ "owner_full_permissions", "NOT (is_owner AND permissions <> 'rwx')"
55
+ )
56
+ batch_op.create_check_constraint(
57
+ "valid_permissions", "permissions IN ('r', 'rw', 'rwx')"
58
+ )
59
+
60
+
61
+ def downgrade() -> None:
62
+ # ### commands auto generated by Alembic - please adjust! ###
63
+ with op.batch_alter_table("linkuserprojectv2", schema=None) as batch_op:
64
+ batch_op.drop_index(
65
+ "ix_linkuserprojectv2_one_owner_per_project",
66
+ postgresql_where=sa.text("is_owner IS true"),
67
+ )
68
+ batch_op.drop_column("permissions")
69
+ batch_op.drop_column("is_verified")
70
+ batch_op.drop_column("is_owner")
71
+
72
+ # ### end Alembic commands ###
@@ -1,13 +1,3 @@
1
- # Copyright 2022 (C) Friedrich Miescher Institute for Biomedical Research and
2
- # University of Zurich
3
- #
4
- # Original authors:
5
- # Tommaso Comparin <tommaso.comparin@exact-lab.it>
6
- #
7
- # This file is part of Fractal and was originally developed by eXact lab S.r.l.
8
- # <exact-lab.it> under contract with Liberali Lab from the Friedrich Miescher
9
- # Institute for Biomedical Research and Pelkmans Lab from the University of
10
- # Zurich.
11
1
  """
12
2
  Submodule to determine the number of total/parallel tasks per SLURM job.
13
3
  """
@@ -20,6 +10,10 @@ logger = set_logger(__name__)
20
10
 
21
11
 
22
12
  class SlurmHeuristicsError(ValueError):
13
+ """
14
+ Error in SLURM-batching heuristics.
15
+ """
16
+
23
17
  pass
24
18
 
25
19
 
@@ -24,7 +24,7 @@ logger = set_logger(__name__)
24
24
 
25
25
  class SlurmSSHRunner(BaseSlurmRunner):
26
26
  """
27
- Runner implementation for a computational `sudo_slurm` resource.
27
+ Runner implementation for a computational `slurm_ssh` resource.
28
28
  """
29
29
 
30
30
  fractal_ssh: FractalSSH
@@ -47,7 +47,7 @@ def _subprocess_run_or_raise(
47
47
 
48
48
  class SlurmSudoRunner(BaseSlurmRunner):
49
49
  """
50
- Runner implementation for a computational `sudo_slurm` resource.
50
+ Runner implementation for a computational `slurm_sudo` resource.
51
51
  """
52
52
 
53
53
  slurm_user: str
@@ -1,16 +1,17 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fractal-server
3
- Version: 2.17.2
3
+ Version: 2.18.0a0
4
4
  Summary: Backend component of the Fractal analytics platform
5
5
  License-Expression: BSD-3-Clause
6
6
  License-File: LICENSE
7
7
  Author: Tommaso Comparin
8
8
  Author-email: tommaso.comparin@exact-lab.it
9
- Requires-Python: >=3.11,<3.14
9
+ Requires-Python: >=3.11,<3.15
10
10
  Classifier: Programming Language :: Python :: 3
11
11
  Classifier: Programming Language :: Python :: 3.11
12
12
  Classifier: Programming Language :: Python :: 3.12
13
13
  Classifier: Programming Language :: Python :: 3.13
14
+ Classifier: Programming Language :: Python :: 3.14
14
15
  Requires-Dist: alembic (>=1.13.1,<2.0.0)
15
16
  Requires-Dist: fabric (>=3.2.2,<3.3.0)
16
17
  Requires-Dist: fastapi (>=0.120.0,<0.121.0)
@@ -1,11 +1,11 @@
1
- fractal_server/__init__.py,sha256=KKto7mH5FNaOvpTP-KcRa_G4lzWkJ08c7Q-M13NAx04,23
1
+ fractal_server/__init__.py,sha256=zUjuvRpoe51pROLg8ctvKgpIyEZgCSJzeDX3TTVg9Ms,25
2
2
  fractal_server/__main__.py,sha256=o63YYNPm6wv0YG5PTtxPselXY6g3ii5VoBP8blPGgK8,11423
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=Otswoi_PlwX1zRhLTFQUKbW9Ho7piRn8dezjq8k-XaU,2834
6
6
  fractal_server/app/models/__init__.py,sha256=oglUT1A1lLhXy2GFz3XsQ7wqkyfs3NXRtuNov-gOHXM,368
7
7
  fractal_server/app/models/linkusergroup.py,sha256=3KkkE4QIUAlTrBAZs_tVy0pGvAxUAq6yOEjflct_z2M,678
8
- fractal_server/app/models/linkuserproject.py,sha256=o52SWasrgvKW29rPG8PUT3Az7oxVJpCyv5rD5cKgds8,349
8
+ fractal_server/app/models/linkuserproject.py,sha256=LW09JFTY2lFLqp3KdxUNjldeJRaao3WnTko_gS21EU4,1572
9
9
  fractal_server/app/models/security.py,sha256=p9h1wqWzkJ2_P1kVmsHgeA81Bt5DU24v7THCr2-J238,4671
10
10
  fractal_server/app/models/v2/__init__.py,sha256=xL05Mvdx0dqUFhJf694oPfuqkUQxZbxOkoUgRuNIXl4,949
11
11
  fractal_server/app/models/v2/accounting.py,sha256=VNweFARrvY3mj5LI0834Ku061S2aGC61kuVHzi_tZhc,1187
@@ -21,42 +21,45 @@ fractal_server/app/models/v2/workflow.py,sha256=AsL7p8UMGbow--21IG2lYZnOjQ--m85d
21
21
  fractal_server/app/models/v2/workflowtask.py,sha256=qkTc-hcFLpJUVsEUbnDq2BJL0qg9jagy2doZeusF1ek,1266
22
22
  fractal_server/app/routes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
23
  fractal_server/app/routes/admin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
- fractal_server/app/routes/admin/v2/__init__.py,sha256=IT_DlCBKgReOeanTRdVsW9DmqOqHuE8CfBURI9Bzb6I,1050
24
+ fractal_server/app/routes/admin/v2/__init__.py,sha256=l3BVqu5f_KXW-8KCpmnI9QS_sZJTXygIz7Z_WawCGDA,1170
25
25
  fractal_server/app/routes/admin/v2/_aux_functions.py,sha256=fqA5sUCFuD2iVANQt2WUUfVOEVz5egQA7inzUKYGCw0,1684
26
26
  fractal_server/app/routes/admin/v2/accounting.py,sha256=HJ98G_Pde31cwEOqtloAJBXxsoRgNaoSG46OW7x1OBM,3584
27
27
  fractal_server/app/routes/admin/v2/impersonate.py,sha256=ictDjuvBr3iLv3YtwkVRMNQRq5qtPAeAXbbC7STSsEg,1125
28
- fractal_server/app/routes/admin/v2/job.py,sha256=sAHmLjK_YgYwyuRP95hLgyAZrwJAr6BaMXLCfjXdQMQ,10260
28
+ fractal_server/app/routes/admin/v2/job.py,sha256=aozHUx7nrDGr-JagePWjwdFGfW7nsAMH4RNvi4iLrsk,10515
29
29
  fractal_server/app/routes/admin/v2/profile.py,sha256=DwLlA9K3hkl9BqzyifIDiaWeHOM_N_17kqB5CSJOhSI,3165
30
30
  fractal_server/app/routes/admin/v2/resource.py,sha256=c2z6b_D_W6_dqVnxNF8F8OdlI5Z4asex8Zgfwzjbi2Q,6330
31
- fractal_server/app/routes/admin/v2/task.py,sha256=iivqjfdXTevaQotEiFL80Tay9l0jsZTK7MrrDzLUKzI,6066
31
+ fractal_server/app/routes/admin/v2/sharing.py,sha256=x7RtbDPapyENEU_s4-glPoEeEOxxj2VBgduVQ1V7wkE,3796
32
+ fractal_server/app/routes/admin/v2/task.py,sha256=t_ldc_71ZNbYuymmhn2WT8RqZlxMUceQfLU3LLInR4I,6127
32
33
  fractal_server/app/routes/admin/v2/task_group.py,sha256=zotpvn5ccQ9Kn-mgIorxJ8RU0BelxP_EEIi-2THH4kA,6248
33
34
  fractal_server/app/routes/admin/v2/task_group_lifecycle.py,sha256=3LtyLDLFDEWSx9e4huXV_uBUdoDuIWib7IzMjlD1OMI,9975
34
35
  fractal_server/app/routes/api/__init__.py,sha256=kq_c4t4a0rrJ6zMO0WGOTjCHf46SAlmWhh7Sa-3LkNg,1659
35
- fractal_server/app/routes/api/v2/__init__.py,sha256=Vg8KEH-EZduyxQeTisgrryvNNzRvJJ4H_3SydvQG8jA,2815
36
- fractal_server/app/routes/api/v2/_aux_functions.py,sha256=C-uk3ikJSFjQG6aO195mdzl6WQXQj6vv8FGc4FPc9fE,14891
37
- fractal_server/app/routes/api/v2/_aux_functions_history.py,sha256=bNCnN2xA8aS1nS8MREcBpnISdBSNu0bknOC1CeyYtqI,5417
36
+ fractal_server/app/routes/api/v2/__init__.py,sha256=lOSRxe408B3dUfd1FtpfynEWBwKDVFlUt3I4NpIQTRo,2938
37
+ fractal_server/app/routes/api/v2/_aux_functions.py,sha256=df6-Eep_402StSOiGeDHfKWZb7E1yJkFyHdi_EThRgE,15921
38
+ fractal_server/app/routes/api/v2/_aux_functions_history.py,sha256=RhKheO2mdSpA0PYGPuDfr8XTaE4e8LkuKeVJlilNtko,5683
39
+ fractal_server/app/routes/api/v2/_aux_functions_sharing.py,sha256=IvDII3Sl00eypdD3QRELQ4SLyC3gq6-HsXhuCx5Bp5I,2995
38
40
  fractal_server/app/routes/api/v2/_aux_functions_task_lifecycle.py,sha256=u7KO6VXBJhPhlUZlIt-mqmWzhfR-btrQdb5HNvPR5OY,8537
39
41
  fractal_server/app/routes/api/v2/_aux_functions_task_version_update.py,sha256=PKjV7r8YsPRXoNiVSnOK4KBYVV3l_Yb_ZPrqAkMkXrQ,1182
40
42
  fractal_server/app/routes/api/v2/_aux_functions_tasks.py,sha256=jg1QUQhDmeTw6c36-gBOVqOiBgI9kqBiuU77hHaJ_ag,13627
41
43
  fractal_server/app/routes/api/v2/_aux_task_group_disambiguation.py,sha256=vdvMTa3San1HMTzctN5Vk7zxpqe4ccByrFBQyHfgWW8,4889
42
- fractal_server/app/routes/api/v2/dataset.py,sha256=-TZcw2QbvurvDdZtiZxB4mZc-RF-aGLDmPWf2iiwcXA,8191
43
- fractal_server/app/routes/api/v2/history.py,sha256=chEbL5G40tic2FQMjw1mAVAKk8Bx9FH514fj9-kQmdE,17617
44
- fractal_server/app/routes/api/v2/images.py,sha256=MtVVl23n2A6i9tN0SCf_j147EoG-5gfSEdPVH4CbVQE,7898
45
- fractal_server/app/routes/api/v2/job.py,sha256=hPqPcV9AUYYV1YdEIf4nnLqz0pE3ajqAUvkpOugsFPA,6749
46
- fractal_server/app/routes/api/v2/pre_submission_checks.py,sha256=FeIoAG0GHi6nZpYNeXqfKVcLaA4yGq5kRt4f6PT6Zo8,4954
47
- fractal_server/app/routes/api/v2/project.py,sha256=RKhVyl9NitQMSTujBzPyKIplDe0wneAZzPPjD8uI1TY,5128
48
- fractal_server/app/routes/api/v2/status_legacy.py,sha256=E3La63jHA97qzdWTzqxPUVT7chuRRE76dDsujWjav2I,6418
49
- fractal_server/app/routes/api/v2/submit.py,sha256=0TpNqrfCTTaciVmnK2_qAadraFQ15O7wdZPLYOds8A8,9350
44
+ fractal_server/app/routes/api/v2/dataset.py,sha256=FE5m8t8KyBQG-df_uBJIpaPHBjbHOGkFbSDhMN6fsuw,8579
45
+ fractal_server/app/routes/api/v2/history.py,sha256=BYsfBlvcBGbJCL47KlMpZDktXAHB8ft2nIaOQMMjqPA,18183
46
+ fractal_server/app/routes/api/v2/images.py,sha256=k9wd44iwjCtEWSH9j6X6zToBwuOOo6J4FxSW7AGbPHA,8266
47
+ fractal_server/app/routes/api/v2/job.py,sha256=vRN3Ovwami_4CpZw8zJN1azltMCh2ed42dlOfVHHG6Q,7274
48
+ fractal_server/app/routes/api/v2/pre_submission_checks.py,sha256=Cs_ODoRWmkbSJJhlIE7pQh9JuJGXZTAr-EVF6wqKNGA,5215
49
+ fractal_server/app/routes/api/v2/project.py,sha256=TlcixNdrss6-0jSiFGnlLP-qCsuX8_nhUyagG5tip3c,5833
50
+ fractal_server/app/routes/api/v2/sharing.py,sha256=mwq8p6rQ4wE4ymli_azV-BYDbVk45RzYqMBei0wuzzk,9446
51
+ fractal_server/app/routes/api/v2/status_legacy.py,sha256=zP5YheZBoeffanUpVZvKYL4kYIiGIkGtR9W9GX0pXVE,6599
52
+ fractal_server/app/routes/api/v2/submit.py,sha256=HScEY2IC4xVLXBoe1Pwiy9bjNR1FnEuAJWjQTidEGFU,9562
50
53
  fractal_server/app/routes/api/v2/task.py,sha256=gekExcUmk-A8psT0_D356U-j8k38aw_wrCO8kWgG2Tw,7536
51
54
  fractal_server/app/routes/api/v2/task_collection.py,sha256=x6TMI3JeeIJQJS7bIbn3fnRZaxIxQlp-SQHr2ZVDLBw,12384
52
55
  fractal_server/app/routes/api/v2/task_collection_custom.py,sha256=9Ycm8-C_bgsEgjqyRLqa64e0HwMVYZWPYr--r-oomB4,6948
53
56
  fractal_server/app/routes/api/v2/task_collection_pixi.py,sha256=oAKO4dr0wMjOn3hC73YczLFrl-DznffGPgiZUmnyFAY,7190
54
57
  fractal_server/app/routes/api/v2/task_group.py,sha256=a9YzcXMwkoa_2x6mCz3U_qctE_BvyPIzaGFalF5Otus,8350
55
58
  fractal_server/app/routes/api/v2/task_group_lifecycle.py,sha256=g20Egnwlw8Qvm1PzKK_64Fv9UKELmPy1Vt-sItNvQRk,10575
56
- fractal_server/app/routes/api/v2/task_version_update.py,sha256=zi6DvnaTsTeJR-5Nnnfgfy8fGm9wU3P8hxh8hDHuB1Y,8315
57
- fractal_server/app/routes/api/v2/workflow.py,sha256=3Dxk6D-UVB7lI4yJYpCLL0mEd3y6VlLAe8pvufF-dIc,10337
58
- fractal_server/app/routes/api/v2/workflow_import.py,sha256=G8aR9B_BndaDQsugcCSZG4F2Xd8m9Ss87Km06uQ_MXs,9532
59
- fractal_server/app/routes/api/v2/workflowtask.py,sha256=lmEr1ih1AkfCz9CkHHU46HlPctTgq9as_CfguEfuikY,7955
59
+ fractal_server/app/routes/api/v2/task_version_update.py,sha256=p0Bk8B7EZi9T0IWeDPqH7U7JNcjMGj1x72-ngZGgTOU,8497
60
+ fractal_server/app/routes/api/v2/workflow.py,sha256=EW6u-_O6ox3DVBYgrllMfCMHC-DNetUNT6OZudbThko,10830
61
+ fractal_server/app/routes/api/v2/workflow_import.py,sha256=zSCWKFzwIX2fWpxZJKXHbFk11nuUrgJL50-P0E_vYTc,9668
62
+ fractal_server/app/routes/api/v2/workflowtask.py,sha256=phHiQU8y4kTDaCJ6BQwTp4SPdE_L4MH3QTnWnkx1hcA,9225
60
63
  fractal_server/app/routes/auth/__init__.py,sha256=RghfjGuu0RTW8RxBCvaePx9KErO4rTkI96XgbtbeSJU,2337
61
64
  fractal_server/app/routes/auth/_aux_auth.py,sha256=s_boxuhPC60j74NmE8FopYPv_Fc4hiADvL0beWPcuE0,5474
62
65
  fractal_server/app/routes/auth/current_user.py,sha256=Y_2Es3HFtTMuVUmWVHFFvk3vsRgmlqS_x5BwkeavlvI,5552
@@ -74,7 +77,7 @@ fractal_server/app/routes/pagination.py,sha256=C4XW6cnyDfyu1XMHXRN4wgk72lsS0UtlI
74
77
  fractal_server/app/schemas/__init__.py,sha256=VIWJCaqokte3OljDLX00o-EC2d12rFoPb5HOLKQI94Y,86
75
78
  fractal_server/app/schemas/user.py,sha256=ed1kXyVoCboNiHTQSA9EVGCZNIFByFknPluehHbYKmE,2900
76
79
  fractal_server/app/schemas/user_group.py,sha256=uTTOVGoy89SxVDpJumjqOEWxqXWR41MNOTBDCyNxEDA,1478
77
- fractal_server/app/schemas/v2/__init__.py,sha256=XQex5ojpELgO0xvq2l-Y8oV85ZgM3GBj6lrGGctPb1g,3729
80
+ fractal_server/app/schemas/v2/__init__.py,sha256=mMhdt4Jo-lyG8bITGAbpuyhDJx4MNgk-VSTKqcE6Ymo,4101
78
81
  fractal_server/app/schemas/v2/accounting.py,sha256=6EVUdPTkFY6Wb9-Vc0cIEZYVXwGEvJ3tP4YOXYE1hao,546
79
82
  fractal_server/app/schemas/v2/dataset.py,sha256=cBsEkny-EgNqFETMGRbJu5ChfYOnsKhkivqXK5dEOxQ,1938
80
83
  fractal_server/app/schemas/v2/dumps.py,sha256=NrQYrfu3ze317DC7wDwjJYv6gYfkWWze25HmQmYJNhQ,2294
@@ -84,6 +87,7 @@ fractal_server/app/schemas/v2/manifest.py,sha256=I8KyVZvW6r6_DrcKX5aZ9zJwa-Kk_u3
84
87
  fractal_server/app/schemas/v2/profile.py,sha256=CB44vkjRzcxAhw_6J67dYcVKKbYKJS6MdmZAXKF1ous,3299
85
88
  fractal_server/app/schemas/v2/project.py,sha256=7UC0aZLgtmkaAiPykeUj-9OZXhMkoyi3V-475UW_EQs,654
86
89
  fractal_server/app/schemas/v2/resource.py,sha256=MSwMKEmX9qdmYg-_2VGELlmCobJ3Ih2ldG6-R16WDBg,6230
90
+ fractal_server/app/schemas/v2/sharing.py,sha256=wHBiEmqhU53NokQ2rmm6xkH3lumBR6TdWw4nvDz6uww,1818
87
91
  fractal_server/app/schemas/v2/status_legacy.py,sha256=eQT1zGxbkzSwd0EqclsOdZ60n1x6J3DB1CZ3m4LYyxc,955
88
92
  fractal_server/app/schemas/v2/task.py,sha256=WkjliM8zujapC9CHTFme5ByjPCiln6qYKWJ_9gbcGOk,4363
89
93
  fractal_server/app/schemas/v2/task_collection.py,sha256=QUiMAwckHSzjXlC_cyNSR1QX0fpxG1wKPcd95SE2qKo,4598
@@ -149,6 +153,7 @@ fractal_server/migrations/versions/af1ef1c83c9b_add_accounting_tables.py,sha256=
149
153
  fractal_server/migrations/versions/af8673379a5c_drop_old_filter_columns.py,sha256=iEqkCJvqpDxRCKD1twh92W_u665OKEGRJqsWflPx8BM,1552
150
154
  fractal_server/migrations/versions/b1e7f7a1ff71_task_group_for_pixi.py,sha256=ElHX3KHpEGJoWc-yPS5ZlGNqJ9khONWEe5_Loh78egA,1293
151
155
  fractal_server/migrations/versions/b3ffb095f973_json_to_jsonb.py,sha256=fwaqVzGKRwZ4Nz3n_Y29WO6NzLYpa3JWCM8GjiNY9WQ,10036
156
+ fractal_server/migrations/versions/bc0e8b3327a7_project_sharing.py,sha256=5h8ogjfQPbKbVwN0-pfh5ixPQSCCYsiVnQoOveUKKUA,2145
152
157
  fractal_server/migrations/versions/c90a7c76e996_job_id_in_history_run.py,sha256=CPQNKHqsx22wSY4ylqM8UMhDOWkQeC9eLAHlQQJYSfQ,1102
153
158
  fractal_server/migrations/versions/caba9fb1ea5e_drop_useroauth_user_settings_id.py,sha256=7MpunfOBk0LM6u-xrwca8GUHIjinAJZrS9AUT3l62qU,1320
154
159
  fractal_server/migrations/versions/d256a7379ab8_taskgroup_activity_and_venv_info_to_.py,sha256=bFMJUFJAnOaHYyYYKISHpbQWKBoQopiEKRT0PSidqhk,3796
@@ -177,7 +182,7 @@ fractal_server/runner/executors/local/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCe
177
182
  fractal_server/runner/executors/local/get_local_config.py,sha256=oI32JawlG3ixYdjxJDRfT0sreEnoHekhiAHzlejl2aM,1694
178
183
  fractal_server/runner/executors/local/runner.py,sha256=0s0u5ONasXdsvS2WD5zxksQgved_XGXtaxCEiBJoAlM,12297
179
184
  fractal_server/runner/executors/slurm_common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
180
- fractal_server/runner/executors/slurm_common/_batching.py,sha256=sE9TWhwS08a0YgFTHmizYHnLEN_Z-H242a7KF8uTqJo,8711
185
+ fractal_server/runner/executors/slurm_common/_batching.py,sha256=YQjWRTDI1e6NeLe1R-1QWlt49i42M9ILeExEjdjgy48,8348
181
186
  fractal_server/runner/executors/slurm_common/_job_states.py,sha256=nuV-Zba38kDrRESOVB3gaGbrSPZc4q7YGichQaeqTW0,238
182
187
  fractal_server/runner/executors/slurm_common/base_slurm_runner.py,sha256=pU2Szcg3tv7vinLJXbzSgYlfEPLY_b0R0YDR-FSYLc8,41873
183
188
  fractal_server/runner/executors/slurm_common/get_slurm_config.py,sha256=B6EKjob8Y-DiJ8YbXf2CeoY7B8cwvkpKvlW8Ce6bbx0,7115
@@ -186,11 +191,11 @@ fractal_server/runner/executors/slurm_common/slurm_config.py,sha256=VSow-JfxBkdm
186
191
  fractal_server/runner/executors/slurm_common/slurm_job_task_models.py,sha256=VeX40CvU5fckUpSyXlzb3EDE9xxPXkT2sZKLXq_6Ooc,3493
187
192
  fractal_server/runner/executors/slurm_ssh/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
188
193
  fractal_server/runner/executors/slurm_ssh/run_subprocess.py,sha256=SyW6t4egvbiARph2YkFjc88Hj94fCamZVi50L7ph8VM,996
189
- fractal_server/runner/executors/slurm_ssh/runner.py,sha256=sTRJHbrXFrFLeUz1L6dZGDoev2uudNR6rp6jgcYmgzo,10324
194
+ fractal_server/runner/executors/slurm_ssh/runner.py,sha256=A6HavBk5H_fztoMV6A4pXlRPU-805gDznbJUjv0OQTU,10323
190
195
  fractal_server/runner/executors/slurm_ssh/tar_commands.py,sha256=83etlsQ_dYvGVrKqlgyOYXnRFWSwf4VRISANsYMVxkQ,1763
191
196
  fractal_server/runner/executors/slurm_sudo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
192
197
  fractal_server/runner/executors/slurm_sudo/_subprocess_run_as_user.py,sha256=OaC_aOupXnU873FvBt8xfBrz41yVyTxh3fU9_vxq0dY,2567
193
- fractal_server/runner/executors/slurm_sudo/runner.py,sha256=oPzUPErEJQpfMJp_qnEaE65QxNiS20zY9tGH6WNf-mo,6037
198
+ fractal_server/runner/executors/slurm_sudo/runner.py,sha256=OWhzPbwhtaRO5sJ-Q1fewegYoMqIQ-lEALuMaK_PHiI,6037
194
199
  fractal_server/runner/filenames.py,sha256=lPnxKHtdRizr6FqG3zOdjDPyWA7GoaJGTtiuJV0gA8E,70
195
200
  fractal_server/runner/set_start_and_last_task_index.py,sha256=NsioSzfEpGyo9ZKrV5KsbxeI7d5V3tE678Y3IAo5rHM,1218
196
201
  fractal_server/runner/task_files.py,sha256=n54A1x0MQRGSgqhzOTE-TPzEGJymUhQIUV9ApcVCV9M,4318
@@ -258,8 +263,8 @@ fractal_server/types/validators/_workflow_task_arguments_validators.py,sha256=zt
258
263
  fractal_server/urls.py,sha256=QjIKAC1a46bCdiPMu3AlpgFbcv6a4l3ABcd5xz190Og,471
259
264
  fractal_server/utils.py,sha256=-rjg8QTXQcKweXjn0NcmETFs1_uM9PGnbl0Q7c4ERPM,2181
260
265
  fractal_server/zip_tools.py,sha256=Uhn-ax4_9g1PJ32BdyaX30hFpAeVOv2tZYTUK-zVn1E,5719
261
- fractal_server-2.17.2.dist-info/METADATA,sha256=Lw5_B49kY8KKZrm33xe8d34toufMLQG3uSqLmX5Wvhk,4224
262
- fractal_server-2.17.2.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
263
- fractal_server-2.17.2.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
264
- fractal_server-2.17.2.dist-info/licenses/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
265
- fractal_server-2.17.2.dist-info/RECORD,,
266
+ fractal_server-2.18.0a0.dist-info/METADATA,sha256=Z6QtIkxxrETcp7P-PYKpvhf1xAhqzoEuwwZtkfGz3gs,4277
267
+ fractal_server-2.18.0a0.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
268
+ fractal_server-2.18.0a0.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
269
+ fractal_server-2.18.0a0.dist-info/licenses/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
270
+ fractal_server-2.18.0a0.dist-info/RECORD,,