fractal-server 2.19.0a1__tar.gz → 2.19.1__tar.gz

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 (282) hide show
  1. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/PKG-INFO +1 -1
  2. fractal_server-2.19.1/fractal_server/__init__.py +1 -0
  3. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/models/v2/dataset.py +0 -4
  4. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/models/v2/job.py +4 -0
  5. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/models/v2/task_group.py +4 -0
  6. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/models/v2/workflow.py +2 -0
  7. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/models/v2/workflowtask.py +3 -0
  8. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/admin/v2/task_group_lifecycle.py +6 -0
  9. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/api/v2/__init__.py +0 -2
  10. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/api/v2/_aux_functions.py +6 -0
  11. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/api/v2/submit.py +3 -1
  12. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/api/v2/task_collection.py +2 -0
  13. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/api/v2/task_collection_pixi.py +2 -0
  14. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/api/v2/task_group_lifecycle.py +6 -0
  15. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/api/v2/workflow.py +1 -1
  16. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/api/v2/workflowtask.py +3 -6
  17. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/schemas/v2/workflow.py +5 -0
  18. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/schemas/v2/workflowtask.py +12 -0
  19. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/security/__init__.py +11 -6
  20. fractal_server-2.19.1/fractal_server/migrations/versions/18a26fcdea5d_drop_dataset_history.py +41 -0
  21. fractal_server-2.19.1/fractal_server/migrations/versions/1bf8785755f9_add_description_to_workflow_and_.py +53 -0
  22. fractal_server-2.19.1/fractal_server/migrations/versions/cfd13f7954e7_add_fractal_server_version_to_jobv2_and_.py +52 -0
  23. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/config/_slurm.py +2 -0
  24. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/executors/slurm_common/base_slurm_runner.py +1 -0
  25. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/executors/slurm_common/get_slurm_config.py +1 -0
  26. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/executors/slurm_common/slurm_config.py +3 -0
  27. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/v2/submit_workflow.py +0 -2
  28. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/pyproject.toml +7 -8
  29. fractal_server-2.19.0a1/fractal_server/__init__.py +0 -1
  30. fractal_server-2.19.0a1/fractal_server/app/routes/api/v2/status_legacy.py +0 -156
  31. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/LICENSE +0 -0
  32. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/README.md +0 -0
  33. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/__main__.py +0 -0
  34. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/alembic.ini +0 -0
  35. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/__init__.py +0 -0
  36. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/db/__init__.py +0 -0
  37. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/models/__init__.py +0 -0
  38. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/models/linkusergroup.py +0 -0
  39. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/models/linkuserproject.py +0 -0
  40. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/models/security.py +0 -0
  41. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/models/v2/__init__.py +0 -0
  42. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/models/v2/accounting.py +0 -0
  43. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/models/v2/history.py +0 -0
  44. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/models/v2/profile.py +0 -0
  45. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/models/v2/project.py +0 -0
  46. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/models/v2/resource.py +0 -0
  47. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/models/v2/task.py +0 -0
  48. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/__init__.py +0 -0
  49. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/admin/__init__.py +0 -0
  50. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/admin/v2/__init__.py +0 -0
  51. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/admin/v2/_aux_functions.py +0 -0
  52. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/admin/v2/accounting.py +0 -0
  53. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/admin/v2/impersonate.py +0 -0
  54. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/admin/v2/job.py +0 -0
  55. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/admin/v2/profile.py +0 -0
  56. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/admin/v2/resource.py +0 -0
  57. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/admin/v2/sharing.py +0 -0
  58. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/admin/v2/task.py +0 -0
  59. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/admin/v2/task_group.py +0 -0
  60. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/api/__init__.py +0 -0
  61. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/api/alive.py +0 -0
  62. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/api/settings.py +0 -0
  63. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/api/v2/_aux_functions_history.py +0 -0
  64. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/api/v2/_aux_functions_sharing.py +0 -0
  65. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/api/v2/_aux_functions_task_lifecycle.py +0 -0
  66. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/api/v2/_aux_functions_task_version_update.py +0 -0
  67. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/api/v2/_aux_functions_tasks.py +0 -0
  68. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/api/v2/_aux_task_group_disambiguation.py +0 -0
  69. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/api/v2/dataset.py +0 -0
  70. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/api/v2/history.py +0 -0
  71. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/api/v2/images.py +0 -0
  72. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/api/v2/job.py +0 -0
  73. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/api/v2/pre_submission_checks.py +0 -0
  74. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/api/v2/project.py +0 -0
  75. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/api/v2/sharing.py +0 -0
  76. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/api/v2/task.py +0 -0
  77. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/api/v2/task_collection_custom.py +0 -0
  78. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/api/v2/task_group.py +0 -0
  79. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/api/v2/task_version_update.py +0 -0
  80. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/api/v2/workflow_import.py +0 -0
  81. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/auth/__init__.py +0 -0
  82. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/auth/_aux_auth.py +0 -0
  83. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/auth/current_user.py +0 -0
  84. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/auth/group.py +0 -0
  85. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/auth/login.py +0 -0
  86. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/auth/oauth.py +0 -0
  87. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/auth/register.py +0 -0
  88. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/auth/router.py +0 -0
  89. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/auth/users.py +0 -0
  90. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/auth/viewer_paths.py +0 -0
  91. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/aux/__init__.py +0 -0
  92. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/aux/_job.py +0 -0
  93. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/aux/_runner.py +0 -0
  94. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/aux/_versions.py +0 -0
  95. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/aux/validate_user_profile.py +0 -0
  96. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/routes/pagination.py +0 -0
  97. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/schemas/__init__.py +0 -0
  98. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/schemas/user.py +0 -0
  99. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/schemas/user_group.py +0 -0
  100. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/schemas/v2/__init__.py +0 -0
  101. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/schemas/v2/accounting.py +0 -0
  102. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/schemas/v2/dataset.py +0 -0
  103. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/schemas/v2/dumps.py +0 -0
  104. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/schemas/v2/history.py +0 -0
  105. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/schemas/v2/job.py +0 -0
  106. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/schemas/v2/manifest.py +0 -0
  107. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/schemas/v2/profile.py +0 -0
  108. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/schemas/v2/project.py +0 -0
  109. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/schemas/v2/resource.py +0 -0
  110. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/schemas/v2/sharing.py +0 -0
  111. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/schemas/v2/status_legacy.py +0 -0
  112. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/schemas/v2/task.py +0 -0
  113. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/schemas/v2/task_collection.py +0 -0
  114. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/schemas/v2/task_group.py +0 -0
  115. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/security/signup_email.py +0 -0
  116. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/app/shutdown.py +0 -0
  117. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/config/__init__.py +0 -0
  118. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/config/_data.py +0 -0
  119. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/config/_database.py +0 -0
  120. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/config/_email.py +0 -0
  121. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/config/_main.py +0 -0
  122. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/config/_oauth.py +0 -0
  123. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/config/_settings_config.py +0 -0
  124. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/data_migrations/tools.py +0 -0
  125. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/exceptions.py +0 -0
  126. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/gunicorn_fractal.py +0 -0
  127. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/images/__init__.py +0 -0
  128. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/images/models.py +0 -0
  129. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/images/status_tools.py +0 -0
  130. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/images/tools.py +0 -0
  131. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/logger.py +0 -0
  132. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/main.py +0 -0
  133. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/env.py +0 -0
  134. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/naming_convention.py +0 -0
  135. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/034a469ec2eb_task_groups.py +0 -0
  136. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/068496367952_drop_taskgroup_venv_size_and_files_.py +0 -0
  137. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/091b01f51f88_add_usergroup_and_linkusergroup_table.py +0 -0
  138. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/0f5f85bb2ae7_add_pre_pinned_packages.py +0 -0
  139. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/19eca0dd47a9_user_settings_project_dir.py +0 -0
  140. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/1a83a5260664_rename.py +0 -0
  141. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/1eac13a26c83_drop_v1_tables.py +0 -0
  142. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/316140ff7ee1_remove_usersettings_cache_dir.py +0 -0
  143. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/40d6d6511b20_add_index_to_history_models.py +0 -0
  144. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/45fbb391d7af_make_resource_id_fk_non_nullable.py +0 -0
  145. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/47351f8c7ebc_drop_dataset_filters.py +0 -0
  146. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/49d0856e9569_drop_table.py +0 -0
  147. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/4c308bcaea2b_add_task_args_schema_and_task_args_.py +0 -0
  148. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/4cedeb448a53_workflowtask_foreign_keys_not_nullables.py +0 -0
  149. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/501961cfcd85_remove_link_between_v1_and_v2_tasks_.py +0 -0
  150. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/50a13d6138fd_initial_schema.py +0 -0
  151. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/5bf02391cfef_v2.py +0 -0
  152. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/5fb08bf05b14_drop_taskv2_source.py +0 -0
  153. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/70e77f1c38b0_add_applyworkflow_first_task_index_and_.py +0 -0
  154. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/71eefd1dd202_add_slurm_accounts.py +0 -0
  155. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/7673fe18c05d_remove_project_dir_server_default.py +0 -0
  156. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/7910eed4cf97_user_project_dirs_and_usergroup_viewer_.py +0 -0
  157. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/791ce783d3d8_add_indices.py +0 -0
  158. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/83bc2ad3ffcc_2_17_0.py +0 -0
  159. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/84bf0fffde30_add_dumps_to_applyworkflow.py +0 -0
  160. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/88270f589c9b_add_prevent_new_submissions.py +0 -0
  161. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/8e8f227a3e36_update_taskv2_post_2_7_0.py +0 -0
  162. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/8f79bd162e35_add_docs_info_and_docs_link_to_task_.py +0 -0
  163. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/94a47ea2d3ff_remove_cache_dir_slurm_user_and_slurm_.py +0 -0
  164. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/969d84257cac_add_historyrun_task_id.py +0 -0
  165. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/97f444d47249_add_applyworkflow_project_dump.py +0 -0
  166. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/981d588fe248_add_executor_error_log.py +0 -0
  167. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/99ea79d9e5d2_add_dataset_history.py +0 -0
  168. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/9c5ae74c9b98_add_user_settings_table.py +0 -0
  169. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/9db60297b8b2_set_ondelete.py +0 -0
  170. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/9fd26a2b0de4_add_workflow_timestamp_created.py +0 -0
  171. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/a7f4d6137b53_add_workflow_dump_to_applyworkflow.py +0 -0
  172. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/af1ef1c83c9b_add_accounting_tables.py +0 -0
  173. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/af8673379a5c_drop_old_filter_columns.py +0 -0
  174. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/b1e7f7a1ff71_task_group_for_pixi.py +0 -0
  175. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/b3ffb095f973_json_to_jsonb.py +0 -0
  176. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/b7477cc98f45_2_18_1.py +0 -0
  177. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/bc0e8b3327a7_project_sharing.py +0 -0
  178. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/c90a7c76e996_job_id_in_history_run.py +0 -0
  179. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/caba9fb1ea5e_drop_useroauth_user_settings_id.py +0 -0
  180. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/d256a7379ab8_taskgroup_activity_and_venv_info_to_.py +0 -0
  181. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/d4fe3708d309_make_applyworkflow_workflow_dump_non_.py +0 -0
  182. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/da2cb2ac4255_user_group_viewer_paths.py +0 -0
  183. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/db09233ad13a_split_filters_and_keep_old_columns.py +0 -0
  184. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/e0e717ae2f26_delete_linkuserproject_ondelete_project.py +0 -0
  185. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/e53dc51fdf93_add_useroauth_is_guest.py +0 -0
  186. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/e75cac726012_make_applyworkflow_start_timestamp_not_.py +0 -0
  187. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/e81103413827_add_job_type_filters.py +0 -0
  188. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/efa89c30e0a4_add_project_timestamp_created.py +0 -0
  189. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/f0702066b007_one_submitted_job_per_dataset.py +0 -0
  190. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/f37aceb45062_make_historyunit_logfile_required.py +0 -0
  191. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/f384e1c0cf5d_drop_task_default_args_columns.py +0 -0
  192. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/migrations/versions/fbce16ff4e47_new_history_items.py +0 -0
  193. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/py.typed +0 -0
  194. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/__init__.py +0 -0
  195. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/components.py +0 -0
  196. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/config/__init__.py +0 -0
  197. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/config/_local.py +0 -0
  198. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/config/slurm_mem_to_MB.py +0 -0
  199. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/exceptions.py +0 -0
  200. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/executors/__init__.py +0 -0
  201. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/executors/base_runner.py +0 -0
  202. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/executors/call_command_wrapper.py +0 -0
  203. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/executors/local/__init__.py +0 -0
  204. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/executors/local/get_local_config.py +0 -0
  205. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/executors/local/runner.py +0 -0
  206. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/executors/slurm_common/__init__.py +0 -0
  207. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/executors/slurm_common/_batching.py +0 -0
  208. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/executors/slurm_common/_job_states.py +0 -0
  209. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/executors/slurm_common/remote.py +0 -0
  210. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/executors/slurm_common/slurm_job_task_models.py +0 -0
  211. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/executors/slurm_ssh/__init__.py +0 -0
  212. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/executors/slurm_ssh/run_subprocess.py +0 -0
  213. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/executors/slurm_ssh/runner.py +0 -0
  214. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/executors/slurm_ssh/tar_commands.py +0 -0
  215. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/executors/slurm_sudo/__init__.py +0 -0
  216. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/executors/slurm_sudo/_subprocess_run_as_user.py +0 -0
  217. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/executors/slurm_sudo/runner.py +0 -0
  218. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/filenames.py +0 -0
  219. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/set_start_and_last_task_index.py +0 -0
  220. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/task_files.py +0 -0
  221. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/v2/__init__.py +0 -0
  222. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/v2/_local.py +0 -0
  223. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/v2/_slurm_ssh.py +0 -0
  224. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/v2/_slurm_sudo.py +0 -0
  225. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/v2/db_tools.py +0 -0
  226. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/v2/deduplicate_list.py +0 -0
  227. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/v2/merge_outputs.py +0 -0
  228. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/v2/runner.py +0 -0
  229. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/v2/runner_functions.py +0 -0
  230. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/v2/task_interface.py +0 -0
  231. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/runner/versions.py +0 -0
  232. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/ssh/__init__.py +0 -0
  233. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/ssh/_fabric.py +0 -0
  234. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/string_tools.py +0 -0
  235. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/syringe.py +0 -0
  236. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/__init__.py +0 -0
  237. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/config/__init__.py +0 -0
  238. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/config/_pixi.py +0 -0
  239. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/config/_python.py +0 -0
  240. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/utils.py +0 -0
  241. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/v2/__init__.py +0 -0
  242. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/v2/local/__init__.py +0 -0
  243. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/v2/local/_utils.py +0 -0
  244. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/v2/local/collect.py +0 -0
  245. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/v2/local/collect_pixi.py +0 -0
  246. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/v2/local/deactivate.py +0 -0
  247. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/v2/local/deactivate_pixi.py +0 -0
  248. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/v2/local/delete.py +0 -0
  249. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/v2/local/reactivate.py +0 -0
  250. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/v2/local/reactivate_pixi.py +0 -0
  251. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/v2/ssh/__init__.py +0 -0
  252. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/v2/ssh/_pixi_slurm_ssh.py +0 -0
  253. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/v2/ssh/_utils.py +0 -0
  254. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/v2/ssh/collect.py +0 -0
  255. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/v2/ssh/collect_pixi.py +0 -0
  256. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/v2/ssh/deactivate.py +0 -0
  257. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/v2/ssh/deactivate_pixi.py +0 -0
  258. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/v2/ssh/delete.py +0 -0
  259. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/v2/ssh/reactivate.py +0 -0
  260. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/v2/ssh/reactivate_pixi.py +0 -0
  261. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/v2/templates/1_create_venv.sh +0 -0
  262. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/v2/templates/2_pip_install.sh +0 -0
  263. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/v2/templates/3_pip_freeze.sh +0 -0
  264. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/v2/templates/4_pip_show.sh +0 -0
  265. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/v2/templates/5_pip_install_from_freeze.sh +0 -0
  266. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/v2/templates/pixi_1_extract.sh +0 -0
  267. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/v2/templates/pixi_2_install.sh +0 -0
  268. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/v2/templates/pixi_3_post_install.sh +0 -0
  269. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/v2/utils_background.py +0 -0
  270. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/v2/utils_database.py +0 -0
  271. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/v2/utils_package_names.py +0 -0
  272. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/v2/utils_pixi.py +0 -0
  273. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/v2/utils_python_interpreter.py +0 -0
  274. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/tasks/v2/utils_templates.py +0 -0
  275. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/types/__init__.py +0 -0
  276. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/types/validators/__init__.py +0 -0
  277. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/types/validators/_common_validators.py +0 -0
  278. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/types/validators/_filter_validators.py +0 -0
  279. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/types/validators/_workflow_task_arguments_validators.py +0 -0
  280. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/urls.py +0 -0
  281. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/utils.py +0 -0
  282. {fractal_server-2.19.0a1 → fractal_server-2.19.1}/fractal_server/zip_tools.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fractal-server
