fractal-server 2.19.0a0__tar.gz → 2.19.0a1__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 (279) hide show
  1. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/PKG-INFO +2 -2
  2. fractal_server-2.19.0a1/fractal_server/__init__.py +1 -0
  3. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/models/v2/task.py +0 -1
  4. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/admin/v2/task.py +0 -5
  5. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/api/v2/_aux_functions_task_lifecycle.py +1 -20
  6. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/api/v2/task_group.py +2 -24
  7. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/api/v2/workflow_import.py +12 -43
  8. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/auth/current_user.py +8 -0
  9. fractal_server-2.19.0a1/fractal_server/app/routes/aux/_versions.py +42 -0
  10. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/schemas/v2/__init__.py +0 -1
  11. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/schemas/v2/dumps.py +0 -1
  12. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/schemas/v2/task.py +0 -5
  13. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/schemas/v2/workflowtask.py +1 -2
  14. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/security/__init__.py +8 -3
  15. fractal_server-2.19.0a1/fractal_server/migrations/versions/5fb08bf05b14_drop_taskv2_source.py +36 -0
  16. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/pyproject.toml +3 -4
  17. fractal_server-2.19.0a0/fractal_server/__init__.py +0 -1
  18. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/LICENSE +0 -0
  19. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/README.md +0 -0
  20. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/__main__.py +0 -0
  21. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/alembic.ini +0 -0
  22. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/__init__.py +0 -0
  23. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/db/__init__.py +0 -0
  24. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/models/__init__.py +0 -0
  25. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/models/linkusergroup.py +0 -0
  26. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/models/linkuserproject.py +0 -0
  27. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/models/security.py +0 -0
  28. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/models/v2/__init__.py +0 -0
  29. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/models/v2/accounting.py +0 -0
  30. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/models/v2/dataset.py +0 -0
  31. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/models/v2/history.py +0 -0
  32. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/models/v2/job.py +0 -0
  33. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/models/v2/profile.py +0 -0
  34. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/models/v2/project.py +0 -0
  35. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/models/v2/resource.py +0 -0
  36. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/models/v2/task_group.py +0 -0
  37. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/models/v2/workflow.py +0 -0
  38. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/models/v2/workflowtask.py +0 -0
  39. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/__init__.py +0 -0
  40. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/admin/__init__.py +0 -0
  41. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/admin/v2/__init__.py +0 -0
  42. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/admin/v2/_aux_functions.py +0 -0
  43. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/admin/v2/accounting.py +0 -0
  44. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/admin/v2/impersonate.py +0 -0
  45. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/admin/v2/job.py +0 -0
  46. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/admin/v2/profile.py +0 -0
  47. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/admin/v2/resource.py +0 -0
  48. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/admin/v2/sharing.py +0 -0
  49. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/admin/v2/task_group.py +0 -0
  50. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/admin/v2/task_group_lifecycle.py +0 -0
  51. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/api/__init__.py +0 -0
  52. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/api/alive.py +0 -0
  53. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/api/settings.py +0 -0
  54. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/api/v2/__init__.py +0 -0
  55. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/api/v2/_aux_functions.py +0 -0
  56. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/api/v2/_aux_functions_history.py +0 -0
  57. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/api/v2/_aux_functions_sharing.py +0 -0
  58. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/api/v2/_aux_functions_task_version_update.py +0 -0
  59. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/api/v2/_aux_functions_tasks.py +0 -0
  60. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/api/v2/_aux_task_group_disambiguation.py +0 -0
  61. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/api/v2/dataset.py +0 -0
  62. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/api/v2/history.py +0 -0
  63. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/api/v2/images.py +0 -0
  64. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/api/v2/job.py +0 -0
  65. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/api/v2/pre_submission_checks.py +0 -0
  66. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/api/v2/project.py +0 -0
  67. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/api/v2/sharing.py +0 -0
  68. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/api/v2/status_legacy.py +0 -0
  69. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/api/v2/submit.py +0 -0
  70. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/api/v2/task.py +0 -0
  71. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/api/v2/task_collection.py +0 -0
  72. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/api/v2/task_collection_custom.py +0 -0
  73. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/api/v2/task_collection_pixi.py +0 -0
  74. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/api/v2/task_group_lifecycle.py +0 -0
  75. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/api/v2/task_version_update.py +0 -0
  76. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/api/v2/workflow.py +0 -0
  77. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/api/v2/workflowtask.py +0 -0
  78. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/auth/__init__.py +0 -0
  79. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/auth/_aux_auth.py +0 -0
  80. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/auth/group.py +0 -0
  81. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/auth/login.py +0 -0
  82. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/auth/oauth.py +0 -0
  83. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/auth/register.py +0 -0
  84. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/auth/router.py +0 -0
  85. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/auth/users.py +0 -0
  86. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/auth/viewer_paths.py +0 -0
  87. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/aux/__init__.py +0 -0
  88. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/aux/_job.py +0 -0
  89. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/aux/_runner.py +0 -0
  90. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/aux/validate_user_profile.py +0 -0
  91. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/routes/pagination.py +0 -0
  92. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/schemas/__init__.py +0 -0
  93. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/schemas/user.py +0 -0
  94. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/schemas/user_group.py +0 -0
  95. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/schemas/v2/accounting.py +0 -0
  96. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/schemas/v2/dataset.py +0 -0
  97. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/schemas/v2/history.py +0 -0
  98. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/schemas/v2/job.py +0 -0
  99. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/schemas/v2/manifest.py +0 -0
  100. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/schemas/v2/profile.py +0 -0
  101. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/schemas/v2/project.py +0 -0
  102. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/schemas/v2/resource.py +0 -0
  103. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/schemas/v2/sharing.py +0 -0
  104. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/schemas/v2/status_legacy.py +0 -0
  105. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/schemas/v2/task_collection.py +0 -0
  106. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/schemas/v2/task_group.py +0 -0
  107. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/schemas/v2/workflow.py +0 -0
  108. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/security/signup_email.py +0 -0
  109. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/app/shutdown.py +0 -0
  110. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/config/__init__.py +0 -0
  111. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/config/_data.py +0 -0
  112. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/config/_database.py +0 -0
  113. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/config/_email.py +0 -0
  114. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/config/_main.py +0 -0
  115. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/config/_oauth.py +0 -0
  116. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/config/_settings_config.py +0 -0
  117. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/data_migrations/tools.py +0 -0
  118. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/exceptions.py +0 -0
  119. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/gunicorn_fractal.py +0 -0
  120. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/images/__init__.py +0 -0
  121. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/images/models.py +0 -0
  122. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/images/status_tools.py +0 -0
  123. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/images/tools.py +0 -0
  124. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/logger.py +0 -0
  125. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/main.py +0 -0
  126. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/env.py +0 -0
  127. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/naming_convention.py +0 -0
  128. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/034a469ec2eb_task_groups.py +0 -0
  129. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/068496367952_drop_taskgroup_venv_size_and_files_.py +0 -0
  130. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/091b01f51f88_add_usergroup_and_linkusergroup_table.py +0 -0
  131. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/0f5f85bb2ae7_add_pre_pinned_packages.py +0 -0
  132. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/19eca0dd47a9_user_settings_project_dir.py +0 -0
  133. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/1a83a5260664_rename.py +0 -0
  134. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/1eac13a26c83_drop_v1_tables.py +0 -0
  135. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/316140ff7ee1_remove_usersettings_cache_dir.py +0 -0
  136. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/40d6d6511b20_add_index_to_history_models.py +0 -0
  137. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/45fbb391d7af_make_resource_id_fk_non_nullable.py +0 -0
  138. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/47351f8c7ebc_drop_dataset_filters.py +0 -0
  139. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/49d0856e9569_drop_table.py +0 -0
  140. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/4c308bcaea2b_add_task_args_schema_and_task_args_.py +0 -0
  141. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/4cedeb448a53_workflowtask_foreign_keys_not_nullables.py +0 -0
  142. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/501961cfcd85_remove_link_between_v1_and_v2_tasks_.py +0 -0
  143. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/50a13d6138fd_initial_schema.py +0 -0
  144. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/5bf02391cfef_v2.py +0 -0
  145. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/70e77f1c38b0_add_applyworkflow_first_task_index_and_.py +0 -0
  146. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/71eefd1dd202_add_slurm_accounts.py +0 -0
  147. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/7673fe18c05d_remove_project_dir_server_default.py +0 -0
  148. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/7910eed4cf97_user_project_dirs_and_usergroup_viewer_.py +0 -0
  149. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/791ce783d3d8_add_indices.py +0 -0
  150. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/83bc2ad3ffcc_2_17_0.py +0 -0
  151. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/84bf0fffde30_add_dumps_to_applyworkflow.py +0 -0
  152. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/88270f589c9b_add_prevent_new_submissions.py +0 -0
  153. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/8e8f227a3e36_update_taskv2_post_2_7_0.py +0 -0
  154. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/8f79bd162e35_add_docs_info_and_docs_link_to_task_.py +0 -0
  155. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/94a47ea2d3ff_remove_cache_dir_slurm_user_and_slurm_.py +0 -0
  156. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/969d84257cac_add_historyrun_task_id.py +0 -0
  157. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/97f444d47249_add_applyworkflow_project_dump.py +0 -0
  158. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/981d588fe248_add_executor_error_log.py +0 -0
  159. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/99ea79d9e5d2_add_dataset_history.py +0 -0
  160. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/9c5ae74c9b98_add_user_settings_table.py +0 -0
  161. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/9db60297b8b2_set_ondelete.py +0 -0
  162. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/9fd26a2b0de4_add_workflow_timestamp_created.py +0 -0
  163. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/a7f4d6137b53_add_workflow_dump_to_applyworkflow.py +0 -0
  164. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/af1ef1c83c9b_add_accounting_tables.py +0 -0
  165. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/af8673379a5c_drop_old_filter_columns.py +0 -0
  166. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/b1e7f7a1ff71_task_group_for_pixi.py +0 -0
  167. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/b3ffb095f973_json_to_jsonb.py +0 -0
  168. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/b7477cc98f45_2_18_1.py +0 -0
  169. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/bc0e8b3327a7_project_sharing.py +0 -0
  170. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/c90a7c76e996_job_id_in_history_run.py +0 -0
  171. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/caba9fb1ea5e_drop_useroauth_user_settings_id.py +0 -0
  172. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/d256a7379ab8_taskgroup_activity_and_venv_info_to_.py +0 -0
  173. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/d4fe3708d309_make_applyworkflow_workflow_dump_non_.py +0 -0
  174. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/da2cb2ac4255_user_group_viewer_paths.py +0 -0
  175. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/db09233ad13a_split_filters_and_keep_old_columns.py +0 -0
  176. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/e0e717ae2f26_delete_linkuserproject_ondelete_project.py +0 -0
  177. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/e53dc51fdf93_add_useroauth_is_guest.py +0 -0
  178. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/e75cac726012_make_applyworkflow_start_timestamp_not_.py +0 -0
  179. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/e81103413827_add_job_type_filters.py +0 -0
  180. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/efa89c30e0a4_add_project_timestamp_created.py +0 -0
  181. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/f0702066b007_one_submitted_job_per_dataset.py +0 -0
  182. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/f37aceb45062_make_historyunit_logfile_required.py +0 -0
  183. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/f384e1c0cf5d_drop_task_default_args_columns.py +0 -0
  184. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/migrations/versions/fbce16ff4e47_new_history_items.py +0 -0
  185. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/py.typed +0 -0
  186. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/__init__.py +0 -0
  187. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/components.py +0 -0
  188. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/config/__init__.py +0 -0
  189. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/config/_local.py +0 -0
  190. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/config/_slurm.py +0 -0
  191. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/config/slurm_mem_to_MB.py +0 -0
  192. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/exceptions.py +0 -0
  193. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/executors/__init__.py +0 -0
  194. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/executors/base_runner.py +0 -0
  195. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/executors/call_command_wrapper.py +0 -0
  196. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/executors/local/__init__.py +0 -0
  197. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/executors/local/get_local_config.py +0 -0
  198. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/executors/local/runner.py +0 -0
  199. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/executors/slurm_common/__init__.py +0 -0
  200. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/executors/slurm_common/_batching.py +0 -0
  201. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/executors/slurm_common/_job_states.py +0 -0
  202. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/executors/slurm_common/base_slurm_runner.py +0 -0
  203. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/executors/slurm_common/get_slurm_config.py +0 -0
  204. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/executors/slurm_common/remote.py +0 -0
  205. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/executors/slurm_common/slurm_config.py +0 -0
  206. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/executors/slurm_common/slurm_job_task_models.py +0 -0
  207. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/executors/slurm_ssh/__init__.py +0 -0
  208. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/executors/slurm_ssh/run_subprocess.py +0 -0
  209. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/executors/slurm_ssh/runner.py +0 -0
  210. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/executors/slurm_ssh/tar_commands.py +0 -0
  211. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/executors/slurm_sudo/__init__.py +0 -0
  212. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/executors/slurm_sudo/_subprocess_run_as_user.py +0 -0
  213. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/executors/slurm_sudo/runner.py +0 -0
  214. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/filenames.py +0 -0
  215. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/set_start_and_last_task_index.py +0 -0
  216. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/task_files.py +0 -0
  217. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/v2/__init__.py +0 -0
  218. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/v2/_local.py +0 -0
  219. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/v2/_slurm_ssh.py +0 -0
  220. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/v2/_slurm_sudo.py +0 -0
  221. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/v2/db_tools.py +0 -0
  222. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/v2/deduplicate_list.py +0 -0
  223. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/v2/merge_outputs.py +0 -0
  224. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/v2/runner.py +0 -0
  225. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/v2/runner_functions.py +0 -0
  226. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/v2/submit_workflow.py +0 -0
  227. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/v2/task_interface.py +0 -0
  228. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/runner/versions.py +0 -0
  229. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/ssh/__init__.py +0 -0
  230. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/ssh/_fabric.py +0 -0
  231. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/string_tools.py +0 -0
  232. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/syringe.py +0 -0
  233. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/__init__.py +0 -0
  234. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/config/__init__.py +0 -0
  235. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/config/_pixi.py +0 -0
  236. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/config/_python.py +0 -0
  237. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/utils.py +0 -0
  238. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/v2/__init__.py +0 -0
  239. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/v2/local/__init__.py +0 -0
  240. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/v2/local/_utils.py +0 -0
  241. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/v2/local/collect.py +0 -0
  242. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/v2/local/collect_pixi.py +0 -0
  243. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/v2/local/deactivate.py +0 -0
  244. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/v2/local/deactivate_pixi.py +0 -0
  245. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/v2/local/delete.py +0 -0
  246. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/v2/local/reactivate.py +0 -0
  247. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/v2/local/reactivate_pixi.py +0 -0
  248. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/v2/ssh/__init__.py +0 -0
  249. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/v2/ssh/_pixi_slurm_ssh.py +0 -0
  250. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/v2/ssh/_utils.py +0 -0
  251. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/v2/ssh/collect.py +0 -0
  252. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/v2/ssh/collect_pixi.py +0 -0
  253. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/v2/ssh/deactivate.py +0 -0
  254. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/v2/ssh/deactivate_pixi.py +0 -0
  255. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/v2/ssh/delete.py +0 -0
  256. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/v2/ssh/reactivate.py +0 -0
  257. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/v2/ssh/reactivate_pixi.py +0 -0
  258. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/v2/templates/1_create_venv.sh +0 -0
  259. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/v2/templates/2_pip_install.sh +0 -0
  260. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/v2/templates/3_pip_freeze.sh +0 -0
  261. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/v2/templates/4_pip_show.sh +0 -0
  262. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/v2/templates/5_pip_install_from_freeze.sh +0 -0
  263. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/v2/templates/pixi_1_extract.sh +0 -0
  264. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/v2/templates/pixi_2_install.sh +0 -0
  265. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/v2/templates/pixi_3_post_install.sh +0 -0
  266. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/v2/utils_background.py +0 -0
  267. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/v2/utils_database.py +0 -0
  268. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/v2/utils_package_names.py +0 -0
  269. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/v2/utils_pixi.py +0 -0
  270. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/v2/utils_python_interpreter.py +0 -0
  271. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/tasks/v2/utils_templates.py +0 -0
  272. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/types/__init__.py +0 -0
  273. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/types/validators/__init__.py +0 -0
  274. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/types/validators/_common_validators.py +0 -0
  275. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/types/validators/_filter_validators.py +0 -0
  276. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/types/validators/_workflow_task_arguments_validators.py +0 -0
  277. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/urls.py +0 -0
  278. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/fractal_server/utils.py +0 -0
  279. {fractal_server-2.19.0a0 → fractal_server-2.19.0a1}/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.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
