fractal-server 2.17.0a5__tar.gz → 2.17.0a6__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 (265) hide show
  1. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/PKG-INFO +4 -5
  2. fractal_server-2.17.0a6/fractal_server/__init__.py +1 -0
  3. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/profile.py +14 -0
  4. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/task.py +9 -0
  5. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/task_group.py +11 -7
  6. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/__init__.py +9 -0
  7. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/submit.py +1 -3
  8. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/auth/current_user.py +9 -14
  9. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/auth/oauth.py +1 -1
  10. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/auth/users.py +1 -2
  11. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/user.py +3 -3
  12. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/__init__.py +1 -0
  13. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/task_group.py +4 -0
  14. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/config/__init__.py +6 -1
  15. fractal_server-2.17.0a6/fractal_server/config/_data.py +68 -0
  16. fractal_server-2.17.0a6/fractal_server/config/_main.py +68 -0
  17. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/config/_oauth.py +2 -2
  18. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/main.py +3 -2
  19. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/pyproject.toml +5 -6
  20. fractal_server-2.17.0a5/fractal_server/__init__.py +0 -1
  21. fractal_server-2.17.0a5/fractal_server/config/_main.py +0 -132
  22. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/LICENSE +0 -0
  23. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/README.md +0 -0
  24. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/__main__.py +0 -0
  25. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/alembic.ini +0 -0
  26. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/__init__.py +0 -0
  27. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/db/__init__.py +0 -0
  28. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/models/__init__.py +0 -0
  29. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/models/linkusergroup.py +0 -0
  30. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/models/linkuserproject.py +0 -0
  31. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/models/security.py +0 -0
  32. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/models/user_settings.py +0 -0
  33. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/__init__.py +0 -0
  34. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/accounting.py +0 -0
  35. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/dataset.py +0 -0
  36. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/history.py +0 -0
  37. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/job.py +0 -0
  38. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/profile.py +0 -0
  39. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/project.py +0 -0
  40. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/resource.py +0 -0
  41. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/task.py +0 -0
  42. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/task_group.py +0 -0
  43. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/workflow.py +0 -0
  44. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/workflowtask.py +0 -0
  45. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/__init__.py +0 -0
  46. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/__init__.py +0 -0
  47. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/__init__.py +0 -0
  48. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/_aux_functions.py +0 -0
  49. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/accounting.py +0 -0
  50. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/impersonate.py +0 -0
  51. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/job.py +0 -0
  52. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/project.py +0 -0
  53. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/resource.py +0 -0
  54. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/task_group_lifecycle.py +0 -0
  55. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/__init__.py +0 -0
  56. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/_aux_functions.py +0 -0
  57. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/_aux_functions_history.py +0 -0
  58. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/_aux_functions_task_lifecycle.py +0 -0
  59. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/_aux_functions_task_version_update.py +0 -0
  60. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/_aux_functions_tasks.py +0 -0
  61. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/_aux_task_group_disambiguation.py +0 -0
  62. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/dataset.py +0 -0
  63. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/history.py +0 -0
  64. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/images.py +0 -0
  65. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/job.py +0 -0
  66. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/pre_submission_checks.py +0 -0
  67. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/project.py +0 -0
  68. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/status_legacy.py +0 -0
  69. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/task.py +0 -0
  70. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/task_collection.py +0 -0
  71. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/task_collection_custom.py +0 -0
  72. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/task_collection_pixi.py +0 -0
  73. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/task_group.py +0 -0
  74. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/task_group_lifecycle.py +0 -0
  75. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/task_version_update.py +0 -0
  76. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/workflow.py +0 -0
  77. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/workflow_import.py +0 -0
  78. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/workflowtask.py +0 -0
  79. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/auth/__init__.py +0 -0
  80. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/auth/_aux_auth.py +0 -0
  81. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/auth/group.py +0 -0
  82. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/auth/login.py +0 -0
  83. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/auth/register.py +0 -0
  84. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/auth/router.py +0 -0
  85. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/aux/__init__.py +0 -0
  86. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/aux/_job.py +0 -0
  87. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/aux/_runner.py +0 -0
  88. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/aux/validate_user_profile.py +0 -0
  89. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/pagination.py +0 -0
  90. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/__init__.py +0 -0
  91. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/user_group.py +0 -0
  92. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/accounting.py +0 -0
  93. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/dataset.py +0 -0
  94. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/dumps.py +0 -0
  95. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/history.py +0 -0
  96. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/job.py +0 -0
  97. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/manifest.py +0 -0
  98. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/profile.py +0 -0
  99. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/project.py +0 -0
  100. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/resource.py +0 -0
  101. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/status_legacy.py +0 -0
  102. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/task.py +0 -0
  103. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/task_collection.py +0 -0
  104. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/workflow.py +0 -0
  105. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/workflowtask.py +0 -0
  106. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/security/__init__.py +0 -0
  107. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/security/signup_email.py +0 -0
  108. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/shutdown.py +0 -0
  109. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/config/_database.py +0 -0
  110. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/config/_email.py +0 -0
  111. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/config/_settings_config.py +0 -0
  112. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/data_migrations/2_14_10.py +0 -0
  113. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/data_migrations/README.md +0 -0
  114. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/data_migrations/tools.py +0 -0
  115. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/exceptions.py +0 -0
  116. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/gunicorn_fractal.py +0 -0
  117. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/images/__init__.py +0 -0
  118. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/images/models.py +0 -0
  119. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/images/status_tools.py +0 -0
  120. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/images/tools.py +0 -0
  121. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/logger.py +0 -0
  122. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/env.py +0 -0
  123. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/naming_convention.py +0 -0
  124. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/034a469ec2eb_task_groups.py +0 -0
  125. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/091b01f51f88_add_usergroup_and_linkusergroup_table.py +0 -0
  126. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/0f5f85bb2ae7_add_pre_pinned_packages.py +0 -0
  127. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/19eca0dd47a9_user_settings_project_dir.py +0 -0
  128. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/1a83a5260664_rename.py +0 -0
  129. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/1eac13a26c83_drop_v1_tables.py +0 -0
  130. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/316140ff7ee1_remove_usersettings_cache_dir.py +0 -0
  131. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/47351f8c7ebc_drop_dataset_filters.py +0 -0
  132. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/4c308bcaea2b_add_task_args_schema_and_task_args_.py +0 -0
  133. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/4cedeb448a53_workflowtask_foreign_keys_not_nullables.py +0 -0
  134. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/501961cfcd85_remove_link_between_v1_and_v2_tasks_.py +0 -0
  135. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/50a13d6138fd_initial_schema.py +0 -0
  136. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/5bf02391cfef_v2.py +0 -0
  137. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/70e77f1c38b0_add_applyworkflow_first_task_index_and_.py +0 -0
  138. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/71eefd1dd202_add_slurm_accounts.py +0 -0
  139. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/791ce783d3d8_add_indices.py +0 -0
  140. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/84bf0fffde30_add_dumps_to_applyworkflow.py +0 -0
  141. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/8e8f227a3e36_update_taskv2_post_2_7_0.py +0 -0
  142. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/8f79bd162e35_add_docs_info_and_docs_link_to_task_.py +0 -0
  143. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/90f6508c6379_drop_useroauth_username.py +0 -0
  144. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/94a47ea2d3ff_remove_cache_dir_slurm_user_and_slurm_.py +0 -0
  145. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/969d84257cac_add_historyrun_task_id.py +0 -0
  146. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/97f444d47249_add_applyworkflow_project_dump.py +0 -0
  147. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/981d588fe248_add_executor_error_log.py +0 -0
  148. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/99ea79d9e5d2_add_dataset_history.py +0 -0
  149. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/9c5ae74c9b98_add_user_settings_table.py +0 -0
  150. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/9db60297b8b2_set_ondelete.py +0 -0
  151. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/9fd26a2b0de4_add_workflow_timestamp_created.py +0 -0
  152. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/a7f4d6137b53_add_workflow_dump_to_applyworkflow.py +0 -0
  153. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/a80ac5a352bf_resource_profile.py +0 -0
  154. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/af1ef1c83c9b_add_accounting_tables.py +0 -0
  155. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/af8673379a5c_drop_old_filter_columns.py +0 -0
  156. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/b1e7f7a1ff71_task_group_for_pixi.py +0 -0
  157. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/b3ffb095f973_json_to_jsonb.py +0 -0
  158. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/c90a7c76e996_job_id_in_history_run.py +0 -0
  159. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/d256a7379ab8_taskgroup_activity_and_venv_info_to_.py +0 -0
  160. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/d4fe3708d309_make_applyworkflow_workflow_dump_non_.py +0 -0
  161. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/da2cb2ac4255_user_group_viewer_paths.py +0 -0
  162. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/db09233ad13a_split_filters_and_keep_old_columns.py +0 -0
  163. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/e75cac726012_make_applyworkflow_start_timestamp_not_.py +0 -0
  164. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/e81103413827_add_job_type_filters.py +0 -0
  165. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/efa89c30e0a4_add_project_timestamp_created.py +0 -0
  166. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/f37aceb45062_make_historyunit_logfile_required.py +0 -0
  167. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/f384e1c0cf5d_drop_task_default_args_columns.py +0 -0
  168. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/f65ee53991e3_user_settings_related.py +0 -0
  169. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/fbce16ff4e47_new_history_items.py +0 -0
  170. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/py.typed +0 -0
  171. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/__init__.py +0 -0
  172. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/components.py +0 -0
  173. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/config/__init__.py +0 -0
  174. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/config/_local.py +0 -0
  175. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/config/_slurm.py +0 -0
  176. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/config/slurm_mem_to_MB.py +0 -0
  177. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/exceptions.py +0 -0
  178. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/__init__.py +0 -0
  179. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/base_runner.py +0 -0
  180. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/call_command_wrapper.py +0 -0
  181. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/local/__init__.py +0 -0
  182. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/local/get_local_config.py +0 -0
  183. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/local/runner.py +0 -0
  184. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_common/__init__.py +0 -0
  185. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_common/_batching.py +0 -0
  186. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_common/_job_states.py +0 -0
  187. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_common/base_slurm_runner.py +0 -0
  188. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_common/get_slurm_config.py +0 -0
  189. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_common/remote.py +0 -0
  190. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_common/slurm_config.py +0 -0
  191. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_common/slurm_job_task_models.py +0 -0
  192. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_ssh/__init__.py +0 -0
  193. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_ssh/run_subprocess.py +0 -0
  194. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_ssh/runner.py +0 -0
  195. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_ssh/tar_commands.py +0 -0
  196. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_sudo/__init__.py +0 -0
  197. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_sudo/_subprocess_run_as_user.py +0 -0
  198. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_sudo/runner.py +0 -0
  199. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/filenames.py +0 -0
  200. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/set_start_and_last_task_index.py +0 -0
  201. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/task_files.py +0 -0
  202. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/v2/__init__.py +0 -0
  203. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/v2/_local.py +0 -0
  204. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/v2/_slurm_ssh.py +0 -0
  205. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/v2/_slurm_sudo.py +0 -0
  206. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/v2/db_tools.py +0 -0
  207. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/v2/deduplicate_list.py +0 -0
  208. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/v2/merge_outputs.py +0 -0
  209. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/v2/runner.py +0 -0
  210. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/v2/runner_functions.py +0 -0
  211. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/v2/submit_workflow.py +0 -0
  212. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/v2/task_interface.py +0 -0
  213. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/versions.py +0 -0
  214. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/ssh/__init__.py +0 -0
  215. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/ssh/_fabric.py +0 -0
  216. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/string_tools.py +0 -0
  217. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/syringe.py +0 -0
  218. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/__init__.py +0 -0
  219. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/config/__init__.py +0 -0
  220. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/config/_pixi.py +0 -0
  221. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/config/_python.py +0 -0
  222. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/utils.py +0 -0
  223. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/__init__.py +0 -0
  224. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/local/__init__.py +0 -0
  225. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/local/_utils.py +0 -0
  226. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/local/collect.py +0 -0
  227. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/local/collect_pixi.py +0 -0
  228. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/local/deactivate.py +0 -0
  229. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/local/deactivate_pixi.py +0 -0
  230. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/local/delete.py +0 -0
  231. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/local/reactivate.py +0 -0
  232. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/local/reactivate_pixi.py +0 -0
  233. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/ssh/__init__.py +0 -0
  234. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/ssh/_pixi_slurm_ssh.py +0 -0
  235. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/ssh/_utils.py +0 -0
  236. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/ssh/collect.py +0 -0
  237. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/ssh/collect_pixi.py +0 -0
  238. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/ssh/deactivate.py +0 -0
  239. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/ssh/deactivate_pixi.py +0 -0
  240. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/ssh/delete.py +0 -0
  241. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/ssh/reactivate.py +0 -0
  242. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/ssh/reactivate_pixi.py +0 -0
  243. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/templates/1_create_venv.sh +0 -0
  244. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/templates/2_pip_install.sh +0 -0
  245. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/templates/3_pip_freeze.sh +0 -0
  246. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/templates/4_pip_show.sh +0 -0
  247. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/templates/5_get_venv_size_and_file_number.sh +0 -0
  248. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/templates/6_pip_install_from_freeze.sh +0 -0
  249. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/templates/pixi_1_extract.sh +0 -0
  250. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/templates/pixi_2_install.sh +0 -0
  251. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/templates/pixi_3_post_install.sh +0 -0
  252. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/utils_background.py +0 -0
  253. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/utils_database.py +0 -0
  254. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/utils_package_names.py +0 -0
  255. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/utils_pixi.py +0 -0
  256. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/utils_python_interpreter.py +0 -0
  257. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/utils_templates.py +0 -0
  258. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/types/__init__.py +0 -0
  259. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/types/validators/__init__.py +0 -0
  260. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/types/validators/_common_validators.py +0 -0
  261. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/types/validators/_filter_validators.py +0 -0
  262. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/types/validators/_workflow_task_arguments_validators.py +0 -0
  263. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/urls.py +0 -0
  264. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/utils.py +0 -0
  265. {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/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.17.0a5
3
+ Version: 2.17.0a6
4
4
  Summary: Backend component of the Fractal analytics platform
5
5
  License-Expression: BSD-3-Clause
6
6
  License-File: LICENSE
@@ -13,18 +13,17 @@ Classifier: Programming Language :: Python :: 3.12
13
13
  Classifier: Programming Language :: Python :: 3.13
14
14
  Requires-Dist: alembic (>=1.13.1,<2.0.0)
15
15
  Requires-Dist: fabric (>=3.2.2,<3.3.0)
16
- Requires-Dist: fastapi (>=0.118.0,<0.119.0)
17
- Requires-Dist: fastapi-users[oauth] (>=14,<15)
16
+ Requires-Dist: fastapi (>=0.120.0,<0.121.0)
17
+ Requires-Dist: fastapi-users[oauth] (>=15,<16)
18
18
  Requires-Dist: gunicorn (>=23.0,<24.0)
19
19
  Requires-Dist: packaging (>=25.0.0,<26.0.0)
20
20
  Requires-Dist: psycopg[binary] (>=3.1.0,<4.0.0)
21
21
  Requires-Dist: pydantic (>=2.12.0,<2.13.0)
22
22
  Requires-Dist: pydantic-settings (==2.11.0)
23
- Requires-Dist: python-dotenv (>=1.1.0,<1.2.0)
24
23
  Requires-Dist: sqlalchemy[asyncio] (>=2.0.23,<2.1)
25
24
  Requires-Dist: sqlmodel (==0.0.27)
26
25
  Requires-Dist: tomli_w (>=1.2.0,<1.3.0)
27
- Requires-Dist: uvicorn (>=0.37.0,<0.38.0)
26
+ Requires-Dist: uvicorn (>=0.38.0,<0.39.0)
28
27
  Requires-Dist: uvicorn-worker (==0.4.0)
29
28
  Project-URL: Documentation, https://fractal-analytics-platform.github.io/fractal-server
30
29
  Project-URL: Homepage, https://github.com/fractal-analytics-platform/fractal-server
@@ -0,0 +1 @@
1
+ __VERSION__ = "2.17.0a6"
@@ -10,6 +10,7 @@ from ._aux_functions import _check_profile_name
10
10
  from ._aux_functions import _get_profile_or_404
11
11
  from fractal_server.app.db import AsyncSession
12
12
  from fractal_server.app.db import get_async_db
13
+ from fractal_server.app.models import Profile
13
14
  from fractal_server.app.models import UserOAuth
14
15
  from fractal_server.app.routes.auth import current_superuser_act
15
16
  from fractal_server.app.schemas.v2 import ProfileCreate
@@ -31,6 +32,19 @@ async def get_single_profile(
31
32
  return profile
32
33
 
33
34
 
35
+ @router.get("/", response_model=list[ProfileRead], status_code=200)
36
+ async def get_profile_list(
37
+ superuser: UserOAuth = Depends(current_superuser_act),
38
+ db: AsyncSession = Depends(get_async_db),
39
+ ) -> ProfileRead:
40
+ """
41
+ Query single `Profile`.
42
+ """
43
+ res = await db.execute(select(Profile).order_by(Profile.id))
44
+ profiles = res.scalars().all()
45
+ return profiles
46
+
47
+
34
48
  @router.put("/{profile_id}/", response_model=ProfileRead, status_code=200)
35
49
  async def put_profile(
36
50
  profile_id: int,
@@ -10,6 +10,7 @@ from sqlmodel import select
10
10
 
11
11
  from fractal_server.app.db import AsyncSession
12
12
  from fractal_server.app.db import get_async_db
13
+ from fractal_server.app.models import TaskGroupV2
13
14
  from fractal_server.app.models import UserOAuth
14
15
  from fractal_server.app.models.v2 import TaskV2
15
16
  from fractal_server.app.models.v2 import WorkflowTaskV2
@@ -58,6 +59,7 @@ async def query_tasks(
58
59
  category: str | None = None,
59
60
  modality: str | None = None,
60
61
  author: str | None = None,
62
+ resource_id: int | None = None,
61
63
  user: UserOAuth = Depends(current_superuser_act),
62
64
  db: AsyncSession = Depends(get_async_db),
63
65
  ) -> list[TaskV2Info]:
@@ -75,6 +77,7 @@ async def query_tasks(
75
77
  category:
76
78
  modality:
77
79
  author:
80
+ resource_id:
78
81
  """
79
82
 
80
83
  stm = select(TaskV2)
@@ -93,6 +96,12 @@ async def query_tasks(
93
96
  stm = stm.where(func.lower(TaskV2.modality) == modality.lower())
94
97
  if author is not None:
95
98
  stm = stm.where(TaskV2.authors.icontains(author))
99
+ if resource_id is not None:
100
+ stm = (
101
+ stm.join(TaskGroupV2)
102
+ .where(TaskGroupV2.id == TaskV2.taskgroupv2_id)
103
+ .where(TaskGroupV2.resource_id == resource_id)
104
+ )
96
105
 
97
106
  res = await db.execute(stm)
98
107
  task_list = res.scalars().all()
@@ -19,11 +19,12 @@ from fractal_server.app.routes.auth._aux_auth import (
19
19
  from fractal_server.app.schemas.v2 import TaskGroupActivityActionV2
20
20
  from fractal_server.app.schemas.v2 import TaskGroupActivityStatusV2
21
21
  from fractal_server.app.schemas.v2 import TaskGroupActivityV2Read
22
- from fractal_server.app.schemas.v2 import TaskGroupReadV2
22
+ from fractal_server.app.schemas.v2 import TaskGroupReadSuperuser
23
23
  from fractal_server.app.schemas.v2 import TaskGroupUpdateV2
24
24
  from fractal_server.app.schemas.v2 import TaskGroupV2OriginEnum
25
25
  from fractal_server.logger import set_logger
26
26
 
27
+
27
28
  router = APIRouter()
28
29
 
29
30
  logger = set_logger(__name__)
@@ -64,12 +65,12 @@ async def get_task_group_activity_list(
64
65
  return activities
65
66
 
66
67
 
67
- @router.get("/{task_group_id}/", response_model=TaskGroupReadV2)
68
+ @router.get("/{task_group_id}/", response_model=TaskGroupReadSuperuser)
68
69
  async def query_task_group(
69
70
  task_group_id: int,
70
71
  user: UserOAuth = Depends(current_superuser_act),
71
72
  db: AsyncSession = Depends(get_async_db),
72
- ) -> TaskGroupReadV2:
73
+ ) -> TaskGroupReadSuperuser:
73
74
  task_group = await db.get(TaskGroupV2, task_group_id)
74
75
  if task_group is None:
75
76
  raise HTTPException(
@@ -79,7 +80,7 @@ async def query_task_group(
79
80
  return task_group
80
81
 
81
82
 
82
- @router.get("/", response_model=list[TaskGroupReadV2])
83
+ @router.get("/", response_model=list[TaskGroupReadSuperuser])
83
84
  async def query_task_group_list(
84
85
  user_id: int | None = None,
85
86
  user_group_id: int | None = None,
@@ -89,9 +90,10 @@ async def query_task_group_list(
89
90
  origin: TaskGroupV2OriginEnum | None = None,
90
91
  timestamp_last_used_min: AwareDatetime | None = None,
91
92
  timestamp_last_used_max: AwareDatetime | None = None,
93
+ resource_id: int | None = None,
92
94
  user: UserOAuth = Depends(current_superuser_act),
93
95
  db: AsyncSession = Depends(get_async_db),
94
- ) -> list[TaskGroupReadV2]:
96
+ ) -> list[TaskGroupReadSuperuser]:
95
97
  stm = select(TaskGroupV2)
96
98
 
97
99
  if user_group_id is not None and private is True:
@@ -128,19 +130,21 @@ async def query_task_group_list(
128
130
  stm = stm.where(
129
131
  TaskGroupV2.timestamp_last_used <= timestamp_last_used_max
130
132
  )
133
+ if resource_id is not None:
134
+ stm = stm.where(TaskGroupV2.resource_id == resource_id)
131
135
 
132
136
  res = await db.execute(stm)
133
137
  task_groups_list = res.scalars().all()
134
138
  return task_groups_list
135
139
 
136
140
 
137
- @router.patch("/{task_group_id}/", response_model=TaskGroupReadV2)
141
+ @router.patch("/{task_group_id}/", response_model=TaskGroupReadSuperuser)
138
142
  async def patch_task_group(
139
143
  task_group_id: int,
140
144
  task_group_update: TaskGroupUpdateV2,
141
145
  user: UserOAuth = Depends(current_superuser_act),
142
146
  db: AsyncSession = Depends(get_async_db),
143
- ) -> list[TaskGroupReadV2]:
147
+ ) -> list[TaskGroupReadSuperuser]:
144
148
  task_group = await db.get(TaskGroupV2, task_group_id)
145
149
  if task_group is None:
146
150
  raise HTTPException(
@@ -7,6 +7,7 @@ from fastapi import Depends
7
7
  import fractal_server
8
8
  from fractal_server.app.models import UserOAuth
9
9
  from fractal_server.app.routes.auth import current_superuser_act
10
+ from fractal_server.config import get_data_settings
10
11
  from fractal_server.config import get_db_settings
11
12
  from fractal_server.config import get_email_settings
12
13
  from fractal_server.config import get_oauth_settings
@@ -48,6 +49,14 @@ async def view_email_settings(
48
49
  return settings.model_dump()
49
50
 
50
51
 
52
+ @router_api.get("/settings/data/")
53
+ async def view_data_settings(
54
+ user: UserOAuth = Depends(current_superuser_act),
55
+ ):
56
+ settings = Inject(get_data_settings)
57
+ return settings.model_dump()
58
+
59
+
51
60
  @router_api.get("/settings/oauth/")
52
61
  async def view_oauth_settings(
53
62
  user: UserOAuth = Depends(current_superuser_act),
@@ -196,10 +196,8 @@ async def apply_workflow(
196
196
  dataset_id=dataset_id,
197
197
  workflow_id=workflow_id,
198
198
  user_email=user.email,
199
- # The 'filters' field is not supported any more but still exists as a
200
- # database column, therefore we manually exclude it from dumps.
201
199
  dataset_dump=json.loads(
202
- dataset.model_dump_json(exclude={"images", "history", "filters"})
200
+ dataset.model_dump_json(exclude={"images", "history"})
203
201
  ),
204
202
  workflow_dump=json.loads(
205
203
  workflow.model_dump_json(exclude={"task_list"})
@@ -5,7 +5,6 @@ import os
5
5
 
6
6
  from fastapi import APIRouter
7
7
  from fastapi import Depends
8
- from fastapi_users import schemas
9
8
  from sqlalchemy.ext.asyncio import AsyncSession
10
9
  from sqlmodel import select
11
10
 
@@ -25,8 +24,8 @@ from fractal_server.app.schemas.user import UserUpdate
25
24
  from fractal_server.app.schemas.user import UserUpdateStrict
26
25
  from fractal_server.app.security import get_user_manager
27
26
  from fractal_server.app.security import UserManager
28
- from fractal_server.config import get_settings
29
- from fractal_server.config import ViewerAuthScheme
27
+ from fractal_server.config import DataAuthScheme
28
+ from fractal_server.config import get_data_settings
30
29
  from fractal_server.syringe import Inject
31
30
 
32
31
  router_current_user = APIRouter()
@@ -66,7 +65,7 @@ async def patch_current_user(
66
65
  # their own password
67
66
 
68
67
  user = await user_manager.update(update, current_user, safe=True)
69
- validated_user = schemas.model_validate(UserOAuth, user.model_dump())
68
+ validated_user = UserOAuth.model_validate(user.model_dump())
70
69
 
71
70
  patched_user = await db.get(
72
71
  UserOAuth, validated_user.id, populate_existing=True
@@ -117,14 +116,14 @@ async def get_current_user_allowed_viewer_paths(
117
116
  ) -> list[str]:
118
117
  """
119
118
  Returns the allowed viewer paths for current user, according to the
120
- selected FRACTAL_VIEWER_AUTHORIZATION_SCHEME
119
+ selected FRACTAL_DATA_AUTH_SCHEME
121
120
  """
122
121
 
123
- settings = Inject(get_settings)
122
+ data_settings = Inject(get_data_settings)
124
123
 
125
124
  authorized_paths = []
126
125
 
127
- if settings.FRACTAL_VIEWER_AUTHORIZATION_SCHEME == ViewerAuthScheme.NONE:
126
+ if data_settings.FRACTAL_DATA_AUTH_SCHEME == DataAuthScheme.NONE:
128
127
  return authorized_paths
129
128
 
130
129
  # Append `project_dir` to the list of authorized paths
@@ -133,20 +132,16 @@ async def get_current_user_allowed_viewer_paths(
133
132
  # If auth scheme is "users-folders" and `slurm_user` is set,
134
133
  # build and append the user folder
135
134
  if (
136
- settings.FRACTAL_VIEWER_AUTHORIZATION_SCHEME
137
- == ViewerAuthScheme.USERS_FOLDERS
135
+ data_settings.FRACTAL_DATA_AUTH_SCHEME == DataAuthScheme.USERS_FOLDERS
138
136
  and current_user.profile_id is not None
139
137
  ):
140
138
  profile = await db.get(Profile, current_user.profile_id)
141
139
  if profile is not None and profile.username is not None:
142
- base_folder = settings.FRACTAL_VIEWER_BASE_FOLDER
140
+ base_folder = data_settings.FRACTAL_DATA_BASE_FOLDER
143
141
  user_folder = os.path.join(base_folder, profile.username)
144
142
  authorized_paths.append(user_folder)
145
143
 
146
- if (
147
- settings.FRACTAL_VIEWER_AUTHORIZATION_SCHEME
148
- == ViewerAuthScheme.VIEWER_PATHS
149
- ):
144
+ if data_settings.FRACTAL_DATA_AUTH_SCHEME == DataAuthScheme.VIEWER_PATHS:
150
145
  # Returns the union of `viewer_paths` for all user's groups
151
146
  cmd = (
152
147
  select(UserGroup.viewer_paths)
@@ -29,7 +29,7 @@ def _create_client_oidc(cfg: OAuthSettings) -> OpenID:
29
29
  return OpenID(
30
30
  client_id=cfg.OAUTH_CLIENT_ID.get_secret_value(),
31
31
  client_secret=cfg.OAUTH_CLIENT_SECRET.get_secret_value(),
32
- openid_configuration_endpoint=cfg.OAUTH_OIDC_CONFIG_ENDPOINT,
32
+ openid_configuration_endpoint=cfg.OAUTH_OIDC_CONFIG_ENDPOINT.get_secret_value(), # noqa
33
33
  )
34
34
 
35
35
 
@@ -6,7 +6,6 @@ from fastapi import Depends
6
6
  from fastapi import HTTPException
7
7
  from fastapi import status
8
8
  from fastapi_users import exceptions
9
- from fastapi_users import schemas
10
9
  from fastapi_users.router.common import ErrorCode
11
10
  from sqlalchemy.ext.asyncio import AsyncSession
12
11
  from sqlmodel import func
@@ -80,7 +79,7 @@ async def patch_user(
80
79
  safe=False,
81
80
  request=None,
82
81
  )
83
- validated_user = schemas.model_validate(UserOAuth, user.model_dump())
82
+ validated_user = UserOAuth.model_validate(user.model_dump())
84
83
  patched_user = await db.get(
85
84
  UserOAuth, validated_user.id, populate_existing=True
86
85
  )
@@ -76,8 +76,8 @@ class UserUpdate(schemas.BaseUserUpdate):
76
76
  profile_id: int | None = None
77
77
  project_dir: Annotated[
78
78
  AbsolutePathStr, AfterValidator(_validate_cmd)
79
- ] | None = None
80
- slurm_accounts: ListUniqueNonEmptyString | None = None
79
+ ] = None
80
+ slurm_accounts: ListUniqueNonEmptyString = None
81
81
 
82
82
 
83
83
  class UserUpdateStrict(BaseModel):
@@ -89,7 +89,7 @@ class UserUpdateStrict(BaseModel):
89
89
  """
90
90
 
91
91
  model_config = ConfigDict(extra="forbid")
92
- slurm_accounts: ListUniqueNonEmptyString | None = None
92
+ slurm_accounts: ListUniqueNonEmptyString = None
93
93
 
94
94
 
95
95
  class UserCreate(schemas.BaseUserCreate):
@@ -52,6 +52,7 @@ from .task_group import TaskGroupActivityStatusV2 # noqa F401
52
52
  from .task_group import TaskGroupActivityV2Read # noqa F401
53
53
  from .task_group import TaskGroupCreateV2 # noqa F401
54
54
  from .task_group import TaskGroupCreateV2Strict # noqa F401
55
+ from .task_group import TaskGroupReadSuperuser # noqa F401
55
56
  from .task_group import TaskGroupReadV2 # noqa F401
56
57
  from .task_group import TaskGroupUpdateV2 # noqa F401
57
58
  from .task_group import TaskGroupV2OriginEnum # noqa F401
@@ -96,6 +96,10 @@ class TaskGroupReadV2(BaseModel):
96
96
  return v.isoformat()
97
97
 
98
98
 
99
+ class TaskGroupReadSuperuser(TaskGroupReadV2):
100
+ resource_id: int
101
+
102
+
99
103
  class TaskGroupUpdateV2(BaseModel):
100
104
  model_config = ConfigDict(extra="forbid")
101
105
  user_group_id: int | None = None
@@ -1,8 +1,9 @@
1
+ from ._data import DataAuthScheme # noqa F401
2
+ from ._data import DataSettings
1
3
  from ._database import DatabaseSettings
2
4
  from ._email import EmailSettings
3
5
  from ._email import PublicEmailSettings # noqa F401
4
6
  from ._main import Settings
5
- from ._main import ViewerAuthScheme # noqa F401
6
7
  from ._oauth import OAuthSettings
7
8
 
8
9
 
@@ -20,3 +21,7 @@ def get_email_settings(email_settings=EmailSettings()) -> EmailSettings:
20
21
 
21
22
  def get_oauth_settings(oauth_settings=OAuthSettings()) -> OAuthSettings:
22
23
  return oauth_settings
24
+
25
+
26
+ def get_data_settings(data_settings=DataSettings()) -> DataSettings:
27
+ return data_settings
@@ -0,0 +1,68 @@
1
+ from enum import StrEnum
2
+ from typing import Self
3
+
4
+ from pydantic import model_validator
5
+ from pydantic_settings import BaseSettings
6
+ from pydantic_settings import SettingsConfigDict
7
+
8
+ from ._settings_config import SETTINGS_CONFIG_DICT
9
+ from fractal_server.types import AbsolutePathStr
10
+
11
+
12
+ class DataAuthScheme(StrEnum):
13
+ VIEWER_PATHS = "viewer-paths"
14
+ USERS_FOLDERS = "users-folders"
15
+ NONE = "none"
16
+
17
+
18
+ class DataSettings(BaseSettings):
19
+ """
20
+ Settings for the `fractal-data` integration.
21
+ """
22
+
23
+ model_config = SettingsConfigDict(**SETTINGS_CONFIG_DICT)
24
+
25
+ FRACTAL_DATA_AUTH_SCHEME: DataAuthScheme = "none"
26
+ """
27
+ Defines how the list of allowed viewer paths is built.
28
+
29
+ This variable affects the `GET /auth/current-user/allowed-viewer-paths/`
30
+ response, which is then consumed by
31
+ [fractal-data](https://github.com/fractal-analytics-platform/fractal-data).
32
+
33
+ Options:
34
+
35
+ - "viewer-paths": The list of allowed viewer paths will include the user's
36
+ `project_dir` along with any path defined in user groups' `viewer_paths`
37
+ attributes.
38
+ - "users-folders": The list will consist of the user's `project_dir` and a
39
+ user-specific folder. The user folder is constructed by concatenating
40
+ the base folder `FRACTAL_DATA_BASE_FOLDER` with the user's profile
41
+ `username`.
42
+ - "none": An empty list will be returned, indicating no access to
43
+ viewer paths. Useful when vizarr viewer is not used.
44
+ """
45
+
46
+ FRACTAL_DATA_BASE_FOLDER: AbsolutePathStr | None = None
47
+ """
48
+ Base path to Zarr files that will be served by fractal-vizarr-viewer;
49
+ This variable is required and used only when
50
+ FRACTAL_DATA_AUTHORIZATION_SCHEME is set to "users-folders".
51
+ """
52
+
53
+ @model_validator(mode="after")
54
+ def check(self: Self) -> Self:
55
+ """
56
+ `FRACTAL_DATA_BASE_FOLDER` is required when
57
+ `FRACTAL_DATA_AUTHORIZATION_SCHEME` is set to `"users-folders"`.
58
+ """
59
+ if (
60
+ self.FRACTAL_DATA_AUTH_SCHEME == DataAuthScheme.USERS_FOLDERS
61
+ and self.FRACTAL_DATA_BASE_FOLDER is None
62
+ ):
63
+ raise ValueError(
64
+ "FRACTAL_DATA_BASE_FOLDER is required when "
65
+ "FRACTAL_DATA_AUTH_SCHEME is set to "
66
+ "users-folders"
67
+ )
68
+ return self
@@ -0,0 +1,68 @@
1
+ import logging
2
+ from typing import Literal
3
+
4
+ from pydantic import HttpUrl
5
+ from pydantic import SecretStr
6
+ from pydantic_settings import BaseSettings
7
+ from pydantic_settings import SettingsConfigDict
8
+
9
+ from ._settings_config import SETTINGS_CONFIG_DICT
10
+
11
+
12
+ class Settings(BaseSettings):
13
+ """
14
+ Contains all the configuration variables for Fractal Server
15
+
16
+ The attributes of this class are set from the environment.
17
+ """
18
+
19
+ model_config = SettingsConfigDict(**SETTINGS_CONFIG_DICT)
20
+
21
+ JWT_EXPIRE_SECONDS: int = 180
22
+ """
23
+ JWT token lifetime, in seconds.
24
+ """
25
+
26
+ JWT_SECRET_KEY: SecretStr
27
+ """
28
+ JWT secret
29
+
30
+ ⚠️ **IMPORTANT**: set this variable to a secure string, and do not disclose
31
+ it.
32
+ """
33
+
34
+ COOKIE_EXPIRE_SECONDS: int = 86400
35
+ """
36
+ Cookie token lifetime, in seconds.
37
+ """
38
+
39
+ # Note: we do not use ResourceType here to avoid circular imports
40
+ FRACTAL_RUNNER_BACKEND: Literal[
41
+ "local", "slurm_ssh", "slurm_sudo"
42
+ ] = "local"
43
+ """
44
+ Select which runner backend to use.
45
+ """
46
+
47
+ FRACTAL_LOGGING_LEVEL: int = logging.INFO
48
+ """
49
+ Logging-level threshold for logging
50
+
51
+ Only logs of with this level (or higher) will appear in the console logs.
52
+ """
53
+
54
+ FRACTAL_API_MAX_JOB_LIST_LENGTH: int = 50
55
+ """
56
+ Number of ids that can be stored in the `jobsV2` attribute of
57
+ `app.state`.
58
+ """
59
+
60
+ FRACTAL_GRACEFUL_SHUTDOWN_TIME: int = 30
61
+ """
62
+ Waiting time for the shutdown phase of executors
63
+ """
64
+
65
+ FRACTAL_HELP_URL: HttpUrl | None = None
66
+ """
67
+ The URL of an instance-specific Fractal help page.
68
+ """
@@ -37,7 +37,7 @@ class OAuthSettings(BaseSettings):
37
37
  """
38
38
  Secret to authorise against the identity provider.
39
39
  """
40
- OAUTH_OIDC_CONFIG_ENDPOINT: str | None = None
40
+ OAUTH_OIDC_CONFIG_ENDPOINT: SecretStr | None = None
41
41
  """
42
42
  OpenID configuration endpoint, for autodiscovery of relevant endpoints.
43
43
  """
@@ -55,7 +55,7 @@ class OAuthSettings(BaseSettings):
55
55
  and self.OAUTH_OIDC_CONFIG_ENDPOINT is None
56
56
  ):
57
57
  raise ValueError(
58
- f"{self.OAUTH_OIDC_CONFIG_ENDPOINT=} but "
58
+ f"self.OAUTH_OIDC_CONFIG_ENDPOINT=None but "
59
59
  f"{self.OAUTH_CLIENT_NAME=}"
60
60
  )
61
61
  return self
@@ -6,6 +6,7 @@ from fastapi import FastAPI
6
6
 
7
7
  from .app.routes.aux._runner import _backend_supports_shutdown
8
8
  from .app.shutdown import cleanup_after_shutdown
9
+ from .config import get_data_settings
9
10
  from .config import get_db_settings
10
11
  from .config import get_email_settings
11
12
  from .config import get_settings
@@ -50,16 +51,16 @@ def check_settings() -> None:
50
51
  ValidationError: If the configuration is invalid.
51
52
  """
52
53
  settings = Inject(get_settings)
53
- settings.check()
54
54
  db_settings = Inject(get_db_settings)
55
55
  email_settings = Inject(get_email_settings)
56
-
56
+ data_settings = Inject(get_data_settings)
57
57
  logger = set_logger("fractal_server_settings")
58
58
  logger.debug("Fractal Settings:")
59
59
  for key, value in chain(
60
60
  db_settings.model_dump().items(),
61
61
  settings.model_dump().items(),
62
62
  email_settings.model_dump().items(),
63
+ data_settings.model_dump().items(),
63
64
  ):
64
65
  if any(s in key.upper() for s in ["PASSWORD", "SECRET", "KEY"]):
65
66
  value = "*****"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "fractal-server"
3
- version = "2.17.0a5"
3
+ version = "2.17.0a6"
4
4
  description = "Backend component of the Fractal analytics platform"
5
5
  authors = [
6
6
  { name="Tommaso Comparin", email="tommaso.comparin@exact-lab.it" },
@@ -12,13 +12,12 @@ readme = "README.md"
12
12
  license = "BSD-3-Clause"
13
13
  requires-python = ">=3.11,<3.14"
14
14
  dependencies = [
15
- "python-dotenv >=1.1.0,<1.2.0",
16
- "fastapi >= 0.118.0, <0.119.0",
15
+ "fastapi >= 0.120.0, <0.121.0",
17
16
  "sqlmodel == 0.0.27",
18
17
  "sqlalchemy[asyncio] >=2.0.23,<2.1",
19
- "fastapi-users[oauth] >=14,<15",
18
+ "fastapi-users[oauth] >=15,<16",
20
19
  "alembic >=1.13.1, <2.0.0",
21
- "uvicorn >= 0.37.0, <0.38.0",
20
+ "uvicorn >= 0.38.0, <0.39.0",
22
21
  "uvicorn-worker == 0.4.0",
23
22
  "pydantic >=2.12.0,<2.13.0",
24
23
  "pydantic-settings ==2.11.0",
@@ -95,7 +94,7 @@ filterwarnings = [
95
94
  markers = ["container", "ssh", "fails_on_macos"]
96
95
 
97
96
  [tool.bumpver]
98
- current_version = "2.17.0a5"
97
+ current_version = "2.17.0a6"
99
98
  version_pattern = "MAJOR.MINOR.PATCH[PYTAGNUM]"
100
99
  commit_message = "bump version {old_version} -> {new_version}"
101
100
  commit = true
@@ -1 +0,0 @@
1
- __VERSION__ = "2.17.0a5"