fractal-server 2.18.5__tar.gz → 2.19.0__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.18.5 → fractal_server-2.19.0}/PKG-INFO +3 -3
  2. fractal_server-2.19.0/fractal_server/__init__.py +1 -0
  3. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/db/__init__.py +1 -7
  4. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/models/security.py +16 -0
  5. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/models/v2/dataset.py +0 -4
  6. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/models/v2/job.py +4 -0
  7. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/models/v2/task.py +0 -1
  8. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/models/v2/task_group.py +4 -0
  9. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/models/v2/workflow.py +2 -0
  10. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/models/v2/workflowtask.py +3 -0
  11. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/admin/v2/job.py +0 -2
  12. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/admin/v2/sharing.py +47 -0
  13. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/admin/v2/task.py +0 -5
  14. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/admin/v2/task_group_lifecycle.py +6 -0
  15. fractal_server-2.19.0/fractal_server/app/routes/api/__init__.py +9 -0
  16. fractal_server-2.19.0/fractal_server/app/routes/api/alive.py +13 -0
  17. fractal_server-2.18.5/fractal_server/app/routes/api/__init__.py → fractal_server-2.19.0/fractal_server/app/routes/api/settings.py +5 -18
  18. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/api/v2/__init__.py +0 -2
  19. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/api/v2/_aux_functions_task_lifecycle.py +1 -20
  20. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/api/v2/dataset.py +9 -8
  21. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/api/v2/history.py +8 -8
  22. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/api/v2/images.py +6 -6
  23. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/api/v2/job.py +10 -12
  24. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/api/v2/pre_submission_checks.py +3 -3
  25. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/api/v2/project.py +7 -9
  26. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/api/v2/sharing.py +17 -9
  27. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/api/v2/submit.py +5 -3
  28. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/api/v2/task.py +7 -9
  29. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/api/v2/task_collection.py +4 -2
  30. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/api/v2/task_collection_custom.py +2 -2
  31. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/api/v2/task_collection_pixi.py +4 -2
  32. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/api/v2/task_group.py +10 -30
  33. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/api/v2/task_group_lifecycle.py +10 -4
  34. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/api/v2/task_version_update.py +4 -3
  35. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/api/v2/workflow.py +10 -11
  36. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/api/v2/workflow_import.py +14 -45
  37. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/api/v2/workflowtask.py +7 -12
  38. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/auth/__init__.py +18 -1
  39. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/auth/current_user.py +8 -0
  40. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/auth/oauth.py +3 -1
  41. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/auth/users.py +11 -0
  42. fractal_server-2.19.0/fractal_server/app/routes/aux/_versions.py +42 -0
  43. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/schemas/user.py +7 -0
  44. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/schemas/v2/__init__.py +0 -1
  45. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/schemas/v2/dumps.py +0 -1
  46. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/schemas/v2/task.py +0 -5
  47. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/schemas/v2/workflow.py +2 -0
  48. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/schemas/v2/workflowtask.py +6 -2
  49. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/security/__init__.py +8 -3
  50. fractal_server-2.19.0/fractal_server/migrations/versions/18a26fcdea5d_drop_dataset_history.py +41 -0
  51. fractal_server-2.19.0/fractal_server/migrations/versions/1bf8785755f9_add_description_to_workflow_and_.py +53 -0
  52. fractal_server-2.19.0/fractal_server/migrations/versions/5fb08bf05b14_drop_taskv2_source.py +36 -0
  53. fractal_server-2.19.0/fractal_server/migrations/versions/cfd13f7954e7_add_fractal_server_version_to_jobv2_and_.py +52 -0
  54. fractal_server-2.19.0/fractal_server/migrations/versions/e53dc51fdf93_add_useroauth_is_guest.py +36 -0
  55. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/executors/local/runner.py +2 -0
  56. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/executors/slurm_ssh/runner.py +5 -0
  57. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/executors/slurm_sudo/runner.py +5 -0
  58. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/v2/runner.py +0 -1
  59. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/v2/submit_workflow.py +0 -3
  60. {fractal_server-2.18.5 → fractal_server-2.19.0}/pyproject.toml +5 -7
  61. fractal_server-2.18.5/fractal_server/__init__.py +0 -1
  62. fractal_server-2.18.5/fractal_server/app/routes/api/v2/status_legacy.py +0 -156
  63. {fractal_server-2.18.5 → fractal_server-2.19.0}/LICENSE +0 -0
  64. {fractal_server-2.18.5 → fractal_server-2.19.0}/README.md +0 -0
  65. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/__main__.py +0 -0
  66. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/alembic.ini +0 -0
  67. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/__init__.py +0 -0
  68. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/models/__init__.py +0 -0
  69. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/models/linkusergroup.py +0 -0
  70. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/models/linkuserproject.py +0 -0
  71. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/models/v2/__init__.py +0 -0
  72. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/models/v2/accounting.py +0 -0
  73. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/models/v2/history.py +0 -0
  74. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/models/v2/profile.py +0 -0
  75. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/models/v2/project.py +0 -0
  76. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/models/v2/resource.py +0 -0
  77. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/__init__.py +0 -0
  78. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/admin/__init__.py +0 -0
  79. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/admin/v2/__init__.py +0 -0
  80. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/admin/v2/_aux_functions.py +0 -0
  81. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/admin/v2/accounting.py +0 -0
  82. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/admin/v2/impersonate.py +0 -0
  83. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/admin/v2/profile.py +0 -0
  84. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/admin/v2/resource.py +0 -0
  85. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/admin/v2/task_group.py +0 -0
  86. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/api/v2/_aux_functions.py +0 -0
  87. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/api/v2/_aux_functions_history.py +0 -0
  88. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/api/v2/_aux_functions_sharing.py +0 -0
  89. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/api/v2/_aux_functions_task_version_update.py +0 -0
  90. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/api/v2/_aux_functions_tasks.py +0 -0
  91. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/api/v2/_aux_task_group_disambiguation.py +0 -0
  92. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/auth/_aux_auth.py +0 -0
  93. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/auth/group.py +0 -0
  94. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/auth/login.py +0 -0
  95. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/auth/register.py +0 -0
  96. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/auth/router.py +0 -0
  97. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/auth/viewer_paths.py +0 -0
  98. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/aux/__init__.py +0 -0
  99. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/aux/_job.py +0 -0
  100. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/aux/_runner.py +0 -0
  101. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/aux/validate_user_profile.py +0 -0
  102. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/routes/pagination.py +0 -0
  103. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/schemas/__init__.py +0 -0
  104. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/schemas/user_group.py +0 -0
  105. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/schemas/v2/accounting.py +0 -0
  106. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/schemas/v2/dataset.py +0 -0
  107. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/schemas/v2/history.py +0 -0
  108. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/schemas/v2/job.py +0 -0
  109. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/schemas/v2/manifest.py +0 -0
  110. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/schemas/v2/profile.py +0 -0
  111. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/schemas/v2/project.py +0 -0
  112. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/schemas/v2/resource.py +0 -0
  113. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/schemas/v2/sharing.py +0 -0
  114. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/schemas/v2/status_legacy.py +0 -0
  115. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/schemas/v2/task_collection.py +0 -0
  116. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/schemas/v2/task_group.py +0 -0
  117. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/security/signup_email.py +0 -0
  118. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/app/shutdown.py +0 -0
  119. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/config/__init__.py +0 -0
  120. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/config/_data.py +0 -0
  121. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/config/_database.py +0 -0
  122. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/config/_email.py +0 -0
  123. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/config/_main.py +0 -0
  124. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/config/_oauth.py +0 -0
  125. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/config/_settings_config.py +0 -0
  126. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/data_migrations/tools.py +0 -0
  127. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/exceptions.py +0 -0
  128. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/gunicorn_fractal.py +0 -0
  129. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/images/__init__.py +0 -0
  130. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/images/models.py +0 -0
  131. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/images/status_tools.py +0 -0
  132. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/images/tools.py +0 -0
  133. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/logger.py +0 -0
  134. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/main.py +0 -0
  135. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/env.py +0 -0
  136. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/naming_convention.py +0 -0
  137. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/034a469ec2eb_task_groups.py +0 -0
  138. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/068496367952_drop_taskgroup_venv_size_and_files_.py +0 -0
  139. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/091b01f51f88_add_usergroup_and_linkusergroup_table.py +0 -0
  140. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/0f5f85bb2ae7_add_pre_pinned_packages.py +0 -0
  141. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/19eca0dd47a9_user_settings_project_dir.py +0 -0
  142. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/1a83a5260664_rename.py +0 -0
  143. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/1eac13a26c83_drop_v1_tables.py +0 -0
  144. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/316140ff7ee1_remove_usersettings_cache_dir.py +0 -0
  145. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/40d6d6511b20_add_index_to_history_models.py +0 -0
  146. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/45fbb391d7af_make_resource_id_fk_non_nullable.py +0 -0
  147. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/47351f8c7ebc_drop_dataset_filters.py +0 -0
  148. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/49d0856e9569_drop_table.py +0 -0
  149. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/4c308bcaea2b_add_task_args_schema_and_task_args_.py +0 -0
  150. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/4cedeb448a53_workflowtask_foreign_keys_not_nullables.py +0 -0
  151. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/501961cfcd85_remove_link_between_v1_and_v2_tasks_.py +0 -0
  152. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/50a13d6138fd_initial_schema.py +0 -0
  153. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/5bf02391cfef_v2.py +0 -0
  154. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/70e77f1c38b0_add_applyworkflow_first_task_index_and_.py +0 -0
  155. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/71eefd1dd202_add_slurm_accounts.py +0 -0
  156. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/7673fe18c05d_remove_project_dir_server_default.py +0 -0
  157. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/7910eed4cf97_user_project_dirs_and_usergroup_viewer_.py +0 -0
  158. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/791ce783d3d8_add_indices.py +0 -0
  159. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/83bc2ad3ffcc_2_17_0.py +0 -0
  160. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/84bf0fffde30_add_dumps_to_applyworkflow.py +0 -0
  161. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/88270f589c9b_add_prevent_new_submissions.py +0 -0
  162. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/8e8f227a3e36_update_taskv2_post_2_7_0.py +0 -0
  163. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/8f79bd162e35_add_docs_info_and_docs_link_to_task_.py +0 -0
  164. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/94a47ea2d3ff_remove_cache_dir_slurm_user_and_slurm_.py +0 -0
  165. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/969d84257cac_add_historyrun_task_id.py +0 -0
  166. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/97f444d47249_add_applyworkflow_project_dump.py +0 -0
  167. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/981d588fe248_add_executor_error_log.py +0 -0
  168. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/99ea79d9e5d2_add_dataset_history.py +0 -0
  169. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/9c5ae74c9b98_add_user_settings_table.py +0 -0
  170. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/9db60297b8b2_set_ondelete.py +0 -0
  171. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/9fd26a2b0de4_add_workflow_timestamp_created.py +0 -0
  172. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/a7f4d6137b53_add_workflow_dump_to_applyworkflow.py +0 -0
  173. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/af1ef1c83c9b_add_accounting_tables.py +0 -0
  174. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/af8673379a5c_drop_old_filter_columns.py +0 -0
  175. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/b1e7f7a1ff71_task_group_for_pixi.py +0 -0
  176. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/b3ffb095f973_json_to_jsonb.py +0 -0
  177. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/b7477cc98f45_2_18_1.py +0 -0
  178. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/bc0e8b3327a7_project_sharing.py +0 -0
  179. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/c90a7c76e996_job_id_in_history_run.py +0 -0
  180. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/caba9fb1ea5e_drop_useroauth_user_settings_id.py +0 -0
  181. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/d256a7379ab8_taskgroup_activity_and_venv_info_to_.py +0 -0
  182. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/d4fe3708d309_make_applyworkflow_workflow_dump_non_.py +0 -0
  183. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/da2cb2ac4255_user_group_viewer_paths.py +0 -0
  184. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/db09233ad13a_split_filters_and_keep_old_columns.py +0 -0
  185. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/e0e717ae2f26_delete_linkuserproject_ondelete_project.py +0 -0
  186. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/e75cac726012_make_applyworkflow_start_timestamp_not_.py +0 -0
  187. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/e81103413827_add_job_type_filters.py +0 -0
  188. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/efa89c30e0a4_add_project_timestamp_created.py +0 -0
  189. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/f0702066b007_one_submitted_job_per_dataset.py +0 -0
  190. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/f37aceb45062_make_historyunit_logfile_required.py +0 -0
  191. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/f384e1c0cf5d_drop_task_default_args_columns.py +0 -0
  192. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/migrations/versions/fbce16ff4e47_new_history_items.py +0 -0
  193. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/py.typed +0 -0
  194. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/__init__.py +0 -0
  195. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/components.py +0 -0
  196. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/config/__init__.py +0 -0
  197. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/config/_local.py +0 -0
  198. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/config/_slurm.py +0 -0
  199. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/config/slurm_mem_to_MB.py +0 -0
  200. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/exceptions.py +0 -0
  201. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/executors/__init__.py +0 -0
  202. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/executors/base_runner.py +0 -0
  203. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/executors/call_command_wrapper.py +0 -0
  204. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/executors/local/__init__.py +0 -0
  205. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/executors/local/get_local_config.py +0 -0
  206. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/executors/slurm_common/__init__.py +0 -0
  207. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/executors/slurm_common/_batching.py +0 -0
  208. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/executors/slurm_common/_job_states.py +0 -0
  209. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/executors/slurm_common/base_slurm_runner.py +0 -0
  210. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/executors/slurm_common/get_slurm_config.py +0 -0
  211. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/executors/slurm_common/remote.py +0 -0
  212. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/executors/slurm_common/slurm_config.py +0 -0
  213. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/executors/slurm_common/slurm_job_task_models.py +0 -0
  214. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/executors/slurm_ssh/__init__.py +0 -0
  215. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/executors/slurm_ssh/run_subprocess.py +0 -0
  216. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/executors/slurm_ssh/tar_commands.py +0 -0
  217. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/executors/slurm_sudo/__init__.py +0 -0
  218. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/executors/slurm_sudo/_subprocess_run_as_user.py +0 -0
  219. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/filenames.py +0 -0
  220. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/set_start_and_last_task_index.py +0 -0
  221. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/task_files.py +0 -0
  222. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/v2/__init__.py +0 -0
  223. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/v2/_local.py +0 -0
  224. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/v2/_slurm_ssh.py +0 -0
  225. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/v2/_slurm_sudo.py +0 -0
  226. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/v2/db_tools.py +0 -0
  227. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/v2/deduplicate_list.py +0 -0
  228. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/v2/merge_outputs.py +0 -0
  229. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/v2/runner_functions.py +0 -0
  230. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/v2/task_interface.py +0 -0
  231. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/runner/versions.py +0 -0
  232. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/ssh/__init__.py +0 -0
  233. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/ssh/_fabric.py +0 -0
  234. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/string_tools.py +0 -0
  235. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/syringe.py +0 -0
  236. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/__init__.py +0 -0
  237. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/config/__init__.py +0 -0
  238. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/config/_pixi.py +0 -0
  239. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/config/_python.py +0 -0
  240. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/utils.py +0 -0
  241. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/v2/__init__.py +0 -0
  242. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/v2/local/__init__.py +0 -0
  243. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/v2/local/_utils.py +0 -0
  244. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/v2/local/collect.py +0 -0
  245. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/v2/local/collect_pixi.py +0 -0
  246. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/v2/local/deactivate.py +0 -0
  247. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/v2/local/deactivate_pixi.py +0 -0
  248. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/v2/local/delete.py +0 -0
  249. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/v2/local/reactivate.py +0 -0
  250. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/v2/local/reactivate_pixi.py +0 -0
  251. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/v2/ssh/__init__.py +0 -0
  252. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/v2/ssh/_pixi_slurm_ssh.py +0 -0
  253. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/v2/ssh/_utils.py +0 -0
  254. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/v2/ssh/collect.py +0 -0
  255. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/v2/ssh/collect_pixi.py +0 -0
  256. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/v2/ssh/deactivate.py +0 -0
  257. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/v2/ssh/deactivate_pixi.py +0 -0
  258. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/v2/ssh/delete.py +0 -0
  259. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/v2/ssh/reactivate.py +0 -0
  260. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/v2/ssh/reactivate_pixi.py +0 -0
  261. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/v2/templates/1_create_venv.sh +0 -0
  262. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/v2/templates/2_pip_install.sh +0 -0
  263. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/v2/templates/3_pip_freeze.sh +0 -0
  264. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/v2/templates/4_pip_show.sh +0 -0
  265. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/v2/templates/5_pip_install_from_freeze.sh +0 -0
  266. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/v2/templates/pixi_1_extract.sh +0 -0
  267. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/v2/templates/pixi_2_install.sh +0 -0
  268. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/v2/templates/pixi_3_post_install.sh +0 -0
  269. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/v2/utils_background.py +0 -0
  270. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/v2/utils_database.py +0 -0
  271. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/v2/utils_package_names.py +0 -0
  272. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/v2/utils_pixi.py +0 -0
  273. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/v2/utils_python_interpreter.py +0 -0
  274. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/tasks/v2/utils_templates.py +0 -0
  275. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/types/__init__.py +0 -0
  276. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/types/validators/__init__.py +0 -0
  277. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/types/validators/_common_validators.py +0 -0
  278. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/types/validators/_filter_validators.py +0 -0
  279. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/types/validators/_workflow_task_arguments_validators.py +0 -0
  280. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/urls.py +0 -0
  281. {fractal_server-2.18.5 → fractal_server-2.19.0}/fractal_server/utils.py +0 -0
  282. {fractal_server-2.18.5 → fractal_server-2.19.0}/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.18.5