@@ -0,0 +1 @@
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
  [project]
2
2
  name = "fractal-server"
3
- version = "2.19.0a0"
3
+ version = "2.19.0a1"
4
4
  description = "Backend component of the Fractal analytics platform"
5
5
  authors = [
6
6
  { name="Tommaso Comparin", email="tommaso.comparin@exact-lab.it" },
@@ -25,7 +25,7 @@ dependencies = [
25
25
  "pydantic-settings ==2.12.0",
26
26
  "packaging >= 25.0.0, <26.0.0",
27
27
  "fabric >= 3.2.2, <3.3.0",
28
- "gunicorn >=23.0,<24.0",
28
+ "gunicorn >=24.1,<25",
29
29
  "psycopg[binary] >= 3.1.0, <4.0.0",
30
30
  "tomli_w >=1.2.0, <1.3.0 "
31
31
  ]
@@ -48,7 +48,6 @@ dev = [
48
48
  "devtools ==0.12",
49
49
  "pytest-asyncio >= 1.2.0,<1.3.0",
50
50
  "bumpver >=2024.0",
51
- "pre-commit ==4.2.0",
52
51
  "coverage>=7.12.0,<7.13.0",
53
52
  "pytest-docker >=3.2.0,<3.3.0",
54
53
  "pytest-subprocess >=1.5.0,<1.6.0",
@@ -93,7 +92,7 @@ filterwarnings = [
93
92
  markers = ["container", "ssh", "fails_on_macos", "oauth"]
94
93
 
95
94
  [tool.bumpver]
96
- current_version = "2.19.0a0"
95
+ current_version = "2.19.0a1"
97
96
  version_pattern = "MAJOR.MINOR.PATCH[PYTAGNUM]"
98
97
  commit_message = "bump version {old_version} -> {new_version}"
99
98
  commit = true
@@ -1 +0,0 @@
1
- __VERSION__ = "2.19.0a0"