3
- Version: 2.19.0a1
3
+ Version: 2.19.1
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>
@@ -0,0 +1 @@
1
+ __VERSION__ = "2.19.1"
@@ -27,10 +27,6 @@ class DatasetV2(SQLModel, table=True):
27
27
  sa_relationship_kwargs=dict(lazy="selectin"),
28
28
  )
29
29
 
30
- history: list[dict[str, Any]] = Field(
31
- sa_column=Column(JSONB, server_default="[]", nullable=False)
32
- )
33
-
34
30
  timestamp_created: datetime = Field(
35
31
  default_factory=get_timestamp,
36
32
  sa_column=Column(DateTime(timezone=True), nullable=False),
@@ -5,6 +5,7 @@ from pydantic import ConfigDict
5
5
  from sqlalchemy import Column
6
6
  from sqlalchemy.dialects.postgresql import JSONB
7
7
  from sqlalchemy.types import DateTime
8
+ from sqlalchemy.types import String
8
9
  from sqlmodel import Field
9
10
  from sqlmodel import Index
10
11
  from sqlmodel import SQLModel
@@ -44,6 +45,9 @@ class JobV2(SQLModel, table=True):
44
45
  project_dump: dict[str, Any] = Field(
45
46
  sa_column=Column(JSONB, nullable=False)
46
47
  )
48
+ fractal_server_version: str = Field(
49
+ sa_column=Column(String, server_default="pre-2.19.0", nullable=False)
50
+ )
47
51
 
48
52
  worker_init: str | None = None
49
53
  working_dir: str | None = None
@@ -4,6 +4,7 @@ from datetime import timezone
4
4
  from sqlalchemy import Column
5
5
  from sqlalchemy.dialects.postgresql import JSONB
6
6
  from sqlalchemy.types import DateTime
7
+ from sqlalchemy.types import String
7
8
  from sqlmodel import Field
8
9
  from sqlmodel import Relationship
9
10
  from sqlmodel import SQLModel
@@ -151,3 +152,6 @@ class TaskGroupActivityV2(SQLModel, table=True):
151
152
  default=None,
152
153
  sa_column=Column(DateTime(timezone=True)),
153
154
  )