3
+ Version: 2.19.0
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,10 +17,10 @@ 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
- Requires-Python: >=3.11, <3.15
23
+ Requires-Python: >=3.12, <3.15
24
24
  Project-URL: changelog, https://github.com/fractal-analytics-platform/fractal-server/blob/main/CHANGELOG.md
25
25
  Project-URL: documentation, https://fractal-analytics-platform.github.io/fractal-server
26
26
  Project-URL: homepage, https://github.com/fractal-analytics-platform/fractal-server
@@ -0,0 +1 @@
1
+ __VERSION__ = "2.19.0"
@@ -54,7 +54,6 @@ class DB:
54
54
  cls._engine_async,
55
55
  class_=AsyncSession,
56
56
  expire_on_commit=False,
57
- future=True,
58
57
  )
59
58
 
60
59
  @classmethod
@@ -68,12 +67,7 @@ class DB:
68
67
  pool_pre_ping=True,
69
68
  )
70
69
 
71
- cls._sync_session_maker = sessionmaker(
72
- bind=cls._engine_sync,
73
- autocommit=False,
74
- autoflush=False,
75
- future=True,
76
- )
70
+ cls._sync_session_maker = sessionmaker(cls._engine_sync)
77
71
 
78
72
  @classmethod
79
73
  async def get_async_db(cls) -> AsyncGenerator[AsyncSession, None]:
@@ -7,6 +7,8 @@ from sqlalchemy import Column
7
7
  from sqlalchemy import String
8
8
  from sqlalchemy.dialects.postgresql import ARRAY
9
9
  from sqlalchemy.types import DateTime
10
+ from sqlmodel import BOOLEAN
11
+ from sqlmodel import CheckConstraint
10
12
  from sqlmodel import Field
11
13
  from sqlmodel import Relationship
12
14
  from sqlmodel import SQLModel
@@ -100,6 +102,13 @@ class UserOAuth(SQLModel, table=True):
100
102
  is_active: bool = Field(default=True, nullable=False)
101
103
  is_superuser: bool = Field(default=False, nullable=False)
102
104
  is_verified: bool = Field(default=False, nullable=False)
105
+ is_guest: bool = Field(
106
+ sa_column=Column(
107
+ BOOLEAN,
108
+ server_default="false",
109
+ nullable=False,
110
+ ),
111
+ )
103
112
 
104
113
  oauth_accounts: list["OAuthAccount"] = Relationship(
105
114
  back_populates="user",
@@ -120,6 +129,13 @@ class UserOAuth(SQLModel, table=True):
120
129
  sa_column=Column(ARRAY(String), server_default="{}"),
121
130
  )
122
131
 
132
+ __table_args__ = (
133
+ CheckConstraint(
134
+ "NOT (is_superuser AND is_guest)",
135
+ name="superuser_is_not_guest",
136
+ ),
137
+ )
138
+
123
139
 
