fractal-server 2.19.0a0__py3-none-any.whl → 2.19.0a1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- __VERSION__ = "2.19.0a0"
1
+ __VERSION__ = "2.19.0a1"
@@ -14,7 +14,6 @@ class TaskV2(SQLModel, table=True):
14
14
  type: str
15
15
  command_non_parallel: str | None = None
16
16
  command_parallel: str | None = None
17
- source: str | None = None
18
17
 
19
18
  meta_non_parallel: dict[str, Any] = Field(
20
19
  sa_column=Column(JSON, server_default="{}", default={}, nullable=False)
@@ -30,7 +30,6 @@ class TaskMinimal(BaseModel):
30
30
  taskgroupv2_id: int
31
31
  command_non_parallel: str | None = None
32
32
  command_parallel: str | None = None
33
- source: str | None = None
34
33
  version: str | None = None
35
34
 
36
35
 
@@ -55,7 +54,6 @@ class TaskInfo(BaseModel):
55
54
  @router.get("/", response_model=PaginationResponse[TaskInfo])
56
55
  async def query_tasks(
57
56
  id: int | None = None,
58
- source: str | None = None,
59
57
  version: str | None = None,
60
58
  name: str | None = None,
61
59
  task_type: TaskType | None = None,
@@ -81,9 +79,6 @@ async def query_tasks(
81
79
  if id is not None:
82
80
  stm = stm.where(TaskV2.id == id)
83
81
  stm_count = stm_count.where(TaskV2.id == id)
84
- if source is not None:
85
- stm = stm.where(TaskV2.source.icontains(source))
86
- stm_count = stm_count.where(TaskV2.source.icontains(source))
87
82
  if version is not None:
88
83
  stm = stm.where(TaskV2.version == version)
89
84
  stm_count = stm_count.where(TaskV2.version == version)
@@ -2,8 +2,6 @@ from fastapi import HTTPException
2
2
  from fastapi import status
3
3
  from httpx import AsyncClient
4
4
  from httpx import TimeoutException
5
- from packaging.version import InvalidVersion
6
- from packaging.version import Version
7
5
  from sqlmodel import func
8
6
  from sqlmodel import select
9
7
 
@@ -14,6 +12,7 @@ from fractal_server.app.models.v2 import TaskGroupV2
14
12
  from fractal_server.app.models.v2 import TaskV2
15
13
  from fractal_server.app.models.v2 import WorkflowTaskV2
16
14
  from fractal_server.app.models.v2 import WorkflowV2
15
+ from fractal_server.app.routes.aux._versions import _find_latest_version_or_422
17
16
  from fractal_server.app.schemas.v2 import JobStatusType
18
17
  from fractal_server.app.schemas.v2 import TaskGroupActivityStatus
19
18
  from fractal_server.logger import set_logger
@@ -26,24 +25,6 @@ PYPI_JSON_HEADERS = {"Accept": "application/vnd.pypi.simple.v1+json"}
26
25
  logger = set_logger(__name__)
27
26
 
28
27
 
29
- def _find_latest_version_or_422(versions: list[str]) -> str:
30
- """
31
- > For PEP 440 versions, this is easy enough for the client to do (using
32
- > the `packaging` library [...]. For non-standard versions, there is no
33
- > well-defined ordering, and clients will need to decide on what rule is
34
- > appropriate for their needs.
35
- (https://peps.python.org/pep-0700/#why-not-provide-a-latest-version-value)
36
- """
37
- try:
38
- latest = max(versions, key=lambda v_str: Version(v_str))
39
- return latest
40
- except InvalidVersion as e:
41
- raise HTTPException(
42
- status_code=status.HTTP_422_UNPROCESSABLE_CONTENT,
43
- detail=f"Cannot find latest version (original error: {str(e)}).",
44
- )
45
-
46
-
47
28
  async def get_package_version_from_pypi(
48
29
  name: str,
49
30
  version: str | None = None,
@@ -4,9 +4,6 @@ from fastapi import APIRouter
4
4
  from fastapi import Depends
5
5
  from fastapi import HTTPException
6
6
  from fastapi import status
7
- from packaging.version import InvalidVersion
8
- from packaging.version import Version
9
- from packaging.version import parse
10
7
  from pydantic.types import AwareDatetime
11
8
  from sqlmodel import or_
12
9
  from sqlmodel import select
@@ -25,6 +22,7 @@ from fractal_server.app.routes.auth._aux_auth import (
25
22
  from fractal_server.app.routes.auth._aux_auth import (
26
23
  _verify_user_belongs_to_group,
27
24
  )
25
+ from fractal_server.app.routes.aux._versions import _version_sort_key
28
26
  from fractal_server.app.schemas.v2 import TaskGroupActivityAction
29
27
  from fractal_server.app.schemas.v2 import TaskGroupActivityRead
30
28
  from fractal_server.app.schemas.v2 import TaskGroupActivityStatus
@@ -43,26 +41,6 @@ router = APIRouter()
43
41
  logger = set_logger(__name__)
44
42
 
45
43
 
46
- def _version_sort_key(
47
- task_group: TaskGroupV2,
48
- ) -> tuple[int, Version | str | None]:
49
- """
50
- Returns a tuple used as (reverse) ordering key for TaskGroups in
51
- `get_task_group_list`.
52
- The TaskGroups with a parsable versions are the first in order,
53
- sorted according to the sorting rules of packaging.version.Version.
54
- Next in order we have the TaskGroups with non-null non-parsable versions,
55
- sorted alphabetically.
56
- Last we have the TaskGroups with null version.
57
- """
58
- if task_group.version is None:
59
- return (0, task_group.version)
60
- try:
61
- return (2, parse(task_group.version))
62
- except InvalidVersion:
63
- return (1, task_group.version)
64
-
65
-
66
44
  @router.get("/activity/", response_model=list[TaskGroupActivityRead])
67
45
  async def get_task_group_activity_list(
68
46
  task_group_activity_id: int | None = None,
@@ -176,7 +154,7 @@ async def get_task_group_list(
176
154
  await remove_duplicate_task_groups(
177
155
  task_groups=sorted(
178
156
  list(groups),
179
- key=_version_sort_key,
157
+ key=lambda group: _version_sort_key(group.version),
180
158
  reverse=True,
181
159
  ),
182
160
  user_id=user.id,
@@ -19,8 +19,8 @@ from fractal_server.app.routes.auth import get_api_user
19
19
  from fractal_server.app.routes.auth._aux_auth import (
20
20
  _get_default_usergroup_id_or_none,
21
21
  )
22
+ from fractal_server.app.routes.aux._versions import _version_sort_key
22
23
  from fractal_server.app.schemas.v2 import TaskImport
23
- from fractal_server.app.schemas.v2 import TaskImportLegacy
24
24
  from fractal_server.app.schemas.v2 import WorkflowImport
25
25
  from fractal_server.app.schemas.v2 import WorkflowReadWithWarnings
26
26
  from fractal_server.app.schemas.v2 import WorkflowTaskCreate
@@ -73,32 +73,6 @@ async def _get_user_accessible_taskgroups(
73
73
  return accessible_task_groups
74
74
 
75
75
 
76
- async def _get_task_by_source(
77
- source: str,
78
- task_groups_list: list[TaskGroupV2],
79
- ) -> int | None:
80
- """
81
- Find task with a given source.
82
-
83
- Args:
84
- source: `source` of the task to be imported.
85
- task_groups_list: Current list of valid task groups.
86
-
87
- Return:
88
- `id` of the matching task, or `None`.
89
- """
90
- task_id = next(
91
- iter(
92
- task.id
93
- for task_group in task_groups_list
94
- for task in task_group.task_list
95
- if task.source == source
96
- ),
97
- None,
98
- )
99
- return task_id
100
-
101
-
102
76
  async def _get_task_by_taskimport(
103
77
  *,
104
78
  task_import: TaskImport,
@@ -141,14 +115,15 @@ async def _get_task_by_taskimport(
141
115
  return None
142
116
 
143
117
  # Determine target `version`
144
- # Note that task_import.version cannot be "", due to a validator
145
118
  if task_import.version is None:
146
119
  logger.debug(
147
120
  "[_get_task_by_taskimport] "
148
121
  "No version requested, looking for latest."
149
122
  )
150
- latest_task = max(matching_task_groups, key=lambda tg: tg.version or "")
151
- version = latest_task.version
123
+ version = max(
124
+ [tg.version for tg in matching_task_groups],
125
+ key=_version_sort_key,
126
+ )
152
127
  logger.debug(
153
128
  f"[_get_task_by_taskimport] Latest version set to {version}."
154
129
  )
@@ -246,19 +221,13 @@ async def import_workflow(
246
221
  list_task_ids = []
247
222
  for wf_task in workflow_import.task_list:
248
223
  task_import = wf_task.task
249
- if isinstance(task_import, TaskImportLegacy):
250
- task_id = await _get_task_by_source(
251
- source=task_import.source,
252
- task_groups_list=task_group_list,
253
- )
254
- else:
255
- task_id = await _get_task_by_taskimport(
256
- task_import=task_import,
257
- user_id=user.id,
258
- default_group_id=default_group_id,
259
- task_groups_list=task_group_list,
260
- db=db,
261
- )
224
+ task_id = await _get_task_by_taskimport(
225
+ task_import=task_import,
226
+ user_id=user.id,
227
+ default_group_id=default_group_id,
228
+ task_groups_list=task_group_list,
229
+ db=db,
230
+ )
262
231
  if task_id is None:
263
232
  raise HTTPException(
264
233
  status_code=status.HTTP_422_UNPROCESSABLE_CONTENT,
@@ -4,6 +4,8 @@ Definition of `/auth/current-user/` endpoints
4
4
 
5
5
  from fastapi import APIRouter
6
6
  from fastapi import Depends
7
+ from fastapi import HTTPException
8
+ from fastapi import status
7
9
  from sqlalchemy.ext.asyncio import AsyncSession
8
10
  from sqlmodel import select
9
11
 
@@ -52,6 +54,12 @@ async def patch_current_user(
52
54
  Note: a user cannot patch their own password (as enforced within the
53
55
  `UserUpdateStrict` schema).
54
56
  """
57
+ if current_user.is_guest:
58
+ raise HTTPException(
59
+ status_code=status.HTTP_403_FORBIDDEN,
60
+ detail="This feature is not available for guest users.",
61
+ )
62
+
55
63
  update = UserUpdate(**user_update.model_dump(exclude_unset=True))
56
64
 
57
65
  # NOTE: here it would be relevant to catch an `InvalidPasswordException`
@@ -0,0 +1,42 @@
1
+ from fastapi import HTTPException
2
+ from fastapi import status
3
+ from packaging.version import InvalidVersion
4
+ from packaging.version import Version
5
+
6
+
7
+ def _version_sort_key(version: str | None) -> tuple[int, Version | str | None]:
8
+ """
9
+ Returns a tuple used as (reverse) ordering key for TaskGroups in
10
+ `get_task_group_list`.
11
+ The parsable versions are the first in order, sorted according to the
12
+ sorting rules of packaging.version.Version.
13
+ Next in order we have the non-null non-parsable versions, sorted
14
+ alphabetically.
15
+ """
16
+ if version is None:
17
+ return (0, None)
18
+ try:
19
+ return (2, Version(version))
20
+ except InvalidVersion:
21
+ return (1, version)
22
+
23
+
24
+ def _find_latest_version_or_422(versions: list[str]) -> str:
25
+ """
26
+ > For PEP 440 versions, this is easy enough for the client to do (using
27
+ > the `packaging` library [...]. For non-standard versions, there is no
28
+ > well-defined ordering, and clients will need to decide on what rule is
29
+ > appropriate for their needs.
30
+ (https://peps.python.org/pep-0700/#why-not-provide-a-latest-version-value)
31
+
32
+ The `versions` array is coming from the PyPI API, and its elements are
33
+ assumed parsable.
34
+ """
35
+ try:
36
+ latest = max(versions, key=lambda v_str: Version(v_str))
37
+ return latest
38
+ except InvalidVersion as e:
39
+ raise HTTPException(
40
+ status_code=status.HTTP_422_UNPROCESSABLE_CONTENT,
41
+ detail=f"Cannot find latest version (original error: {str(e)}).",
42
+ )
@@ -47,7 +47,6 @@ from .status_legacy import WorkflowTaskStatusType # noqa F401
47
47
  from .task import TaskCreate # noqa F401
48
48
  from .task import TaskExport # noqa F401
49
49
  from .task import TaskImport # noqa F401
50
- from .task import TaskImportLegacy # noqa F401
51
50
  from .task import TaskRead # noqa F401
52
51
  from .task import TaskType # noqa F401
53
52
  from .task import TaskUpdate # noqa F401
@@ -30,7 +30,6 @@ class TaskDump(BaseModel):
30
30
 
31
31
  command_non_parallel: str | None = None
32
32
  command_parallel: str | None = None
33
- source: str | None = None
34
33
  version: str | None = None
35
34
 
36
35
  input_types: dict[str, bool]
@@ -94,7 +94,6 @@ class TaskRead(BaseModel):
94
94
  id: int
95
95
  name: str
96
96
  type: TaskType
97
- source: str | None = None
98
97
  version: str | None = None
99
98
 
100
99
  command_non_parallel: str | None = None
@@ -139,10 +138,6 @@ class TaskImport(BaseModel):
139
138
  name: NonEmptyStr
140
139
 
141
140
 
142
- class TaskImportLegacy(BaseModel):
143
- source: NonEmptyStr
144
-
145
-
146
141
  class TaskExport(BaseModel):
147
142
  pkg_name: NonEmptyStr
148
143
  version: NonEmptyStr | None = None
@@ -11,7 +11,6 @@ from fractal_server.types import WorkflowTaskArgument
11
11
 
12
12
  from .task import TaskExport
13
13
  from .task import TaskImport
14
- from .task import TaskImportLegacy
15
14
  from .task import TaskRead
16
15
  from .task import TaskType
17
16
 
@@ -75,7 +74,7 @@ class WorkflowTaskImport(BaseModel):
75
74
  type_filters: TypeFilters | None = None
76
75
  input_filters: dict[str, Any] | None = None
77
76
 
78
- task: TaskImport | TaskImportLegacy
77
+ task: TaskImport
79
78
 
80
79
  @model_validator(mode="before")
81
80
  @classmethod
@@ -21,6 +21,7 @@ from collections.abc import AsyncGenerator
21
21
  from typing import Any
22
22
  from typing import Generic
23
23
  from typing import Self
24
+ from typing import override
24
25
 
25
26
  from fastapi import Depends
26
27
  from fastapi import Request
@@ -188,19 +189,22 @@ class UserManager(IntegerIDMixin, BaseUserManager[UserOAuth, int]):
188
189
  password_helper=password_helper,
189
190
  )
190
191
 
192
+ @override
191
193
  async def validate_password(self, password: str, user: UserOAuth) -> None:
192
194
  # check password length
193
195
  min_length = 4
194
- max_length = 100
196
+ max_length = 72
195
197
  if len(password) < min_length:
196
198
  raise InvalidPasswordException(
197
199
  f"The password is too short (minimum length: {min_length})."
198
200
  )
199
- elif len(password) > max_length:
201
+ if len(password.encode("utf-8")) > max_length:
200
202
  raise InvalidPasswordException(
201
- f"The password is too long (maximum length: {min_length})."
203
+ "The password is too long "
204
+ f"(maximum length: {max_length} bytes)."
202
205
  )
203
206
 
207
+ @override
204
208
  async def oauth_callback(
205
209
  self: Self,
206
210
  oauth_name: str,
@@ -324,6 +328,7 @@ class UserManager(IntegerIDMixin, BaseUserManager[UserOAuth, int]):
324
328
 
325
329
  return user
326
330
 
331
+ @override
327
332
  async def on_after_register(
328
333
  self, user: UserOAuth, request: Request | None = None
329
334
  ):
@@ -0,0 +1,36 @@
1
+ """drop TaskV2.source
2
+
3
+ Revision ID: 5fb08bf05b14
4
+ Revises: e53dc51fdf93
5
+ Create Date: 2026-01-21 12:50:39.072816
6
+
7
+ """
8
+
9
+ import sqlalchemy as sa
10
+ from alembic import op
11
+
12
+ # revision identifiers, used by Alembic.
13
+ revision = "5fb08bf05b14"
14
+ down_revision = "e53dc51fdf93"
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("taskv2", schema=None) as batch_op:
22
+ batch_op.drop_column("source")
23
+
24
+ # ### end Alembic commands ###
25
+
26
+
27
+ def downgrade() -> None:
28
+ # ### commands auto generated by Alembic - please adjust! ###
29
+ with op.batch_alter_table("taskv2", schema=None) as batch_op:
30
+ batch_op.add_column(
31
+ sa.Column(
32
+ "source", sa.VARCHAR(), autoincrement=False, nullable=True
33
+ )
34
+ )
35
+
36
+ # ### end Alembic commands ###
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fractal-server
3
- Version: 2.19.0a0
3
+ Version: 2.19.0a1
4
4
  Summary: Backend component of the Fractal analytics platform
5
5
  Author: Tommaso Comparin, Marco Franzon, Yuri Chiucconi, Jacopo Nespolo
6
6
  Author-email: Tommaso Comparin <tommaso.comparin@exact-lab.it>, Marco Franzon <marco.franzon@exact-lab.it>, Yuri Chiucconi <yuri.chiucconi@exact-lab.it>, Jacopo Nespolo <jacopo.nespolo@exact-lab.it>
@@ -17,7 +17,7 @@ Requires-Dist: pydantic>=2.12.0,<2.13.0
17
17
  Requires-Dist: pydantic-settings==2.12.0
18
18
  Requires-Dist: packaging>=25.0.0,<26.0.0
19
19
  Requires-Dist: fabric>=3.2.2,<3.3.0
20
- Requires-Dist: gunicorn>=23.0,<24.0
20
+ Requires-Dist: gunicorn>=24.1,<25
21
21
  Requires-Dist: psycopg[binary]>=3.1.0,<4.0.0
22
22
  Requires-Dist: tomli-w>=1.2.0,<1.3.0
23
23
  Requires-Python: >=3.12, <3.15
@@ -1,4 +1,4 @@
1
- fractal_server/__init__.py,sha256=eojcLMU9LbD_qBD5WbjnoYryBbA4evbtq1WKYGIlYlE,25
1
+ fractal_server/__init__.py,sha256=LWs6pp7iYucF_bcAJBrLMG4BtvigBBOocgOTVrQBfeU,25
2
2
  fractal_server/__main__.py,sha256=QeKoAgqoiozLJDa8kSVe-Aso1WWgrk1yLUYWS8RxZVM,11405
3
3
  fractal_server/alembic.ini,sha256=MWwi7GzjzawI9cCAK1LW7NxIBQDUqD12-ptJoq5JpP0,3153
4
4
  fractal_server/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -15,7 +15,7 @@ fractal_server/app/models/v2/job.py,sha256=IwlOPgx4FU-6PsPd_aBJRGsp5qVXddRBv6xxS
15
15
  fractal_server/app/models/v2/profile.py,sha256=YajSmV4J_-zC4RX917s-A_lJt4mxYdPRVS3RH_uvJ48,1006
16
16
  fractal_server/app/models/v2/project.py,sha256=VvLXrgzKYLH585mYg_txrO8q3JoSoSEy4XkWjex4sDU,585
17
17
  fractal_server/app/models/v2/resource.py,sha256=XaHlJj9CladIahkrpywWXn8JBSx7_qEHp_wnkFuQ0rU,3896
18
- fractal_server/app/models/v2/task.py,sha256=iBIQB8POQE5MyKvLZhw7jZWlBhbrThzCDzRTcgiAczQ,1493
18
+ fractal_server/app/models/v2/task.py,sha256=v0brBHnAbcHrgDiuRHMWYahklq0fgyezZ0c9krKSA10,1463
19
19
  fractal_server/app/models/v2/task_group.py,sha256=C03LGKIO61Asj7Qz7qeIrZwWdfzoXBliLCeb9jzT5WI,4595
20
20
  fractal_server/app/models/v2/workflow.py,sha256=AsL7p8UMGbow--21IG2lYZnOjQ--m85dRWaNCHqb35I,1069
21
21
  fractal_server/app/models/v2/workflowtask.py,sha256=qkTc-hcFLpJUVsEUbnDq2BJL0qg9jagy2doZeusF1ek,1266
@@ -29,7 +29,7 @@ fractal_server/app/routes/admin/v2/job.py,sha256=VaVMUrHV7edHyjp2rsqoWf-wh5zlXFM
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
31
  fractal_server/app/routes/admin/v2/sharing.py,sha256=I2BoyO0rZNWxFKyq3Em9sjz_0n3kfRynC-WmUZxSzzU,5455
32
- fractal_server/app/routes/admin/v2/task.py,sha256=M4cetPkzn73-6faftk49AU_PeaPLqKE_dZxrrQ_x_98,6087
32
+ fractal_server/app/routes/admin/v2/task.py,sha256=9OglWWYjGbA1k2wdE8k8vr2ynLn6zqdp_BxwPGfjj9A,5873
33
33
  fractal_server/app/routes/admin/v2/task_group.py,sha256=3LxH2LEstj7L9qGNN3kkLo4JdFw4GXDlnlM6s4ulc_0,9377
34
34
  fractal_server/app/routes/admin/v2/task_group_lifecycle.py,sha256=LkHSQVXRRUkicpIDQpc7dwT944uabtCTTrZCoESHjik,9935
35
35
  fractal_server/app/routes/api/__init__.py,sha256=ZQtqy-HGJZsehAL8UjnTvRhWd9MI9Noi2NvwD5hE_xA,231
@@ -39,7 +39,7 @@ fractal_server/app/routes/api/v2/__init__.py,sha256=_J8ekQqNGJ3DC1mKum8m8SNOcv66
39
39
  fractal_server/app/routes/api/v2/_aux_functions.py,sha256=pxXcauCMZEVKkft8nOCK_Nq5m7hkx7BVUXch_j2KVtg,15131
40
40
  fractal_server/app/routes/api/v2/_aux_functions_history.py,sha256=vB8AwSBf3Dp1sxpTAYtWj4s9kgAp_D5Hd1BX6Z8JTxc,6057
41
41
  fractal_server/app/routes/api/v2/_aux_functions_sharing.py,sha256=IvDII3Sl00eypdD3QRELQ4SLyC3gq6-HsXhuCx5Bp5I,2995
42
- fractal_server/app/routes/api/v2/_aux_functions_task_lifecycle.py,sha256=qTJdKC3nKLwLYfuKbzJW6tREmzy-dNk57xcmvgi_UDA,8529
42
+ fractal_server/app/routes/api/v2/_aux_functions_task_lifecycle.py,sha256=EffjYdQCHoUc5i59c7KmyH8hoLYxQsPh4RPo8qY8CYA,7796
43
43
  fractal_server/app/routes/api/v2/_aux_functions_task_version_update.py,sha256=PKjV7r8YsPRXoNiVSnOK4KBYVV3l_Yb_ZPrqAkMkXrQ,1182
44
44
  fractal_server/app/routes/api/v2/_aux_functions_tasks.py,sha256=Hrumknv0vH5VX7SFp8WZDzsJv_z7quvFyNoDYmYoD7A,13623
45
45
  fractal_server/app/routes/api/v2/_aux_task_group_disambiguation.py,sha256=vdvMTa3San1HMTzctN5Vk7zxpqe4ccByrFBQyHfgWW8,4889
@@ -56,15 +56,15 @@ fractal_server/app/routes/api/v2/task.py,sha256=xKeGon7aRBOu1gnYd9EnWW1V-pnIqSVp
56
56
  fractal_server/app/routes/api/v2/task_collection.py,sha256=IFbFMadudfqBOu7CgMaQUr9dAhev_qiP-e43ZHV0gIE,12322
57
57
  fractal_server/app/routes/api/v2/task_collection_custom.py,sha256=yZ0c3hWkq3nR5CKYP63yU6D1--xWjS2aimqoYWrQT5I,6894
58
58
  fractal_server/app/routes/api/v2/task_collection_pixi.py,sha256=qNqKvXAwQg9c6kwIJ7kbR1KA3TqPWthyQkOaJrVCLUk,7146
59
- fractal_server/app/routes/api/v2/task_group.py,sha256=Q9KqhsnpT7Y4R0vg0oYzoJGX8b21Npe9pa3yIuN0Zcg,8348
59
+ fractal_server/app/routes/api/v2/task_group.py,sha256=Jemgrc_1qA6b8at48BePMLJennterLIpJwoa077jMmc,7632
60
60
  fractal_server/app/routes/api/v2/task_group_lifecycle.py,sha256=GOwIq78_M-HZylHGkGZJcu0yLIyjM4wpDsB8jobpWwI,10471
61
61
  fractal_server/app/routes/api/v2/task_version_update.py,sha256=dFzUetvIkd0RXw-cgOGGQGu8843y62AG30RbCQL15Tc,8506
62
62
  fractal_server/app/routes/api/v2/workflow.py,sha256=dHNytIVJgMqF-bGEzDrc2xFxgivFpF_xrDdUuYf_tyg,10709
63
- fractal_server/app/routes/api/v2/workflow_import.py,sha256=FOpWT68FxDawDiuLa1Jlkt5mfMeLe3AM6MdGMS5EKXg,9620
63
+ fractal_server/app/routes/api/v2/workflow_import.py,sha256=UND3U9zE-2o_85BW0uWNsm3_9125PgDtnUlki13jDT4,8740
64
64
  fractal_server/app/routes/api/v2/workflowtask.py,sha256=f9tleS7TZlku-Z6G8rsyscXlO-bTF5TBHQbx9tAs1Gc,8226
65
65
  fractal_server/app/routes/auth/__init__.py,sha256=JL4MUBjPiNsNJLlb0lbn6_LbIzdRLosquQNqpn6niFw,2836
66
66
  fractal_server/app/routes/auth/_aux_auth.py,sha256=gKdYTWUzxcU44Iep787zReWwdAs4kW5baNDXCPmiKn8,9195
67
- fractal_server/app/routes/auth/current_user.py,sha256=uDWttWo9isG69Jv1EGnnr2Ki5ZGd0D76jgjVDQMkn8c,3251
67
+ fractal_server/app/routes/auth/current_user.py,sha256=gOLk-jUnkXTrBj8aN_yRlUcvCoJMHxxoWz13M8DBCbg,3502
68
68
  fractal_server/app/routes/auth/group.py,sha256=uR98vdQHH-7BFl-Czj85ESPxT2yQymy4qtagaMrnUPU,6491
69
69
  fractal_server/app/routes/auth/login.py,sha256=buVa5Y8T0cd_SW1CqC-zMv-3SfPxGJknf7MYlUyKOl0,567
70
70
  fractal_server/app/routes/auth/oauth.py,sha256=dOt1bWz1viW36CAnHVLmLkYzdCHUMdOhdTNgoQp-VvU,3663
@@ -75,15 +75,16 @@ fractal_server/app/routes/auth/viewer_paths.py,sha256=uDIwP3AWjLOskG2ZSMUokmn6DW
75
75
  fractal_server/app/routes/aux/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
76
76
  fractal_server/app/routes/aux/_job.py,sha256=n-UhONvomKyKkQDDqd0lFh2kCMhlCGXpfdMNW39R1E4,644
77
77
  fractal_server/app/routes/aux/_runner.py,sha256=-SvcXCVEV7Mb6q4PbbxuTCCruX6sAlR5QGXk9CzBVv8,979
78
+ fractal_server/app/routes/aux/_versions.py,sha256=6ZnH5KcLlJXACfZsFXhgARQcp2AwekIaaTVz68H6HWs,1527
78
79
  fractal_server/app/routes/aux/validate_user_profile.py,sha256=fGqJDdAFkbQoEIjqZ5F9-SDY_4os63R2EUMqODC7eBg,1969
79
80
  fractal_server/app/routes/pagination.py,sha256=C4XW6cnyDfyu1XMHXRN4wgk72lsS0UtlINZmwGZFb4Y,1174
80
81
  fractal_server/app/schemas/__init__.py,sha256=VIWJCaqokte3OljDLX00o-EC2d12rFoPb5HOLKQI94Y,86
81
82
  fractal_server/app/schemas/user.py,sha256=ncPPxl6DsF_YDsEKJ1idTpAZTsVyh1iC9p4KfK25WZ4,3421
82
83
  fractal_server/app/schemas/user_group.py,sha256=irel29GbffKCXNcyrAYbNSN3pCgmoUQ1wG32_s6jvos,1082
83
- fractal_server/app/schemas/v2/__init__.py,sha256=6W1uSthuLGXs9oOYnjmScoqJYkWyUTT-9cNHFZoTmkM,4005
84
+ fractal_server/app/schemas/v2/__init__.py,sha256=cYyOsr-6jttq1jzRNa_tOuCXPp3zwV3jBDR72F4u4vU,3957
84
85
  fractal_server/app/schemas/v2/accounting.py,sha256=6EVUdPTkFY6Wb9-Vc0cIEZYVXwGEvJ3tP4YOXYE1hao,546
85
86
  fractal_server/app/schemas/v2/dataset.py,sha256=SBS3TwHxPRHtLvFu-Bm4eQlI96DIkCiFF7oKvfcfTOc,2736
86
- fractal_server/app/schemas/v2/dumps.py,sha256=UPtb1Rqkd48AFpWsVfcHcAjKGzF2ZoHLdYrAJzPdsSM,2276
87
+ fractal_server/app/schemas/v2/dumps.py,sha256=x3LK-Xq1OQgp7waAjy-5gaQVNbcF5JQNTqqPw86xkpM,2246
87
88
  fractal_server/app/schemas/v2/history.py,sha256=pZiMKfh6nMWbTp5MUtrnGySPKbeRFf5tM1VLFaTgGcw,1784
88
89
  fractal_server/app/schemas/v2/job.py,sha256=YnnxnrbI_l7EgZNzk_KgnuEuh0COg-RPoph2foHUvZo,3308
89
90
  fractal_server/app/schemas/v2/manifest.py,sha256=I8KyVZvW6r6_DrcKX5aZ9zJwa-Kk_u3gCKlz6HVPF5o,6655
@@ -92,12 +93,12 @@ fractal_server/app/schemas/v2/project.py,sha256=jTc4jhwdkO1Ht2K27AguA0z9wWX0CYKv
92
93
  fractal_server/app/schemas/v2/resource.py,sha256=LPi1D67vGngOn5BWNicqAIHCKExaf2XyzuZKByo7wfc,6841
93
94
  fractal_server/app/schemas/v2/sharing.py,sha256=wHBiEmqhU53NokQ2rmm6xkH3lumBR6TdWw4nvDz6uww,1818
94
95
  fractal_server/app/schemas/v2/status_legacy.py,sha256=ajLm2p0wNfJ_lQX9Oq3NJn0jxQj50U3eZxuRjOIdOpg,949
95
- fractal_server/app/schemas/v2/task.py,sha256=Fd4n6vitliOuQyoofQ0daFy25QzIoWe9NPbXanNyrrE,4351
96
+ fractal_server/app/schemas/v2/task.py,sha256=le62bHu4nRrXlN-cCOdpkStLQNLtkR_myqK1j8fLoNs,4260
96
97
  fractal_server/app/schemas/v2/task_collection.py,sha256=ljGnZOmYg9pQ9PbYnNxLJDf4O2BDym-BQ_cXr-NWSd4,4590
97
98
  fractal_server/app/schemas/v2/task_group.py,sha256=sbg6AkvonU7F_-QC4G9kDxO6YVcz7wUPY3k3n9jYkRY,3392
98
99
  fractal_server/app/schemas/v2/workflow.py,sha256=87Aa92H6ceBbkDUsDhDqVNJyuBZuVRRAgFqNeg_djwE,1738
99
- fractal_server/app/schemas/v2/workflowtask.py,sha256=1k56KHwzZDZGjl7FG1yslj-MKtKKR5fZ5RKGlJbopNc,3608
100
- fractal_server/app/security/__init__.py,sha256=sblIH9DFCt_iyk22WzV6k4LuKdbvNPtS1HqPCHIiBJ4,18363
100
+ fractal_server/app/schemas/v2/workflowtask.py,sha256=fxyMApNNEw6OVtyk2Q-HX6oKXIg3x3U4JUB_W-AoqL0,3554
101
+ fractal_server/app/security/__init__.py,sha256=Z-xQjt5jx6ldBBrz1iJ0IQ-SLKbv8Gq7fQ4U18NAxXc,18471
101
102
  fractal_server/app/security/signup_email.py,sha256=R69U5eTi9X7gZHSTfZ26SaHMQAeqReYEpGnB8r3AVig,1992
102
103
  fractal_server/app/shutdown.py,sha256=bfEmf6Xdc906ES0zDDWsihmd6neQpGFyIc7qnadnNu8,2283
103
104
  fractal_server/config/__init__.py,sha256=WvcoE3qiY1qnkumv3qspcemCFw5iFG5NkSFR78vN4ks,562
@@ -135,6 +136,7 @@ fractal_server/migrations/versions/4cedeb448a53_workflowtask_foreign_keys_not_nu
135
136
  fractal_server/migrations/versions/501961cfcd85_remove_link_between_v1_and_v2_tasks_.py,sha256=SeBUvMEikyl4qkCjiOgkkqbcIeaim57EPuufjFh_X8k,3271
136
137
  fractal_server/migrations/versions/50a13d6138fd_initial_schema.py,sha256=sh0tB5K35ui8bfvBPI2jwDkeNVDtdlGvWrvTeumA0iY,8654
137
138
  fractal_server/migrations/versions/5bf02391cfef_v2.py,sha256=jTNyZ8H5VDh4eRvCEy-WliXAu55kUybddsaTeexXr6c,8367
139
+ fractal_server/migrations/versions/5fb08bf05b14_drop_taskv2_source.py,sha256=bUs6xhVFGeCU4rR7yRdQXEXsns28lFUKBdcDsd-Bj4Q,880
138
140
  fractal_server/migrations/versions/70e77f1c38b0_add_applyworkflow_first_task_index_and_.py,sha256=vJ6nDb7UnkCMIPg2zNM7ZE0JOTvaqFL3Fe9UarP-ivM,1633
139
141
  fractal_server/migrations/versions/71eefd1dd202_add_slurm_accounts.py,sha256=qpHZC97AduFk5_G0xHs9akhnhpzb1LZooYCTPHy7n28,1353
140
142
  fractal_server/migrations/versions/7673fe18c05d_remove_project_dir_server_default.py,sha256=PwTfY9Kq3_cwb5G4E0sM9u7UjzOhOwsYCspymmPgipQ,795
@@ -270,8 +272,8 @@ fractal_server/types/validators/_workflow_task_arguments_validators.py,sha256=zt
270
272
  fractal_server/urls.py,sha256=QjIKAC1a46bCdiPMu3AlpgFbcv6a4l3ABcd5xz190Og,471
271
273
  fractal_server/utils.py,sha256=-rjg8QTXQcKweXjn0NcmETFs1_uM9PGnbl0Q7c4ERPM,2181
272
274
  fractal_server/zip_tools.py,sha256=Uhn-ax4_9g1PJ32BdyaX30hFpAeVOv2tZYTUK-zVn1E,5719
273
- fractal_server-2.19.0a0.dist-info/licenses/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
274
- fractal_server-2.19.0a0.dist-info/WHEEL,sha256=eycQt0QpYmJMLKpE3X9iDk8R04v2ZF0x82ogq-zP6bQ,79
275
- fractal_server-2.19.0a0.dist-info/entry_points.txt,sha256=3TpdcjmETRYWJxFyAh3z-9955EWua9jdkSnBwxES1uE,60
276
- fractal_server-2.19.0a0.dist-info/METADATA,sha256=pmh1KIC1bSUPthf2eJlfOJq_J3Yw88vWkvPr4hgtYNA,4185
277
- fractal_server-2.19.0a0.dist-info/RECORD,,
275
+ fractal_server-2.19.0a1.dist-info/licenses/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
276
+ fractal_server-2.19.0a1.dist-info/WHEEL,sha256=eycQt0QpYmJMLKpE3X9iDk8R04v2ZF0x82ogq-zP6bQ,79
277
+ fractal_server-2.19.0a1.dist-info/entry_points.txt,sha256=3TpdcjmETRYWJxFyAh3z-9955EWua9jdkSnBwxES1uE,60
278
+ fractal_server-2.19.0a1.dist-info/METADATA,sha256=rConssE0ikH7AaowdmpjxnYW8MDuZYMcFhw_MSEk2Ls,4183
279
+ fractal_server-2.19.0a1.dist-info/RECORD,,