155
+ fractal_server_version: str = Field(
156
+ sa_column=Column(String, server_default="pre-2.19.0", nullable=False)
157
+ )
@@ -32,3 +32,5 @@ class WorkflowV2(SQLModel, table=True):
32
32
  default_factory=get_timestamp,
33
33
  sa_column=Column(DateTime(timezone=True), nullable=False),
34
34
  )
35
+
36
+ description: str | None = Field(default=None, nullable=True)
@@ -39,3 +39,6 @@ class WorkflowTaskV2(SQLModel, table=True):
39
39
  task_type: str
40
40
  task_id: int = Field(foreign_key="taskv2.id")
41
41
  task: TaskV2 = Relationship(sa_relationship_kwargs=dict(lazy="selectin"))
42
+
43
+ alias: str | None = Field(default=None, nullable=True)
44
+ description: str | None = Field(default=None, nullable=True)
@@ -5,6 +5,7 @@ from fastapi import HTTPException
5
5
  from fastapi import Response
6
6
  from fastapi import status
7
7
 
8
+ from fractal_server import __VERSION__
8
9
  from fractal_server.app.db import AsyncSession
9
10
  from fractal_server.app.db import get_async_db
10
11
  from fractal_server.app.models import UserOAuth
@@ -93,6 +94,7 @@ async def deactivate_task_group(
93
94
  ),