124
140
  class UserGroup(SQLModel, table=True):
125
141
  """
@@ -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
@@ -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)
@@ -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)
@@ -176,7 +176,6 @@ async def view_single_job(
176
176
  status_code=status.HTTP_404_NOT_FOUND,
177
177
  detail=f"Job {job_id} not found",
178
178
  )
179
- await db.close()
180
179
 
181
180
  if show_tmp_logs and (job.status == JobStatusType.SUBMITTED):
182
181
  try:
@@ -249,7 +248,6 @@ async def update_job(
249
248
 
250
249
  await db.commit()
251
250
  await db.refresh(job)
252
- await db.close()
253
251
  return job
254
252
 
255
253
 
@@ -1,5 +1,8 @@
1
1
  from fastapi import APIRouter
2
2
  from fastapi import Depends
3
+ from fastapi import HTTPException
4
+ from fastapi import Response
5
+ from fastapi import status
3
6
  from sqlalchemy import func
4
7
  from sqlmodel import select
5
8
 
@@ -8,11 +11,16 @@ from fractal_server.app.db import get_async_db
8
11
  from fractal_server.app.models import LinkUserProjectV2
9
12
  from fractal_server.app.models import UserOAuth
10
13
  from fractal_server.app.models.v2 import ProjectV2
14
+ from fractal_server.app.routes.api.v2._aux_functions_sharing import (
15
+ get_pending_invitation_or_404,
16
+ )
11
17
  from fractal_server.app.routes.auth import current_superuser_act
18
+ from fractal_server.app.routes.auth._aux_auth import _user_or_404
12
19
  from fractal_server.app.routes.pagination import PaginationRequest
13
20
  from fractal_server.app.routes.pagination import PaginationResponse
14
21
  from fractal_server.app.routes.pagination import get_pagination_params
15
22
  from fractal_server.app.schemas.v2 import LinkUserProjectRead
23
+ from fractal_server.app.schemas.v2.sharing import ProjectPermissions
16
24
 
17
25
  router = APIRouter()
18
26
 
@@ -101,3 +109,42 @@ async def view_link_user_project(
101
109
  for linkuserproject, user_email, project_name in items
102
110
  ],
103
111
  )
112
+
113
+
114
+ @router.post("/verify/", status_code=200)
115
+ async def verify_invitation_for_guest(
116
+ guest_user_id: int,
117
+ project_id: int,
118
+ superuser: UserOAuth = Depends(current_superuser_act),
119
+ db: AsyncSession = Depends(get_async_db),
120
+ ) -> None:
121
+ """
122
+ Verify the invitation to join a project for a guest user
123
+
124
+ Note that a guest user would not be allowed to do this themselves.
125
+ """
126
+ # Get user and verify that they actually are a guest
127
+ guest_user = await _user_or_404(guest_user_id, db)
128
+ if not guest_user.is_guest:
129
+ raise HTTPException(
130
+ status_code=status.HTTP_422_UNPROCESSABLE_CONTENT,
131
+ detail="Cannot accept invitations for non-guest users.",
132
+ )
133
+
134
+ # Find verification and check that permissions are set to R
135
+ link = await get_pending_invitation_or_404(
136
+ user_id=guest_user_id, project_id=project_id, db=db
137
+ )
138
+ if link.permissions != ProjectPermissions.READ:
139
+ raise HTTPException(
140
+ status_code=status.HTTP_422_UNPROCESSABLE_CONTENT,
141
+ detail=(
142
+ "Guest users can only have 'r' permission "
143
+ f"(given: '{link.permissions}')"
144
+ ),
145
+ )
146
+ # Mark the invitation as verified
147
+ link.is_verified = True
148
+ await db.commit()
149
+
150
+ return Response(status_code=status.HTTP_200_OK)
@@ -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)
@@ -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()
@@ -0,0 +1,9 @@
1
+ from fastapi import APIRouter
2
+
3
+ from .alive import router as router_alive
4
+ from .settings import router as router_settings
5
+
6
+ router_api = APIRouter()
7
+
8
+ router_api.include_router(router_alive)
9
+ router_api.include_router(router_settings)
@@ -0,0 +1,13 @@
1
+ from fastapi import APIRouter
2
+
3
+ import fractal_server
4
+
5
+ router = APIRouter()
6
+
7
+
8
+ @router.get("/alive/")
9
+ async def alive():
10
+ return dict(
11
+ alive=True,
12
+ version=fractal_server.__VERSION__,
13
+ )
@@ -1,11 +1,6 @@
1
- """
2
- `api` module
3
- """
4
-
5
1
  from fastapi import APIRouter
6
2
  from fastapi import Depends
7
3
 
8
- import fractal_server
9
4
  from fractal_server.app.models import UserOAuth
10
5
  from fractal_server.app.routes.auth import current_superuser_act
11
6
  from fractal_server.config import get_db_settings
@@ -14,18 +9,10 @@ from fractal_server.config import get_oauth_settings
14
9
  from fractal_server.config import get_settings
15
10
  from fractal_server.syringe import Inject
16
11
 
17
- router_api = APIRouter()
18
-
19
-
20
- @router_api.get("/alive/")
21
- async def alive():
22
- return dict(
23
- alive=True,
24
- version=fractal_server.__VERSION__,
25
- )
12
+ router = APIRouter()
26
13
 
27
14
 
28
- @router_api.get("/settings/app/")
15
+ @router.get("/settings/app/")
29
16
  async def view_settings(
30
17
  user: UserOAuth = Depends(current_superuser_act),
31
18
  ):
@@ -33,7 +20,7 @@ async def view_settings(
33
20
  return settings.model_dump()
34
21
 
35
22
 
36
- @router_api.get("/settings/database/")
23
+ @router.get("/settings/database/")
37
24
  async def view_db_settings(
38
25
  user: UserOAuth = Depends(current_superuser_act),
39
26
  ):
@@ -41,7 +28,7 @@ async def view_db_settings(
41
28
  return settings.model_dump()
42
29
 
43
30
 
44
- @router_api.get("/settings/email/")
31
+ @router.get("/settings/email/")
45
32
  async def view_email_settings(
46
33
  user: UserOAuth = Depends(current_superuser_act),
47
34
  ):
@@ -49,7 +36,7 @@ async def view_email_settings(
49
36
  return settings.model_dump()
50
37
 
51
38
 
52
- @router_api.get("/settings/oauth/")
39
+ @router.get("/settings/oauth/")
53
40
  async def view_oauth_settings(
54
41
  user: UserOAuth = Depends(current_superuser_act),
55
42
  ):
@@ -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)
@@ -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,
@@ -13,7 +13,8 @@ from fractal_server.app.db import get_async_db
13
13
  from fractal_server.app.models import UserOAuth
14
14
  from fractal_server.app.models.v2 import DatasetV2
15
15
  from fractal_server.app.models.v2 import JobV2
16
- from fractal_server.app.routes.auth import current_user_act_ver_prof
16
+ from fractal_server.app.routes.auth import get_api_guest
17
+ from fractal_server.app.routes.auth import get_api_user
17
18
  from fractal_server.app.schemas.v2 import DatasetCreate
18
19
  from fractal_server.app.schemas.v2 import DatasetRead
19
20
  from fractal_server.app.schemas.v2 import DatasetUpdate
@@ -38,7 +39,7 @@ router = APIRouter()
38
39
  async def create_dataset(
39
40
  project_id: int,
40
41
  dataset: DatasetCreate,
41
- user: UserOAuth = Depends(current_user_act_ver_prof),
42
+ user: UserOAuth = Depends(get_api_user),
42
43
  db: AsyncSession = Depends(get_async_db),
43
44
  ) -> DatasetRead | None:
44
45
  """
