fractal-server 2.17.0a3__tar.gz → 2.17.0a4__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 (266) hide show
  1. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/PKG-INFO +1 -1
  2. fractal_server-2.17.0a4/fractal_server/__init__.py +1 -0
  3. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/__main__.py +120 -99
  4. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/admin/v2/resource.py +34 -0
  5. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/config/__init__.py +0 -7
  6. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/config/_slurm.py +3 -2
  7. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/executors/slurm_common/base_slurm_runner.py +1 -1
  8. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/executors/slurm_common/get_slurm_config.py +1 -1
  9. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/executors/slurm_common/slurm_config.py +14 -17
  10. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/pyproject.toml +2 -2
  11. fractal_server-2.17.0a3/fractal_server/__init__.py +0 -1
  12. fractal_server-2.17.0a3/fractal_server/config/_init_data.py +0 -27
  13. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/LICENSE +0 -0
  14. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/README.md +0 -0
  15. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/alembic.ini +0 -0
  16. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/__init__.py +0 -0
  17. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/db/__init__.py +0 -0
  18. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/models/__init__.py +0 -0
  19. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/models/linkusergroup.py +0 -0
  20. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/models/linkuserproject.py +0 -0
  21. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/models/security.py +0 -0
  22. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/models/user_settings.py +0 -0
  23. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/models/v2/__init__.py +0 -0
  24. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/models/v2/accounting.py +0 -0
  25. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/models/v2/dataset.py +0 -0
  26. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/models/v2/history.py +0 -0
  27. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/models/v2/job.py +0 -0
  28. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/models/v2/profile.py +0 -0
  29. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/models/v2/project.py +0 -0
  30. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/models/v2/resource.py +0 -0
  31. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/models/v2/task.py +0 -0
  32. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/models/v2/task_group.py +0 -0
  33. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/models/v2/workflow.py +0 -0
  34. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/models/v2/workflowtask.py +0 -0
  35. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/__init__.py +0 -0
  36. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/admin/__init__.py +0 -0
  37. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/admin/v2/__init__.py +0 -0
  38. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/admin/v2/_aux_functions.py +0 -0
  39. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/admin/v2/accounting.py +0 -0
  40. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/admin/v2/impersonate.py +0 -0
  41. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/admin/v2/job.py +0 -0
  42. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/admin/v2/profile.py +0 -0
  43. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/admin/v2/project.py +0 -0
  44. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/admin/v2/task.py +0 -0
  45. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/admin/v2/task_group.py +0 -0
  46. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/admin/v2/task_group_lifecycle.py +0 -0
  47. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/api/__init__.py +0 -0
  48. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/api/v2/__init__.py +0 -0
  49. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/api/v2/_aux_functions.py +0 -0
  50. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/api/v2/_aux_functions_history.py +0 -0
  51. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/api/v2/_aux_functions_task_lifecycle.py +0 -0
  52. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/api/v2/_aux_functions_task_version_update.py +0 -0
  53. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/api/v2/_aux_functions_tasks.py +0 -0
  54. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/api/v2/_aux_task_group_disambiguation.py +0 -0
  55. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/api/v2/dataset.py +0 -0
  56. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/api/v2/history.py +0 -0
  57. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/api/v2/images.py +0 -0
  58. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/api/v2/job.py +0 -0
  59. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/api/v2/pre_submission_checks.py +0 -0
  60. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/api/v2/project.py +0 -0
  61. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/api/v2/status_legacy.py +0 -0
  62. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/api/v2/submit.py +0 -0
  63. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/api/v2/task.py +0 -0
  64. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/api/v2/task_collection.py +0 -0
  65. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/api/v2/task_collection_custom.py +0 -0
  66. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/api/v2/task_collection_pixi.py +0 -0
  67. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/api/v2/task_group.py +0 -0
  68. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/api/v2/task_group_lifecycle.py +0 -0
  69. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/api/v2/task_version_update.py +0 -0
  70. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/api/v2/workflow.py +0 -0
  71. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/api/v2/workflow_import.py +0 -0
  72. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/api/v2/workflowtask.py +0 -0
  73. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/auth/__init__.py +0 -0
  74. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/auth/_aux_auth.py +0 -0
  75. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/auth/current_user.py +0 -0
  76. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/auth/group.py +0 -0
  77. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/auth/login.py +0 -0
  78. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/auth/oauth.py +0 -0
  79. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/auth/register.py +0 -0
  80. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/auth/router.py +0 -0
  81. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/auth/users.py +0 -0
  82. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/aux/__init__.py +0 -0
  83. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/aux/_job.py +0 -0
  84. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/aux/_runner.py +0 -0
  85. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/aux/validate_user_profile.py +0 -0
  86. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/aux/validate_user_settings.py +0 -0
  87. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/routes/pagination.py +0 -0
  88. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/schemas/__init__.py +0 -0
  89. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/schemas/user.py +0 -0
  90. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/schemas/user_group.py +0 -0
  91. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/schemas/user_settings.py +0 -0
  92. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/schemas/v2/__init__.py +0 -0
  93. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/schemas/v2/accounting.py +0 -0
  94. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/schemas/v2/dataset.py +0 -0
  95. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/schemas/v2/dumps.py +0 -0
  96. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/schemas/v2/history.py +0 -0
  97. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/schemas/v2/job.py +0 -0
  98. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/schemas/v2/manifest.py +0 -0
  99. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/schemas/v2/profile.py +0 -0
  100. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/schemas/v2/project.py +0 -0
  101. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/schemas/v2/resource.py +0 -0
  102. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/schemas/v2/status_legacy.py +0 -0
  103. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/schemas/v2/task.py +0 -0
  104. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/schemas/v2/task_collection.py +0 -0
  105. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/schemas/v2/task_group.py +0 -0
  106. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/schemas/v2/workflow.py +0 -0
  107. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/schemas/v2/workflowtask.py +0 -0
  108. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/security/__init__.py +0 -0
  109. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/security/signup_email.py +0 -0
  110. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/shutdown.py +0 -0
  111. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/app/user_settings.py +0 -0
  112. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/config/_database.py +0 -0
  113. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/config/_email.py +0 -0
  114. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/config/_main.py +0 -0
  115. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/config/_oauth.py +0 -0
  116. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/config/_settings_config.py +0 -0
  117. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/data_migrations/2_14_10.py +0 -0
  118. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/data_migrations/README.md +0 -0
  119. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/data_migrations/tools.py +0 -0
  120. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/exceptions.py +0 -0
  121. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/gunicorn_fractal.py +0 -0
  122. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/images/__init__.py +0 -0
  123. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/images/models.py +0 -0
  124. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/images/status_tools.py +0 -0
  125. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/images/tools.py +0 -0
  126. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/logger.py +0 -0
  127. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/main.py +0 -0
  128. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/env.py +0 -0
  129. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/naming_convention.py +0 -0
  130. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/034a469ec2eb_task_groups.py +0 -0
  131. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/091b01f51f88_add_usergroup_and_linkusergroup_table.py +0 -0
  132. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/0f5f85bb2ae7_add_pre_pinned_packages.py +0 -0
  133. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/19eca0dd47a9_user_settings_project_dir.py +0 -0
  134. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/1a83a5260664_rename.py +0 -0
  135. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/1eac13a26c83_drop_v1_tables.py +0 -0
  136. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/316140ff7ee1_remove_usersettings_cache_dir.py +0 -0
  137. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/47351f8c7ebc_drop_dataset_filters.py +0 -0
  138. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/4c308bcaea2b_add_task_args_schema_and_task_args_.py +0 -0
  139. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/4cedeb448a53_workflowtask_foreign_keys_not_nullables.py +0 -0
  140. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/501961cfcd85_remove_link_between_v1_and_v2_tasks_.py +0 -0
  141. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/50a13d6138fd_initial_schema.py +0 -0
  142. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/5bf02391cfef_v2.py +0 -0
  143. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/70e77f1c38b0_add_applyworkflow_first_task_index_and_.py +0 -0
  144. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/71eefd1dd202_add_slurm_accounts.py +0 -0
  145. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/791ce783d3d8_add_indices.py +0 -0
  146. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/84bf0fffde30_add_dumps_to_applyworkflow.py +0 -0
  147. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/8e8f227a3e36_update_taskv2_post_2_7_0.py +0 -0
  148. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/8f79bd162e35_add_docs_info_and_docs_link_to_task_.py +0 -0
  149. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/90f6508c6379_drop_useroauth_username.py +0 -0
  150. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/94a47ea2d3ff_remove_cache_dir_slurm_user_and_slurm_.py +0 -0
  151. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/969d84257cac_add_historyrun_task_id.py +0 -0
  152. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/97f444d47249_add_applyworkflow_project_dump.py +0 -0
  153. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/981d588fe248_add_executor_error_log.py +0 -0
  154. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/99ea79d9e5d2_add_dataset_history.py +0 -0
  155. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/9c5ae74c9b98_add_user_settings_table.py +0 -0
  156. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/9db60297b8b2_set_ondelete.py +0 -0
  157. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/9fd26a2b0de4_add_workflow_timestamp_created.py +0 -0
  158. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/a7f4d6137b53_add_workflow_dump_to_applyworkflow.py +0 -0
  159. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/a80ac5a352bf_resource_profile.py +0 -0
  160. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/af1ef1c83c9b_add_accounting_tables.py +0 -0
  161. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/af8673379a5c_drop_old_filter_columns.py +0 -0
  162. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/b1e7f7a1ff71_task_group_for_pixi.py +0 -0
  163. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/b3ffb095f973_json_to_jsonb.py +0 -0
  164. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/c90a7c76e996_job_id_in_history_run.py +0 -0
  165. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/d256a7379ab8_taskgroup_activity_and_venv_info_to_.py +0 -0
  166. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/d4fe3708d309_make_applyworkflow_workflow_dump_non_.py +0 -0
  167. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/da2cb2ac4255_user_group_viewer_paths.py +0 -0
  168. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/db09233ad13a_split_filters_and_keep_old_columns.py +0 -0
  169. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/e75cac726012_make_applyworkflow_start_timestamp_not_.py +0 -0
  170. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/e81103413827_add_job_type_filters.py +0 -0
  171. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/efa89c30e0a4_add_project_timestamp_created.py +0 -0
  172. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/f37aceb45062_make_historyunit_logfile_required.py +0 -0
  173. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/f384e1c0cf5d_drop_task_default_args_columns.py +0 -0
  174. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/migrations/versions/fbce16ff4e47_new_history_items.py +0 -0
  175. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/py.typed +0 -0
  176. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/__init__.py +0 -0
  177. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/components.py +0 -0
  178. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/config/__init__.py +0 -0
  179. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/config/_local.py +0 -0
  180. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/config/slurm_mem_to_MB.py +0 -0
  181. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/exceptions.py +0 -0
  182. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/executors/__init__.py +0 -0
  183. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/executors/base_runner.py +0 -0
  184. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/executors/call_command_wrapper.py +0 -0
  185. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/executors/local/__init__.py +0 -0
  186. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/executors/local/get_local_config.py +0 -0
  187. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/executors/local/runner.py +0 -0
  188. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/executors/slurm_common/__init__.py +0 -0
  189. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/executors/slurm_common/_batching.py +0 -0
  190. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/executors/slurm_common/_job_states.py +0 -0
  191. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/executors/slurm_common/remote.py +0 -0
  192. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/executors/slurm_common/slurm_job_task_models.py +0 -0
  193. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/executors/slurm_ssh/__init__.py +0 -0
  194. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/executors/slurm_ssh/run_subprocess.py +0 -0
  195. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/executors/slurm_ssh/runner.py +0 -0
  196. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/executors/slurm_ssh/tar_commands.py +0 -0
  197. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/executors/slurm_sudo/__init__.py +0 -0
  198. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/executors/slurm_sudo/_subprocess_run_as_user.py +0 -0
  199. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/executors/slurm_sudo/runner.py +0 -0
  200. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/filenames.py +0 -0
  201. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/set_start_and_last_task_index.py +0 -0
  202. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/task_files.py +0 -0
  203. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/v2/__init__.py +0 -0
  204. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/v2/_local.py +0 -0
  205. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/v2/_slurm_ssh.py +0 -0
  206. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/v2/_slurm_sudo.py +0 -0
  207. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/v2/db_tools.py +0 -0
  208. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/v2/deduplicate_list.py +0 -0
  209. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/v2/merge_outputs.py +0 -0
  210. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/v2/runner.py +0 -0
  211. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/v2/runner_functions.py +0 -0
  212. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/v2/submit_workflow.py +0 -0
  213. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/v2/task_interface.py +0 -0
  214. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/runner/versions.py +0 -0
  215. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/ssh/__init__.py +0 -0
  216. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/ssh/_fabric.py +0 -0
  217. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/string_tools.py +0 -0
  218. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/syringe.py +0 -0
  219. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/__init__.py +0 -0
  220. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/config/__init__.py +0 -0
  221. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/config/_pixi.py +0 -0
  222. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/config/_python.py +0 -0
  223. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/utils.py +0 -0
  224. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/v2/__init__.py +0 -0
  225. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/v2/local/__init__.py +0 -0
  226. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/v2/local/_utils.py +0 -0
  227. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/v2/local/collect.py +0 -0
  228. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/v2/local/collect_pixi.py +0 -0
  229. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/v2/local/deactivate.py +0 -0
  230. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/v2/local/deactivate_pixi.py +0 -0
  231. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/v2/local/delete.py +0 -0
  232. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/v2/local/reactivate.py +0 -0
  233. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/v2/local/reactivate_pixi.py +0 -0
  234. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/v2/ssh/__init__.py +0 -0
  235. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/v2/ssh/_pixi_slurm_ssh.py +0 -0
  236. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/v2/ssh/_utils.py +0 -0
  237. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/v2/ssh/collect.py +0 -0
  238. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/v2/ssh/collect_pixi.py +0 -0
  239. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/v2/ssh/deactivate.py +0 -0
  240. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/v2/ssh/deactivate_pixi.py +0 -0
  241. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/v2/ssh/delete.py +0 -0
  242. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/v2/ssh/reactivate.py +0 -0
  243. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/v2/ssh/reactivate_pixi.py +0 -0
  244. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/v2/templates/1_create_venv.sh +0 -0
  245. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/v2/templates/2_pip_install.sh +0 -0
  246. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/v2/templates/3_pip_freeze.sh +0 -0
  247. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/v2/templates/4_pip_show.sh +0 -0
  248. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/v2/templates/5_get_venv_size_and_file_number.sh +0 -0
  249. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/v2/templates/6_pip_install_from_freeze.sh +0 -0
  250. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/v2/templates/pixi_1_extract.sh +0 -0
  251. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/v2/templates/pixi_2_install.sh +0 -0
  252. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/v2/templates/pixi_3_post_install.sh +0 -0
  253. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/v2/utils_background.py +0 -0
  254. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/v2/utils_database.py +0 -0
  255. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/v2/utils_package_names.py +0 -0
  256. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/v2/utils_pixi.py +0 -0
  257. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/v2/utils_python_interpreter.py +0 -0
  258. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/tasks/v2/utils_templates.py +0 -0
  259. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/types/__init__.py +0 -0
  260. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/types/validators/__init__.py +0 -0
  261. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/types/validators/_common_validators.py +0 -0
  262. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/types/validators/_filter_validators.py +0 -0
  263. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/types/validators/_workflow_task_arguments_validators.py +0 -0
  264. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/urls.py +0 -0
  265. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/fractal_server/utils.py +0 -0
  266. {fractal_server-2.17.0a3 → fractal_server-2.17.0a4}/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.0a3