94
95
  timestamp_started=get_timestamp(),
95
96
  timestamp_ended=get_timestamp(),
97
+ fractal_server_version=__VERSION__,
96
98
  )
97
99
  db.add(task_group)
98
100
  db.add(task_group_activity)
@@ -108,6 +110,7 @@ async def deactivate_task_group(
108
110
  pkg_name=task_group.pkg_name,
109
111
  version=task_group.version,
110
112
  timestamp_started=get_timestamp(),
113
+ fractal_server_version=__VERSION__,
111
114
  )
112
115
  db.add(task_group_activity)
113
116
  await db.commit()
@@ -188,6 +191,7 @@ async def reactivate_task_group(
188
191
  ),
189
192
  timestamp_started=get_timestamp(),
190
193
  timestamp_ended=get_timestamp(),
194
+ fractal_server_version=__VERSION__,
191
195
  )
192
196
  db.add(task_group)
193
197
  db.add(task_group_activity)
@@ -211,6 +215,7 @@ async def reactivate_task_group(
211
215
  pkg_name=task_group.pkg_name,
212
216
  version=task_group.version,
213
217
  timestamp_started=get_timestamp(),
218
+ fractal_server_version=__VERSION__,
214
219
  )
215
220
  db.add(task_group_activity)
216
221
  await db.commit()