@@ -96,7 +97,7 @@ async def create_dataset(
96
97
  )
97
98
  async def read_dataset_list(
98
99
  project_id: int,
99
- user: UserOAuth = Depends(current_user_act_ver_prof),
100
+ user: UserOAuth = Depends(get_api_guest),
100
101
  db: AsyncSession = Depends(get_async_db),
101
102
  ) -> list[DatasetRead] | None:
102
103
  """
@@ -126,7 +127,7 @@ async def read_dataset_list(
126
127
  async def read_dataset(
127
128
  project_id: int,
128
129
  dataset_id: int,
129
- user: UserOAuth = Depends(current_user_act_ver_prof),
130
+ user: UserOAuth = Depends(get_api_guest),
130
131
  db: AsyncSession = Depends(get_async_db),
131
132
  ) -> DatasetRead | None:
132
133
  """
@@ -151,7 +152,7 @@ async def update_dataset(
151
152
  project_id: int,
152
153
  dataset_id: int,
153
154
  dataset_update: DatasetUpdate,
154
- user: UserOAuth = Depends(current_user_act_ver_prof),
155
+ user: UserOAuth = Depends(get_api_user),
155
156
  db: AsyncSession = Depends(get_async_db),
156
157
  ) -> DatasetRead | None:
157
158
  """
@@ -182,7 +183,7 @@ async def update_dataset(
182
183
  async def delete_dataset(
183
184
  project_id: int,
184
185
  dataset_id: int,
185
- user: UserOAuth = Depends(current_user_act_ver_prof),
186
+ user: UserOAuth = Depends(get_api_user),
186
187
  db: AsyncSession = Depends(get_async_db),
187
188
  ) -> Response:
188
189
  """