3
+ Version: 2.17.0a4
4
4
  Summary: Backend component of the Fractal analytics platform
5
5
  License-Expression: BSD-3-Clause
6
6
  License-File: LICENSE
@@ -0,0 +1 @@
1
+ __VERSION__ = "2.17.0a4"
@@ -62,14 +62,26 @@ init_db_data_parser = subparsers.add_parser(
62
62
  init_db_data_parser.add_argument(
63
63
  "--resource",
64
64
  type=str,
65
- help=("Either `default` or path to the JSON file of the first resource."),
66
- required=True,
65
+ help="Either `default` or path to the JSON file of the first resource.",
66
+ required=False,
67
67
  )
68
68
  init_db_data_parser.add_argument(
69
69
  "--profile",
70
70
  type=str,
71
- help=("Either `default` or path to the JSON file of the first profile."),
72
- required=True,
71
+ help="Either `default` or path to the JSON file of the first profile.",
72
+ required=False,
73
+ )
74
+ init_db_data_parser.add_argument(
75
+ "--admin-email",
76
+ type=str,
77
+ help="Email of the first admin user to create.",
78
+ required=False,
79
+ )
80
+ init_db_data_parser.add_argument(
81
+ "--admin-pwd",
82
+ type=str,
83
+ help="Password of the first admin user to create.",
84
+ required=False,
73
85
  )
74
86
 
75
87
  # fractalctl update-db-data
@@ -124,14 +136,13 @@ def set_db():
124
136
 
125
137
 
126
138
  def init_db_data(
127
- *,
128
- resource: str,
129
- profile: str,
139
+ resource: str | None = None,
140
+ profile: str | None = None,
141
+ admin_email: str | None = None,
142
+ admin_password: str | None = None,
130
143
  ) -> None:
131
144
  from fractal_server.app.security import _create_first_user
132
145
  from fractal_server.app.security import _create_first_group
133
- from fractal_server.syringe import Inject
134
- from fractal_server.config import get_init_data_settings
135
146
  from fractal_server.app.db import get_sync_db
136
147
  from sqlalchemy import select, func
137
148
  from fractal_server.app.models.security import UserOAuth
@@ -139,104 +150,112 @@ def init_db_data(
139
150
  from fractal_server.app.schemas.v2.resource import cast_serialize_resource
140
151
  from fractal_server.app.schemas.v2.profile import cast_serialize_profile
141
152
 
142
- init_data_settings = Inject(get_init_data_settings)
143
-
144
153
  # Create default group and user
145
154
  print()
146
155
  _create_first_group()
147
156
  print()
148
- asyncio.run(
149
- _create_first_user(
150
- email=init_data_settings.FRACTAL_DEFAULT_ADMIN_EMAIL,
151
- password=(
152
- init_data_settings.FRACTAL_DEFAULT_ADMIN_PASSWORD.get_secret_value() # noqa E501
153
- ),
154
- is_superuser=True,
155
- is_verified=True,
156
- )
157
- )
158
- print()
159
157
 
160
- # Create resource and profile
161
- with next(get_sync_db()) as db:
162
- # Preliminary check
163
- num_resources = db.execute(select(func.count(Resource.id))).scalar()
164
- if num_resources != 0:
165
- print(f"There exist already {num_resources=} resources. Exit.")
166
- sys.exit(1)
167
-
168
- # Get resource/profile data
169
- if resource == "default":
170
- _python_version = (
171
- f"{sys.version_info.major}.{sys.version_info.minor}"
172
- )
173
- resource_data = {
174
- "name": "Local resource",
175
- "type": ResourceType.LOCAL,
176
- "jobs_local_dir": (Path.cwd() / "data-jobs").as_posix(),
177
- "tasks_local_dir": (Path.cwd() / "data-tasks").as_posix(),
178
- "tasks_python_config": {
179
- "default_version": _python_version,
180
- "versions": {
181
- _python_version: sys.executable,
182
- },
183
- },
184
- "jobs_poll_interval": 0,
185
- "jobs_runner_config": {},
186
- "tasks_pixi_config": {},
187
- }
188
- print("Prepared default resource data.")
189
- else:
190
- with open(resource) as f:
191
- resource_data = json.load(f)
192
- print(f"Read resource data from {resource}.")
193
- if profile == "default":
194
- profile_data = {
195
- "resource_type": "local",
196
- "name": "Local profile",
197
- }
198
- print("Prepared default profile data.")
199
- else:
200
- with open(profile) as f:
201
- profile_data = json.load(f)
202
- print(f"Read profile data from {profile}.")
203
-
204
- # Validate resource/profile data
205
- try:
206
- resource_data = cast_serialize_resource(resource_data)
207
- except ValidationError as e:
208
- sys.exit(
209
- f"ERROR: Invalid resource data.\nOriginal error:\n{str(e)}"
210
- )
211
- try:
212
- profile_data = cast_serialize_profile(profile_data)
213
- except ValidationError as e:
214
- sys.exit(
215
- f"ERROR: Invalid profile data.\nOriginal error:\n{str(e)}"
158
+ # Create admin user if requested
159
+ if (admin_email is None) != (admin_password is None):
160
+ print("You must provide both --admin-email and --admin-pwd. Exit.")
161
+ sys.exit(1)
162
+ if admin_password and admin_email:
163
+ asyncio.run(
164
+ _create_first_user(
165
+ email=admin_email,
166
+ password=admin_password,
167
+ is_superuser=True,
168
+ is_verified=True,
216
169
  )
217
-
218
- # Create resource/profile db objects
219
- resource_obj = Resource(**resource_data)
220
- db.add(resource_obj)
221
- db.commit()
222
- db.refresh(resource_obj)
223
- profile_data["resource_id"] = resource_obj.id
224
- profile_obj = Profile(**profile_data)
225
- db.add(profile_obj)
226
- db.commit()
227
- db.refresh(profile_obj)
228
-
229
- # Associate profile to users
230
- res = db.execute(select(UserOAuth))
231
- users = res.unique().scalars().all()
232
- for user in users:
233
- print(f"Now set profile_id={profile_obj.id} for {user.email}.")
234
- user.profile_id = profile_obj.id
235
- db.add(user)
236
- db.commit()
237
- db.expunge_all()
170
+ )
238
171
  print()
239
172
 
173
+ # Create resource and profile if requested
174
+ if (resource is None) != (profile is None):
175
+ print("You must provide both --resource and --profile. Exit.")
176
+ sys.exit(1)
177
+ if resource and profile:
178
+ with next(get_sync_db()) as db:
179
+ # Preliminary check
180
+ num_resources = db.execute(
181
+ select(func.count(Resource.id))
182
+ ).scalar()
183
+ if num_resources != 0:
184
+ print(f"There exist already {num_resources=} resources. Exit.")
185
+ sys.exit(1)
186
+
187
+ # Get resource/profile data
188
+ if resource == "default":
189
+ _python_version = (
190
+ f"{sys.version_info.major}.{sys.version_info.minor}"
191
+ )
192
+ resource_data = {
193
+ "name": "Local resource",
194
+ "type": ResourceType.LOCAL,
195
+ "jobs_local_dir": (Path.cwd() / "data-jobs").as_posix(),
196
+ "tasks_local_dir": (Path.cwd() / "data-tasks").as_posix(),
197
+ "tasks_python_config": {
198
+ "default_version": _python_version,
199
+ "versions": {
200
+ _python_version: sys.executable,
201
+ },
202
+ },
203
+ "jobs_poll_interval": 0,
204
+ "jobs_runner_config": {},
205
+ "tasks_pixi_config": {},
206
+ }
207
+ print("Prepared default resource data.")
208
+ else:
209
+ with open(resource) as f:
210
+ resource_data = json.load(f)
211
+ print(f"Read resource data from {resource}.")
212
+ if profile == "default":
213
+ profile_data = {
214
+ "resource_type": "local",
215
+ "name": "Local profile",
216
+ }
217
+ print("Prepared default profile data.")
218
+ else:
219
+ with open(profile) as f:
220
+ profile_data = json.load(f)
221
+ print(f"Read profile data from {profile}.")
222
+
223
+ # Validate resource/profile data
224
+ try:
225
+ resource_data = cast_serialize_resource(resource_data)
226
+ except ValidationError as e:
227
+ sys.exit(
228
+ f"ERROR: Invalid resource data.\nOriginal error:\n{str(e)}"
229
+ )
230
+ try:
231
+ profile_data = cast_serialize_profile(profile_data)
232
+ except ValidationError as e:
233
+ sys.exit(
234
+ f"ERROR: Invalid profile data.\nOriginal error:\n{str(e)}"
235
+ )
236
+
237
+ # Create resource/profile db objects
238
+ resource_obj = Resource(**resource_data)
239
+ db.add(resource_obj)
240
+ db.commit()
241
+ db.refresh(resource_obj)
242
+ profile_data["resource_id"] = resource_obj.id
243
+ profile_obj = Profile(**profile_data)
244
+ db.add(profile_obj)
245
+ db.commit()
246
+ db.refresh(profile_obj)
247
+
248
+ # Associate profile to users
249
+ res = db.execute(select(UserOAuth))
250
+ users = res.unique().scalars().all()
251
+ for user in users:
252
+ print(f"Now set profile_id={profile_obj.id} for {user.email}.")
253
+ user.profile_id = profile_obj.id
254
+ db.add(user)
255
+ db.commit()
256
+ db.expunge_all()
257
+ print()
258
+
240
259
 
241
260
  def update_db_data():
242
261
  """
@@ -328,6 +347,8 @@ def run():
328
347
  init_db_data(
329
348
  resource=args.resource,
330
349
  profile=args.profile,
350
+ admin_email=args.admin_email,
351
+ admin_password=args.admin_pwd,
331
352
  )
332
353
  elif args.cmd == "update-db-data":
333
354
  update_db_data()
@@ -13,7 +13,9 @@ from fractal_server.app.db import AsyncSession
13
13
  from fractal_server.app.db import get_async_db
14
14
  from fractal_server.app.models import UserOAuth
15
15
  from fractal_server.app.models.v2 import Profile
16
+ from fractal_server.app.models.v2 import ProjectV2
16
17
  from fractal_server.app.models.v2 import Resource
18
+ from fractal_server.app.models.v2 import TaskGroupV2
17
19
  from fractal_server.app.routes.auth import current_active_superuser
18
20
  from fractal_server.app.schemas.v2 import ProfileCreate
19
21
  from fractal_server.app.schemas.v2 import ProfileRead
@@ -166,6 +168,38 @@ async def delete_resource(
166
168
  ),
167
169
  )
168
170
 
171
+ # Fail if at least one Project is associated with the Resource.
172
+ res = await db.execute(
173
+ select(func.count(ProjectV2.id)).where(
174
+ ProjectV2.resource_id == resource_id
175
+ )
176
+ )
177
+ associated_project_count = res.scalar()
178
+ if associated_project_count > 0:
179
+ raise HTTPException(
180
+ status_code=status.HTTP_422_UNPROCESSABLE_CONTENT,
181
+ detail=(
182
+ f"Cannot delete Resource {resource_id} because it's associated"
183
+ f" with {associated_project_count} Projects."
184
+ ),
185
+ )
186
+
187
+ # Fail if at least one TaskGroupV2 is associated with the Resource.
188
+ res = await db.execute(
189
+ select(func.count(TaskGroupV2.id)).where(
190
+ TaskGroupV2.resource_id == resource_id
191
+ )
192
+ )
193
+ associated_taskgroup_count = res.scalar()
194
+ if associated_taskgroup_count > 0:
195
+ raise HTTPException(
196
+ status_code=status.HTTP_422_UNPROCESSABLE_CONTENT,
197
+ detail=(
198
+ f"Cannot delete Resource {resource_id} because it's associated"
199
+ f" with {associated_taskgroup_count} TaskGroupV2."
200
+ ),
201
+ )
202
+
169
203
  # Delete
170
204
  await db.delete(resource)
171
205
  await db.commit()
@@ -1,7 +1,6 @@
1
1
  from ._database import DatabaseSettings
2
2
  from ._email import EmailSettings
3
3
  from ._email import PublicEmailSettings # noqa F401
4
- from ._init_data import InitDataSettings
5
4
  from ._main import Settings
6
5
  from ._oauth import OAuthSettings
7
6
 
@@ -18,11 +17,5 @@ def get_email_settings(email_settings=EmailSettings()) -> EmailSettings:
18
17
  return email_settings
19
18
 
20
19
 
21
- def get_init_data_settings(
22
- init_data_settings=InitDataSettings(),
23
- ) -> InitDataSettings:
24
- return init_data_settings
25
-
26
-
27
20
  def get_oauth_settings(oauth_settings=OAuthSettings()) -> OAuthSettings:
28
21
  return oauth_settings
@@ -3,6 +3,7 @@ from typing import Annotated
3
3
  from pydantic import AfterValidator
4
4
  from pydantic import BaseModel
5
5
  from pydantic import ConfigDict
6
+ from pydantic import Field
6
7
  from pydantic.types import PositiveInt
7
8
 
8
9
  from fractal_server.runner.config.slurm_mem_to_MB import slurm_mem_to_MB
@@ -44,7 +45,7 @@ class _SlurmConfigSet(BaseModel):
44
45
  nodelist: NonEmptyStr | None = None
45
46
  time: NonEmptyStr | None = None
46
47
  account: NonEmptyStr | None = None
47
- extra_lines: list[NonEmptyStr] | None = None
48
+ extra_lines: list[NonEmptyStr] = Field(default_factory=list)
48
49
  gpus: NonEmptyStr | None = None
49
50
 
50
51
 
@@ -125,4 +126,4 @@ class JobRunnerConfigSLURM(BaseModel):
125
126
  default_slurm_config: _SlurmConfigSet
126
127
  gpu_slurm_config: _SlurmConfigSet | None = None
127
128
  batching_config: _BatchingConfigSet
128
- user_local_exports: DictStrStr | None = None
129
+ user_local_exports: DictStrStr = Field(default_factory=dict)
@@ -252,7 +252,7 @@ class BaseSlurmRunner(BaseRunner):
252
252
  f"Add {self.common_script_lines} to "
253
253
  f"{new_slurm_config.extra_lines=}."
254
254
  )
255
- current_extra_lines = new_slurm_config.extra_lines or []
255
+ current_extra_lines = new_slurm_config.extra_lines
256
256
  new_slurm_config.extra_lines = (
257
257
  current_extra_lines + self.common_script_lines
258
258
  )
@@ -77,7 +77,7 @@ def _get_slurm_config_internal(
77
77
  else:
78
78
  needs_gpu = False
79
79
  logger.debug(f"[get_slurm_config] {needs_gpu=}")
80
- if needs_gpu:
80
+ if needs_gpu and shared_config.gpu_slurm_config is not None:
81
81
  for key, value in shared_config.gpu_slurm_config.model_dump(
82
82
  exclude_unset=True, exclude={"mem"}
83
83
  ).items():
@@ -83,10 +83,10 @@ class SlurmConfig(BaseModel):
83
83
 
84
84
  # Free-field attribute for extra lines to be added to the SLURM job
85
85
  # preamble
86
- extra_lines: list[str] | None = Field(default_factory=list)
86
+ extra_lines: list[str] = Field(default_factory=list)
87
87
 
88
88
  # Variables that will be `export`ed in the SLURM submission script
89
- user_local_exports: dict[str, str] | None = None
89
+ user_local_exports: dict[str, str] = Field(default_factory=dict)
90
90
 
91
91
  # Metaparameters needed to combine multiple tasks in each SLURM job
92
92
  tasks_per_job: int | None = None
@@ -152,9 +152,8 @@ class SlurmConfig(BaseModel):
152
152
  "SlurmConfig.sbatch_preamble requires that "
153
153
  f"{self.parallel_tasks_per_job=} is not None."
154
154
  )
155
- if self.extra_lines:
156
- if len(self.extra_lines) != len(set(self.extra_lines)):
157
- raise ValueError(f"{self.extra_lines=} contains repetitions")
155
+ if len(self.extra_lines) != len(set(self.extra_lines)):
156
+ raise ValueError(f"{self.extra_lines=} contains repetitions")
158
157
 
159
158
  mem_per_job_MB = self.parallel_tasks_per_job * self.mem_per_task_MB
160
159
  lines = [
@@ -187,18 +186,16 @@ class SlurmConfig(BaseModel):
187
186
  option = key.replace("_", "-")
188
187
  lines.append(f"{self.prefix} --{option}={value}")
189
188
 
190
- if self.extra_lines:
191
- for line in self._sorted_extra_lines():
192
- lines.append(line)
193
-
194
- if self.user_local_exports:
195
- if remote_export_dir is None:
196
- raise ValueError(
197
- f"remote_export_dir=None but {self.user_local_exports=}"
198
- )
199
- for key, value in self.user_local_exports.items():
200
- tmp_value = str(Path(remote_export_dir) / value)
201
- lines.append(f"export {key}={tmp_value}")
189
+ for line in self._sorted_extra_lines():
190
+ lines.append(line)
191
+
192
+ if self.user_local_exports != {} and remote_export_dir is None:
193
+ raise ValueError(
194
+ f"{remote_export_dir=} but {self.user_local_exports=}"
195
+ )
196
+ for key, value in self.user_local_exports.items():
197
+ tmp_value = str(Path(remote_export_dir) / value)
198
+ lines.append(f"export {key}={tmp_value}")
202
199
 
203
200
  """
204
201
  FIXME export SRUN_CPUS_PER_TASK
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "fractal-server"
3
- version = "2.17.0a3"
3
+ version = "2.17.0a4"
4
4
  description = "Backend component of the Fractal analytics platform"
5
5
  authors = [
6
6
  { name="Tommaso Comparin", email="tommaso.comparin@exact-lab.it" },
@@ -96,7 +96,7 @@ filterwarnings = [
96
96
  markers = ["container", "ssh", "fails_on_macos"]
97
97
 
98
98
  [tool.bumpver]
99
- current_version = "2.17.0a3"
99
+ current_version = "2.17.0a4"
100
100
  version_pattern = "MAJOR.MINOR.PATCH[PYTAGNUM]"
101
101
  commit_message = "bump version {old_version} -> {new_version}"
102
102
  commit = true
@@ -1 +0,0 @@
1
- __VERSION__ = "2.17.0a3"
@@ -1,27 +0,0 @@
1
- from pydantic import SecretStr
2
- from pydantic_settings import BaseSettings
3
- from pydantic_settings import SettingsConfigDict
4
-
5
- from ._settings_config import SETTINGS_CONFIG_DICT
6
-
7
-
8
- class InitDataSettings(BaseSettings):
9
- model_config = SettingsConfigDict(**SETTINGS_CONFIG_DICT)
10
-
11
- FRACTAL_DEFAULT_ADMIN_EMAIL: str = "admin@fractal.xy"
12
- """
13
- Admin default email, used upon creation of the first superuser during
14
- server startup.
15
-
16
- ⚠️ **IMPORTANT**: After the server startup, you should always edit the
17
- default admin credentials.
18
- """
19
-
20
- FRACTAL_DEFAULT_ADMIN_PASSWORD: SecretStr = "1234"
21
- """
22
- Admin default password, used upon creation of the first superuser during
23
- server startup.
24
-
25
- ⚠️ **IMPORTANT**: After the server startup, you should always edit the
26
- default admin credentials.
27
- """