@@ -264,6 +269,7 @@ async def delete_task_group(
264
269
  pkg_name=task_group.pkg_name,
265
270
  version=(task_group.version or "N/A"),
266
271
  timestamp_started=get_timestamp(),
272
+ fractal_server_version=__VERSION__,
267
273
  )
268
274
  db.add(task_group_activity)
269
275
  await db.commit()
@@ -14,7 +14,6 @@ from .job import router as job_router
14
14
  from .pre_submission_checks import router as pre_submission_checks_router
15
15
  from .project import router as project_router
16
16
  from .sharing import router as sharing_router
17
- from .status_legacy import router as status_legacy_router
18
17
  from .submit import router as submit_job_router
19
18
  from .task import router as task_router
20
19
  from .task_collection import router as task_collection_router
@@ -37,7 +36,6 @@ router_api.include_router(sharing_router, tags=["Project Sharing"])
37
36
  router_api.include_router(project_router, tags=["Project"])
38
37
  router_api.include_router(submit_job_router, tags=["Job"])
39
38
  router_api.include_router(history_router, tags=["History"])
40
- router_api.include_router(status_legacy_router, tags=["Status Legacy"])
41
39
 
42
40
 
43
41
  settings = Inject(get_settings)
@@ -400,6 +400,8 @@ async def _workflow_insert_task(
400
400
  args_non_parallel: dict[str, Any] | None = None,
401
401
  args_parallel: dict[str, Any] | None = None,
402
402
  type_filters: dict[str, bool] | None = None,
403
+ description: str | None = None,
404
+ alias: str | None = None,
403
405
  db: AsyncSession,
404
406
  ) -> WorkflowTaskV2:
405
407
  """
@@ -414,6 +416,8 @@ async def _workflow_insert_task(
414
416
  args_non_parallel:
415
417
  args_parallel:
416
418
  type_filters:
419
+ description:
420
+ alias:
417
421
  db:
418
422
  """
419
423
  db_workflow = await db.get(WorkflowV2, workflow_id)
@@ -448,6 +452,8 @@ async def _workflow_insert_task(
448
452
  meta_parallel=final_meta_parallel,
449
453
  meta_non_parallel=final_meta_non_parallel,
450
454
  type_filters=(type_filters or dict()),
455
+ description=description,
456
+ alias=alias,
451
457
  )
452
458
  db_workflow.task_list.append(wf_task)
453
459
  flag_modified(db_workflow, "task_list")
@@ -11,6 +11,7 @@ from fastapi import status
11
11
  from sqlmodel import select
12
12
  from sqlmodel import update
13
13
 
14
+ from fractal_server import __VERSION__
14
15
  from fractal_server.app.db import AsyncSession
15
16
  from fractal_server.app.db import get_async_db
16
17
  from fractal_server.app.models import Profile
@@ -216,11 +217,12 @@ async def submit_job(
216
217
  dataset.model_dump_json(exclude={"images", "history"})
217
218
  ),
218
219
  workflow_dump=json.loads(
219
- workflow.model_dump_json(exclude={"task_list"})
220
+ workflow.model_dump_json(exclude={"task_list", "description"})
220
221
  ),
221
222
  project_dump=json.loads(
222
223
  project.model_dump_json(exclude={"resource_id"})
223
224
  ),
225
+ fractal_server_version=__VERSION__,
224
226
  **job_create.model_dump(),
225
227
  )
226
228
 
@@ -14,6 +14,7 @@ from pydantic import BaseModel
14
14
  from pydantic import ValidationError
15
15
  from pydantic import model_validator
16
16
 
17
+ from fractal_server import __VERSION__
17
18
  from fractal_server.app.db import AsyncSession
18
19
  from fractal_server.app.db import get_async_db
19
20
  from fractal_server.app.models import UserOAuth
@@ -332,6 +333,7 @@ async def collect_tasks_pip(
332
333
  action=TaskGroupActivityAction.COLLECT,
333
334
  pkg_name=task_group.pkg_name,
334
335
  version=task_group.version,
336
+ fractal_server_version=__VERSION__,
335
337
  )
336
338
  db.add(task_group_activity)
337
339
  await db.commit()
@@ -10,6 +10,7 @@ from fastapi import Response
10
10
  from fastapi import UploadFile
11
11
  from fastapi import status
12
12
 
13
+ from fractal_server import __VERSION__
13
14
  from fractal_server.app.db import AsyncSession
14
15
  from fractal_server.app.db import get_async_db
15
16
  from fractal_server.app.models import UserOAuth
@@ -182,6 +183,7 @@ async def collect_task_pixi(
182
183
  action=TaskGroupActivityAction.COLLECT,
183
184
  pkg_name=task_group.pkg_name,
184
185
  version=task_group.version,
186
+ fractal_server_version=__VERSION__,
185
187
  )
186
188
  db.add(task_group_activity)
187
189
  await db.commit()
@@ -5,6 +5,7 @@ from fastapi import HTTPException
5
5
  from fastapi import Response
6
6
  from fastapi import status
7
7
 
8
+ from fractal_server import __VERSION__
8
9
  from fractal_server.app.db import AsyncSession
9
10
  from fractal_server.app.db import get_async_db
10
11
  from fractal_server.app.models import UserOAuth
@@ -99,6 +100,7 @@ async def deactivate_task_group(
99
100
  ),
100
101
  timestamp_started=get_timestamp(),
101
102
  timestamp_ended=get_timestamp(),
103
+ fractal_server_version=__VERSION__,
102
104
  )
103
105
  db.add(task_group)
104
106
  db.add(task_group_activity)