@@ -226,7 +227,7 @@ async def delete_dataset(
226
227
  async def export_dataset(
227
228
  project_id: int,
228
229
  dataset_id: int,
229
- user: UserOAuth = Depends(current_user_act_ver_prof),
230
+ user: UserOAuth = Depends(get_api_guest),
230
231
  db: AsyncSession = Depends(get_async_db),
231
232
  ) -> DatasetExport | None:
232
233
  """
@@ -252,7 +253,7 @@ async def export_dataset(
252
253
  async def import_dataset(
253
254
  project_id: int,
254
255
  dataset: DatasetImport,
255
- user: UserOAuth = Depends(current_user_act_ver_prof),
256
+ user: UserOAuth = Depends(get_api_user),
256
257
  db: AsyncSession = Depends(get_async_db),
257
258
  ) -> DatasetRead | None:
258
259
  """
@@ -14,7 +14,7 @@ from fractal_server.app.models.v2 import HistoryRun
14
14
  from fractal_server.app.models.v2 import HistoryUnit
15
15
  from fractal_server.app.models.v2 import JobV2
16
16
  from fractal_server.app.models.v2 import TaskV2
17
- from fractal_server.app.routes.auth import current_user_act_ver_prof
17
+ from fractal_server.app.routes.auth import get_api_guest
18
18
  from fractal_server.app.routes.pagination import PaginationRequest
19
19
  from fractal_server.app.routes.pagination import PaginationResponse
20
20
  from fractal_server.app.routes.pagination import get_pagination_params
@@ -71,7 +71,7 @@ async def get_workflow_tasks_statuses(
71
71
  project_id: int,
72
72
  dataset_id: int,
73
73
  workflow_id: int,
74
- user: UserOAuth = Depends(current_user_act_ver_prof),
74
+ user: UserOAuth = Depends(get_api_guest),
75
75
  db: AsyncSession = Depends(get_async_db),
76
76
  ) -> JSONResponse:
77
77
  # Access control
@@ -186,7 +186,7 @@ async def get_history_run_list(
186
186
  project_id: int,
187
187
  dataset_id: int,
188
188
  workflowtask_id: int,
189
- user: UserOAuth = Depends(current_user_act_ver_prof),
189
+ user: UserOAuth = Depends(get_api_guest),
190
190
  db: AsyncSession = Depends(get_async_db),
191
191
  ) -> list[HistoryRunReadAggregated]:
192
192
  # Access control
@@ -279,7 +279,7 @@ async def get_history_run_units(
279
279
  workflowtask_id: int,
280
280
  history_run_id: int,
281
281
  unit_status: HistoryUnitStatus | None = None,
282
- user: UserOAuth = Depends(current_user_act_ver_prof),
282
+ user: UserOAuth = Depends(get_api_guest),
283
283
  db: AsyncSession = Depends(get_async_db),
284
284
  pagination: PaginationRequest = Depends(get_pagination_params),
285
285
  ) -> PaginationResponse[HistoryUnitRead]:
@@ -339,7 +339,7 @@ async def get_history_images(
339
339
  dataset_id: int,
340
340
  workflowtask_id: int,
341
341
  request_body: ImageQuery,
342
- user: UserOAuth = Depends(current_user_act_ver_prof),
342
+ user: UserOAuth = Depends(get_api_guest),
343
343
  db: AsyncSession = Depends(get_async_db),
344
344
  pagination: PaginationRequest = Depends(get_pagination_params),
345
345
  ) -> ImagePage:
@@ -423,7 +423,7 @@ async def get_history_images(
423
423
  async def get_image_log(
424
424
  project_id: int,
425
425
  request_data: ImageLogsRequest,
426
- user: UserOAuth = Depends(current_user_act_ver_prof),
426
+ user: UserOAuth = Depends(get_api_guest),
427
427
  db: AsyncSession = Depends(get_async_db),
428
428
  ) -> JSONResponse:
429
429
  # Access control
@@ -482,7 +482,7 @@ async def get_history_unit_log(
482
482
  history_unit_id: int,
483
483
  workflowtask_id: int,
484
484
  dataset_id: int,
485
- user: UserOAuth = Depends(current_user_act_ver_prof),
485
+ user: UserOAuth = Depends(get_api_guest),
486
486
  db: AsyncSession = Depends(get_async_db),
487
487
  ) -> JSONResponse:
488
488
  # Access control
@@ -535,7 +535,7 @@ async def get_history_unit_log(
535
535
  async def get_dataset_history(
536
536
  project_id: int,
537
537
  dataset_id: int,
538
- user: UserOAuth = Depends(current_user_act_ver_prof),
538
+ user: UserOAuth = Depends(get_api_guest),
539
539
  db: AsyncSession = Depends(get_async_db),
540
540
  ) -> list[HistoryRunRead]:
541
541
  """
@@ -12,7 +12,8 @@ from fractal_server.app.db import AsyncSession
12
12
  from fractal_server.app.db import get_async_db
13
13
  from fractal_server.app.models import HistoryImageCache
14
14
  from fractal_server.app.models import UserOAuth
15
- from fractal_server.app.routes.auth import current_user_act_ver_prof
15
+ from fractal_server.app.routes.auth import get_api_guest
16
+ from fractal_server.app.routes.auth import get_api_user
16
17
  from fractal_server.app.routes.pagination import PaginationRequest
17
18
  from fractal_server.app.routes.pagination import PaginationResponse
18
19
  from fractal_server.app.routes.pagination import get_pagination_params
@@ -62,7 +63,7 @@ async def post_new_image(
62
63
  project_id: int,
63
64
  dataset_id: int,
64
65
  new_image: SingleImage,
65
- user: UserOAuth = Depends(current_user_act_ver_prof),
66
+ user: UserOAuth = Depends(get_api_user),
66
67
  db: AsyncSession = Depends(get_async_db),
67
68
  ) -> Response:
68
69
  output = await _get_dataset_check_access(
@@ -118,7 +119,7 @@ async def query_dataset_images(
118
119
  dataset_id: int,
119
120
  query: ImageQueryWithZarrUrl | None = None,
120
121
  pagination: PaginationRequest = Depends(get_pagination_params),
121
- user: UserOAuth = Depends(current_user_act_ver_prof),
122
+ user: UserOAuth = Depends(get_api_guest),
122
123
  db: AsyncSession = Depends(get_async_db),
123
124
  ) -> ImagePage:
124
125
  page = pagination.page
@@ -193,7 +194,7 @@ async def delete_dataset_images(
193
194
  project_id: int,
194
195
  dataset_id: int,
195
196
  zarr_url: str,
196
- user: UserOAuth = Depends(current_user_act_ver_prof),
197
+ user: UserOAuth = Depends(get_api_user),
197
198
  db: AsyncSession = Depends(get_async_db),
198
199
  ) -> Response:
199
200
  output = await _get_dataset_check_access(
@@ -241,7 +242,7 @@ async def patch_dataset_image(
241
242
  project_id: int,
242
243
  dataset_id: int,
243
244
  image_update: SingleImageUpdate,
244
- user: UserOAuth = Depends(current_user_act_ver_prof),
245
+ user: UserOAuth = Depends(get_api_user),
245
246
  db: AsyncSession = Depends(get_async_db),
246
247
  ):
247
248
  output = await _get_dataset_check_access(
@@ -274,5 +275,4 @@ async def patch_dataset_image(
274
275
  flag_modified(db_dataset, "images")
275
276
 
276
277
  await db.commit()
277
- await db.close()
278
278
  return db_dataset.images[index]