@@ -114,6 +116,7 @@ async def deactivate_task_group(
114
116
  pkg_name=task_group.pkg_name,
115
117
  version=task_group.version,
116
118
  timestamp_started=get_timestamp(),
119
+ fractal_server_version=__VERSION__,
117
120
  )
118
121
  task_group.active = False
119
122
  db.add(task_group)
@@ -202,6 +205,7 @@ async def reactivate_task_group(
202
205
  ),
203
206
  timestamp_started=get_timestamp(),
204
207
  timestamp_ended=get_timestamp(),
208
+ fractal_server_version=__VERSION__,
205
209
  )
206
210
  db.add(task_group)
207
211
  db.add(task_group_activity)
@@ -225,6 +229,7 @@ async def reactivate_task_group(
225
229
  pkg_name=task_group.pkg_name,
226
230
  version=task_group.version,
227
231
  timestamp_started=get_timestamp(),
232
+ fractal_server_version=__VERSION__,
228
233
  )
229
234
  db.add(task_group_activity)
230
235
  await db.commit()
@@ -288,6 +293,7 @@ async def delete_task_group(
288
293
  pkg_name=task_group.pkg_name,
289
294
  version=(task_group.version or "N/A"),
290
295
  timestamp_started=get_timestamp(),
296
+ fractal_server_version=__VERSION__,
291
297
  )
292
298
  db.add(task_group_activity)
293
299
  await db.commit()
@@ -149,7 +149,7 @@ async def update_workflow(
149
149
  db=db,
150
150
  )
151
151
 
152
- if patch.name:
152
+ if patch.name and patch.name != workflow.name:
153
153
  await _check_workflow_exists(
154
154
  name=patch.name, project_id=project_id, db=db
155
155
  )
@@ -93,6 +93,8 @@ async def create_workflowtask(
93
93
  args_non_parallel=wftask.args_non_parallel,
94
94
  args_parallel=wftask.args_parallel,
95
95
  type_filters=wftask.type_filters,
96
+ description=wftask.description,
97
+ alias=wftask.alias,
96
98
  db=db,
97
99
  )
98
100
 
@@ -193,13 +195,8 @@ async def update_workflowtask(
193
195
  if not actual_args:
194
196
  actual_args = None
195
197
  setattr(db_wf_task, key, actual_args)
196
- elif key in ["meta_parallel", "meta_non_parallel", "type_filters"]:
197
- setattr(db_wf_task, key, value)
198
198
  else:
199
- raise HTTPException(
200
- status_code=status.HTTP_422_UNPROCESSABLE_CONTENT,
201
- detail=f"patch_workflow_task endpoint cannot set {key=}",
202
- )
199
+ setattr(db_wf_task, key, value)
203
200
 
204
201
  await db.commit()
205
202
  await db.refresh(db_wf_task)
@@ -20,6 +20,7 @@ class WorkflowCreate(BaseModel):
20
20
  model_config = ConfigDict(extra="forbid")
21
21
 
22
22
  name: NonEmptyStr
23
+ description: NonEmptyStr | None = None
23
24
 
24
25
 
25
26
  class WorkflowRead(BaseModel):
@@ -29,6 +30,7 @@ class WorkflowRead(BaseModel):
29
30
  task_list: list[WorkflowTaskRead]
30
31
  project: ProjectRead
31
32
  timestamp_created: AwareDatetime
33
+ description: str | None
32
34
 
33
35
  @field_serializer("timestamp_created")
34
36
  def serialize_datetime(v: datetime) -> str:
@@ -44,6 +46,7 @@ class WorkflowUpdate(BaseModel):
44
46
 
45
47
  name: NonEmptyStr = None
46
48
  reordered_workflowtask_ids: ListUniqueNonNegativeInt | None = None
49
+ description: NonEmptyStr | None = None
47
50
 
48
51
 
49
52
  class WorkflowImport(BaseModel):
@@ -56,6 +59,7 @@ class WorkflowImport(BaseModel):
56
59
 
57
60
  model_config = ConfigDict(extra="forbid")
58
61
  name: NonEmptyStr
62
+ description: NonEmptyStr | None = None
59
63
  task_list: list[WorkflowTaskImport]
60
64
 
61
65
 
@@ -68,4 +72,5 @@ class WorkflowExport(BaseModel):
68
72
  """
69
73
 
70
74
  name: str
75
+ description: str | None
71
76
  task_list: list[WorkflowTaskExport]
@@ -6,6 +6,7 @@ from pydantic import Field
6
6
  from pydantic import model_validator
7
7
 
8
8
  from fractal_server.types import DictStrAny
9
+ from fractal_server.types import NonEmptyStr
9
10
  from fractal_server.types import TypeFilters
10
11
  from fractal_server.types import WorkflowTaskArgument
11
12
 
@@ -23,6 +24,8 @@ class WorkflowTaskCreate(BaseModel):
23
24
  args_non_parallel: WorkflowTaskArgument | None = None
24
25
  args_parallel: WorkflowTaskArgument | None = None
25
26
  type_filters: TypeFilters = Field(default_factory=dict)
27
+ description: NonEmptyStr | None = None
28
+ alias: NonEmptyStr | None = None
26
29
 
27
30
 
28
31
  class WorkflowTaskReplace(BaseModel):
@@ -49,6 +52,9 @@ class WorkflowTaskRead(BaseModel):
49
52
  task_id: int
50
53
  task: TaskRead
51
54
 
55
+ alias: str | None = None
56
+ description: str | None = None
57
+
52
58
 
53
59
  class WorkflowTaskReadWithWarning(WorkflowTaskRead):
54
60
  warning: str | None = None
@@ -62,6 +68,8 @@ class WorkflowTaskUpdate(BaseModel):
62
68
  args_non_parallel: WorkflowTaskArgument | None = None
63
69
  args_parallel: WorkflowTaskArgument | None = None
64
70
  type_filters: TypeFilters = None
71
+ description: NonEmptyStr | None = None
72
+ alias: NonEmptyStr | None = None
65
73
 
66
74
 
67
75
  class WorkflowTaskImport(BaseModel):
@@ -73,6 +81,8 @@ class WorkflowTaskImport(BaseModel):
73
81
  args_parallel: DictStrAny | None = None
74
82
  type_filters: TypeFilters | None = None
75
83
  input_filters: dict[str, Any] | None = None
84
+ description: NonEmptyStr | None = None
85
+ alias: NonEmptyStr | None = None
76
86
 
77
87
  task: TaskImport
78
88
 
@@ -111,5 +121,7 @@ class WorkflowTaskExport(BaseModel):
111
121
  args_non_parallel: dict[str, Any] | None = None
112
122
  args_parallel: dict[str, Any] | None = None
113
123
  type_filters: dict[str, bool] = Field(default_factory=dict)
124
+ description: str | None = None
125
+ alias: str | None = None
114
126
 
115
127
  task: TaskExport
@@ -191,17 +191,22 @@ class UserManager(IntegerIDMixin, BaseUserManager[UserOAuth, int]):
191
191
 
192
192
  @override
193
193
  async def validate_password(self, password: str, user: UserOAuth) -> None:
194
- # check password length
195
194
  min_length = 4
196
- max_length = 72
197
- if len(password) < min_length:
195
+ len_password = len(password)
196
+ if len_password < min_length:
198
197
  raise InvalidPasswordException(
199
- f"The password is too short (minimum length: {min_length})."
198
+ "The password is too short "
199
+ f"(length = {len_password}, minimum length = {min_length})."
200
200
  )
201
- if len(password.encode("utf-8")) > max_length:
201
+ max_length_in_bytes = 72
202
+ len_password_in_bytes = len(password.encode("utf-8"))
203
+ if len_password_in_bytes > max_length_in_bytes:
204
+ # See:
205
+ # https://github.com/pyca/bcrypt/blob/f0451e42e3ab6f6e1b9ac8b09bf04104bf8bdef8/src/_bcrypt/src/lib.rs#L85-L89
202
206
  raise InvalidPasswordException(
203
207
  "The password is too long "
204
- f"(maximum length: {max_length} bytes)."
208
+ f"(length = {len_password_in_bytes} bytes, "
209
+ f"maximum length = {max_length_in_bytes} bytes)."
205
210
  )
206
211
 
207
212
  @override
@@ -0,0 +1,41 @@
1
+ """drop dataset.history
2
+
3
+ Revision ID: 18a26fcdea5d
4
+ Revises: 1bf8785755f9
5
+ Create Date: 2026-01-29 10:15:18.467384
6
+
7
+ """
8
+
9
+ import sqlalchemy as sa
10
+ from alembic import op
11
+ from sqlalchemy.dialects import postgresql
12
+
13
+ # revision identifiers, used by Alembic.
14
+ revision = "18a26fcdea5d"
15
+ down_revision = "1bf8785755f9"
16
+ branch_labels = None
17
+ depends_on = None
18
+
19
+
20
+ def upgrade() -> None:
21
+ # ### commands auto generated by Alembic - please adjust! ###
22
+ with op.batch_alter_table("datasetv2", schema=None) as batch_op:
23
+ batch_op.drop_column("history")
24
+
25
+ # ### end Alembic commands ###
26
+
27
+
28
+ def downgrade() -> None:
29
+ # ### commands auto generated by Alembic - please adjust! ###
30
+ with op.batch_alter_table("datasetv2", schema=None) as batch_op:
31
+ batch_op.add_column(
32
+ sa.Column(
33
+ "history",
34
+ postgresql.JSONB(astext_type=sa.Text()),
35
+ server_default=sa.text("'[]'::json"),
36
+ autoincrement=False,
37
+ nullable=False,
38
+ )
39
+ )
40
+
41
+ # ### end Alembic commands ###
@@ -0,0 +1,53 @@
1
+ """Add description to workflow and description and alias to workflow task
2
+
3
+ Revision ID: 1bf8785755f9
4
+ Revises: 5fb08bf05b14
5
+ Create Date: 2026-01-26 09:03:18.396841
6
+
7
+ """
8
+
9
+ import sqlalchemy as sa
10
+ import sqlmodel
11
+ from alembic import op
12
+
13
+ # revision identifiers, used by Alembic.
14
+ revision = "1bf8785755f9"
15
+ down_revision = "5fb08bf05b14"
16
+ branch_labels = None
17
+ depends_on = None
18
+
19
+
20
+ def upgrade() -> None:
21
+ # ### commands auto generated by Alembic - please adjust! ###
22
+ with op.batch_alter_table("workflowtaskv2", schema=None) as batch_op:
23
+ batch_op.add_column(
24
+ sa.Column(
25
+ "alias", sqlmodel.sql.sqltypes.AutoString(), nullable=True
26
+ )
27
+ )
28
+ batch_op.add_column(
29
+ sa.Column(
30
+ "description", sqlmodel.sql.sqltypes.AutoString(), nullable=True
31
+ )
32
+ )
33
+
34
+ with op.batch_alter_table("workflowv2", schema=None) as batch_op:
35
+ batch_op.add_column(
36
+ sa.Column(
37
+ "description", sqlmodel.sql.sqltypes.AutoString(), nullable=True
38
+ )
39
+ )
40
+
41
+ # ### end Alembic commands ###
42
+
43
+
44
+ def downgrade() -> None:
45
+ # ### commands auto generated by Alembic - please adjust! ###
46
+ with op.batch_alter_table("workflowv2", schema=None) as batch_op:
47
+ batch_op.drop_column("description")
48
+
49
+ with op.batch_alter_table("workflowtaskv2", schema=None) as batch_op:
50
+ batch_op.drop_column("description")
51
+ batch_op.drop_column("alias")
52
+
53
+ # ### end Alembic commands ###
@@ -0,0 +1,52 @@
1
+ """add fractal_server_version to jobv2 and taskgroupactivityv2
2
+
3
+ Revision ID: cfd13f7954e7
4
+ Revises: 18a26fcdea5d
5
+ Create Date: 2026-01-29 12:33:00.064562
6
+
7
+ """
8
+
9
+ import sqlalchemy as sa
10
+ from alembic import op
11
+
12
+ # revision identifiers, used by Alembic.
13
+ revision = "cfd13f7954e7"
14
+ down_revision = "18a26fcdea5d"
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("jobv2", schema=None) as batch_op:
22
+ batch_op.add_column(
23
+ sa.Column(
24
+ "fractal_server_version",
25
+ sa.String(),
26
+ server_default="pre-2.19.0",
27
+ nullable=False,
28
+ )
29
+ )
30
+
31
+ with op.batch_alter_table("taskgroupactivityv2", schema=None) as batch_op:
32
+ batch_op.add_column(
33
+ sa.Column(
34
+ "fractal_server_version",
35
+ sa.String(),
36
+ server_default="pre-2.19.0",
37
+ nullable=False,
38
+ )
39
+ )
40
+
41
+ # ### end Alembic commands ###
42
+
43
+
44
+ def downgrade() -> None:
45
+ # ### commands auto generated by Alembic - please adjust! ###
46
+ with op.batch_alter_table("taskgroupactivityv2", schema=None) as batch_op:
47
+ batch_op.drop_column("fractal_server_version")
48
+
49
+ with op.batch_alter_table("jobv2", schema=None) as batch_op:
50
+ batch_op.drop_column("fractal_server_version")
51
+
52
+ # ### end Alembic commands ###
@@ -31,6 +31,7 @@ class SlurmConfigSet(BaseModel):
31
31
  time:
32
32
  exclude:
33
33
  nodelist:
34
+ nodes:
34
35
  account:
35
36
  extra_lines:
36
37
  gpus:
@@ -47,6 +48,7 @@ class SlurmConfigSet(BaseModel):
47
48
  gres: NonEmptyStr | None = None
48
49
  exclude: NonEmptyStr | None = None
49
50
  nodelist: NonEmptyStr | None = None
51
+ nodes: int | None = None
50
52
  time: NonEmptyStr | None = None
51
53
  account: NonEmptyStr | None = None
52
54
  extra_lines: list[NonEmptyStr] = Field(default_factory=list)
@@ -41,6 +41,7 @@ STDERR_IGNORE_PATTERNS = [
41
41
  "step creation temporarily disabled, retrying",
42
42
  "step creation still disabled, retrying",
43
43
  "srun: step created for stepid=",
44
+ "srun: warning: can't run 1 processes on ",
44
45
  ]
45
46
 
46
47
 
@@ -118,6 +118,7 @@ def _get_slurm_config_internal(
118
118
  "gpus",
119
119
  "constraint",
120
120
  "nodelist",
121
+ "nodes",
121
122
  "exclude",
122
123
  ]:
123
124
  value = wftask_meta.get(key, None)
@@ -39,6 +39,7 @@ class SlurmConfig(BaseModel):
39
39
  gpus: Corresponds to SLURM option.
40
40
  time: Corresponds to SLURM option (WARNING: not fully supported).
41
41
  nodelist: Corresponds to SLURM option.
42
+ nodes: Corresponds to SLURM option.
42
43
  exclude: Corresponds to SLURM option.
43
44
  prefix: Prefix of configuration lines in SLURM submission scripts.
44
45
  shebang_line: Shebang line for SLURM submission scripts.
@@ -87,6 +88,7 @@ class SlurmConfig(BaseModel):
87
88
  time: str | None = None
88
89
  account: str | None = None
89
90
  nodelist: str | None = None
91
+ nodes: int | None = None
90
92
  exclude: str | None = None
91
93
 
92
94
  # Free-field attribute for extra lines to be added to the SLURM job
@@ -188,6 +190,7 @@ class SlurmConfig(BaseModel):
188
190
  "account",
189
191
  "exclude",
190
192
  "nodelist",
193
+ "nodes",
191
194
  ]:
192
195
  value = getattr(self, key)
193
196
  if value is not None:
@@ -13,7 +13,6 @@ from typing import Protocol
13
13
 
14
14
  from sqlalchemy.orm import Session as DBSyncSession
15
15
 
16
- from fractal_server import __VERSION__
17
16
  from fractal_server.app.db import DB
18
17
  from fractal_server.app.models.v2 import DatasetV2
19
18
  from fractal_server.app.models.v2 import JobV2
@@ -224,7 +223,6 @@ def submit_workflow(
224
223
  f'Start execution of workflow "{workflow.name}"; '
225
224
  f"more logs at {str(log_file_path)}"
226
225
  )
227
- logger.debug(f"fractal_server.__VERSION__: {__VERSION__}")
228
226
  logger.debug(f"Resource name: {resource.name}")
229
227
  logger.debug(f"Profile name: {profile.name}")
230
228
  logger.debug(f"Username: {profile.username}")