fractal-server 2.17.0a8__tar.gz → 2.17.0a9__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 (261) hide show
  1. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/PKG-INFO +1 -1
  2. fractal_server-2.17.0a9/fractal_server/__init__.py +1 -0
  3. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/admin/v2/resource.py +1 -1
  4. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/admin/v2/task.py +1 -0
  5. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/admin/v2/task_group.py +1 -0
  6. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/api/v2/_aux_functions_tasks.py +13 -5
  7. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/api/v2/_aux_task_group_disambiguation.py +22 -18
  8. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/api/v2/task.py +1 -0
  9. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/api/v2/task_collection.py +1 -0
  10. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/api/v2/task_collection_pixi.py +1 -0
  11. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/api/v2/task_group.py +13 -3
  12. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/api/v2/workflow_import.py +23 -11
  13. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/auth/_aux_auth.py +36 -17
  14. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/auth/group.py +20 -10
  15. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/auth/users.py +11 -5
  16. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/security/__init__.py +39 -22
  17. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/config/_main.py +10 -0
  18. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/pyproject.toml +3 -2
  19. fractal_server-2.17.0a8/fractal_server/__init__.py +0 -1
  20. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/LICENSE +0 -0
  21. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/README.md +0 -0
  22. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/__main__.py +0 -0
  23. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/alembic.ini +0 -0
  24. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/__init__.py +0 -0
  25. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/db/__init__.py +0 -0
  26. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/models/__init__.py +0 -0
  27. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/models/linkusergroup.py +0 -0
  28. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/models/linkuserproject.py +0 -0
  29. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/models/security.py +0 -0
  30. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/models/user_settings.py +0 -0
  31. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/models/v2/__init__.py +0 -0
  32. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/models/v2/accounting.py +0 -0
  33. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/models/v2/dataset.py +0 -0
  34. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/models/v2/history.py +0 -0
  35. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/models/v2/job.py +0 -0
  36. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/models/v2/profile.py +0 -0
  37. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/models/v2/project.py +0 -0
  38. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/models/v2/resource.py +0 -0
  39. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/models/v2/task.py +0 -0
  40. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/models/v2/task_group.py +0 -0
  41. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/models/v2/workflow.py +0 -0
  42. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/models/v2/workflowtask.py +0 -0
  43. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/__init__.py +0 -0
  44. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/admin/__init__.py +0 -0
  45. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/admin/v2/__init__.py +0 -0
  46. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/admin/v2/_aux_functions.py +0 -0
  47. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/admin/v2/accounting.py +0 -0
  48. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/admin/v2/impersonate.py +0 -0
  49. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/admin/v2/job.py +0 -0
  50. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/admin/v2/profile.py +0 -0
  51. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/admin/v2/project.py +0 -0
  52. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/admin/v2/task_group_lifecycle.py +0 -0
  53. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/api/__init__.py +0 -0
  54. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/api/v2/__init__.py +0 -0
  55. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/api/v2/_aux_functions.py +0 -0
  56. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/api/v2/_aux_functions_history.py +0 -0
  57. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/api/v2/_aux_functions_task_lifecycle.py +0 -0
  58. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/api/v2/_aux_functions_task_version_update.py +0 -0
  59. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/api/v2/dataset.py +0 -0
  60. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/api/v2/history.py +0 -0
  61. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/api/v2/images.py +0 -0
  62. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/api/v2/job.py +0 -0
  63. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/api/v2/pre_submission_checks.py +0 -0
  64. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/api/v2/project.py +0 -0
  65. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/api/v2/status_legacy.py +0 -0
  66. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/api/v2/submit.py +0 -0
  67. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/api/v2/task_collection_custom.py +0 -0
  68. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/api/v2/task_group_lifecycle.py +0 -0
  69. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/api/v2/task_version_update.py +0 -0
  70. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/api/v2/workflow.py +0 -0
  71. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/api/v2/workflowtask.py +0 -0
  72. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/auth/__init__.py +0 -0
  73. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/auth/current_user.py +0 -0
  74. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/auth/login.py +0 -0
  75. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/auth/oauth.py +0 -0
  76. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/auth/register.py +0 -0
  77. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/auth/router.py +0 -0
  78. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/aux/__init__.py +0 -0
  79. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/aux/_job.py +0 -0
  80. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/aux/_runner.py +0 -0
  81. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/aux/validate_user_profile.py +0 -0
  82. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/routes/pagination.py +0 -0
  83. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/schemas/__init__.py +0 -0
  84. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/schemas/user.py +0 -0
  85. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/schemas/user_group.py +0 -0
  86. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/schemas/v2/__init__.py +0 -0
  87. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/schemas/v2/accounting.py +0 -0
  88. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/schemas/v2/dataset.py +0 -0
  89. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/schemas/v2/dumps.py +0 -0
  90. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/schemas/v2/history.py +0 -0
  91. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/schemas/v2/job.py +0 -0
  92. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/schemas/v2/manifest.py +0 -0
  93. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/schemas/v2/profile.py +0 -0
  94. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/schemas/v2/project.py +0 -0
  95. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/schemas/v2/resource.py +0 -0
  96. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/schemas/v2/status_legacy.py +0 -0
  97. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/schemas/v2/task.py +0 -0
  98. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/schemas/v2/task_collection.py +0 -0
  99. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/schemas/v2/task_group.py +0 -0
  100. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/schemas/v2/workflow.py +0 -0
  101. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/schemas/v2/workflowtask.py +0 -0
  102. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/security/signup_email.py +0 -0
  103. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/app/shutdown.py +0 -0
  104. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/config/__init__.py +0 -0
  105. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/config/_data.py +0 -0
  106. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/config/_database.py +0 -0
  107. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/config/_email.py +0 -0
  108. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/config/_oauth.py +0 -0
  109. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/config/_settings_config.py +0 -0
  110. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/data_migrations/README.md +0 -0
  111. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/data_migrations/tools.py +0 -0
  112. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/exceptions.py +0 -0
  113. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/gunicorn_fractal.py +0 -0
  114. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/images/__init__.py +0 -0
  115. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/images/models.py +0 -0
  116. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/images/status_tools.py +0 -0
  117. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/images/tools.py +0 -0
  118. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/logger.py +0 -0
  119. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/main.py +0 -0
  120. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/env.py +0 -0
  121. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/naming_convention.py +0 -0
  122. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/034a469ec2eb_task_groups.py +0 -0
  123. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/091b01f51f88_add_usergroup_and_linkusergroup_table.py +0 -0
  124. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/0f5f85bb2ae7_add_pre_pinned_packages.py +0 -0
  125. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/19eca0dd47a9_user_settings_project_dir.py +0 -0
  126. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/1a83a5260664_rename.py +0 -0
  127. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/1eac13a26c83_drop_v1_tables.py +0 -0
  128. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/316140ff7ee1_remove_usersettings_cache_dir.py +0 -0
  129. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/47351f8c7ebc_drop_dataset_filters.py +0 -0
  130. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/4c308bcaea2b_add_task_args_schema_and_task_args_.py +0 -0
  131. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/4cedeb448a53_workflowtask_foreign_keys_not_nullables.py +0 -0
  132. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/501961cfcd85_remove_link_between_v1_and_v2_tasks_.py +0 -0
  133. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/50a13d6138fd_initial_schema.py +0 -0
  134. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/5bf02391cfef_v2.py +0 -0
  135. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/70e77f1c38b0_add_applyworkflow_first_task_index_and_.py +0 -0
  136. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/71eefd1dd202_add_slurm_accounts.py +0 -0
  137. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/791ce783d3d8_add_indices.py +0 -0
  138. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/83bc2ad3ffcc_2_17_0.py +0 -0
  139. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/84bf0fffde30_add_dumps_to_applyworkflow.py +0 -0
  140. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/8e8f227a3e36_update_taskv2_post_2_7_0.py +0 -0
  141. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/8f79bd162e35_add_docs_info_and_docs_link_to_task_.py +0 -0
  142. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/94a47ea2d3ff_remove_cache_dir_slurm_user_and_slurm_.py +0 -0
  143. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/969d84257cac_add_historyrun_task_id.py +0 -0
  144. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/97f444d47249_add_applyworkflow_project_dump.py +0 -0
  145. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/981d588fe248_add_executor_error_log.py +0 -0
  146. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/99ea79d9e5d2_add_dataset_history.py +0 -0
  147. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/9c5ae74c9b98_add_user_settings_table.py +0 -0
  148. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/9db60297b8b2_set_ondelete.py +0 -0
  149. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/9fd26a2b0de4_add_workflow_timestamp_created.py +0 -0
  150. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/a7f4d6137b53_add_workflow_dump_to_applyworkflow.py +0 -0
  151. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/af1ef1c83c9b_add_accounting_tables.py +0 -0
  152. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/af8673379a5c_drop_old_filter_columns.py +0 -0
  153. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/b1e7f7a1ff71_task_group_for_pixi.py +0 -0
  154. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/b3ffb095f973_json_to_jsonb.py +0 -0
  155. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/c90a7c76e996_job_id_in_history_run.py +0 -0
  156. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/d256a7379ab8_taskgroup_activity_and_venv_info_to_.py +0 -0
  157. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/d4fe3708d309_make_applyworkflow_workflow_dump_non_.py +0 -0
  158. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/da2cb2ac4255_user_group_viewer_paths.py +0 -0
  159. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/db09233ad13a_split_filters_and_keep_old_columns.py +0 -0
  160. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/e75cac726012_make_applyworkflow_start_timestamp_not_.py +0 -0
  161. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/e81103413827_add_job_type_filters.py +0 -0
  162. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/efa89c30e0a4_add_project_timestamp_created.py +0 -0
  163. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/f37aceb45062_make_historyunit_logfile_required.py +0 -0
  164. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/f384e1c0cf5d_drop_task_default_args_columns.py +0 -0
  165. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/migrations/versions/fbce16ff4e47_new_history_items.py +0 -0
  166. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/py.typed +0 -0
  167. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/__init__.py +0 -0
  168. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/components.py +0 -0
  169. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/config/__init__.py +0 -0
  170. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/config/_local.py +0 -0
  171. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/config/_slurm.py +0 -0
  172. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/config/slurm_mem_to_MB.py +0 -0
  173. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/exceptions.py +0 -0
  174. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/executors/__init__.py +0 -0
  175. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/executors/base_runner.py +0 -0
  176. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/executors/call_command_wrapper.py +0 -0
  177. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/executors/local/__init__.py +0 -0
  178. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/executors/local/get_local_config.py +0 -0
  179. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/executors/local/runner.py +0 -0
  180. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/executors/slurm_common/__init__.py +0 -0
  181. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/executors/slurm_common/_batching.py +0 -0
  182. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/executors/slurm_common/_job_states.py +0 -0
  183. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/executors/slurm_common/base_slurm_runner.py +0 -0
  184. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/executors/slurm_common/get_slurm_config.py +0 -0
  185. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/executors/slurm_common/remote.py +0 -0
  186. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/executors/slurm_common/slurm_config.py +0 -0
  187. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/executors/slurm_common/slurm_job_task_models.py +0 -0
  188. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/executors/slurm_ssh/__init__.py +0 -0
  189. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/executors/slurm_ssh/run_subprocess.py +0 -0
  190. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/executors/slurm_ssh/runner.py +0 -0
  191. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/executors/slurm_ssh/tar_commands.py +0 -0
  192. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/executors/slurm_sudo/__init__.py +0 -0
  193. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/executors/slurm_sudo/_subprocess_run_as_user.py +0 -0
  194. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/executors/slurm_sudo/runner.py +0 -0
  195. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/filenames.py +0 -0
  196. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/set_start_and_last_task_index.py +0 -0
  197. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/task_files.py +0 -0
  198. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/v2/__init__.py +0 -0
  199. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/v2/_local.py +0 -0
  200. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/v2/_slurm_ssh.py +0 -0
  201. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/v2/_slurm_sudo.py +0 -0
  202. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/v2/db_tools.py +0 -0
  203. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/v2/deduplicate_list.py +0 -0
  204. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/v2/merge_outputs.py +0 -0
  205. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/v2/runner.py +0 -0
  206. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/v2/runner_functions.py +0 -0
  207. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/v2/submit_workflow.py +0 -0
  208. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/v2/task_interface.py +0 -0
  209. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/runner/versions.py +0 -0
  210. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/ssh/__init__.py +0 -0
  211. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/ssh/_fabric.py +0 -0
  212. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/string_tools.py +0 -0
  213. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/syringe.py +0 -0
  214. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/__init__.py +0 -0
  215. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/config/__init__.py +0 -0
  216. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/config/_pixi.py +0 -0
  217. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/config/_python.py +0 -0
  218. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/utils.py +0 -0
  219. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/v2/__init__.py +0 -0
  220. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/v2/local/__init__.py +0 -0
  221. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/v2/local/_utils.py +0 -0
  222. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/v2/local/collect.py +0 -0
  223. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/v2/local/collect_pixi.py +0 -0
  224. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/v2/local/deactivate.py +0 -0
  225. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/v2/local/deactivate_pixi.py +0 -0
  226. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/v2/local/delete.py +0 -0
  227. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/v2/local/reactivate.py +0 -0
  228. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/v2/local/reactivate_pixi.py +0 -0
  229. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/v2/ssh/__init__.py +0 -0
  230. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/v2/ssh/_pixi_slurm_ssh.py +0 -0
  231. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/v2/ssh/_utils.py +0 -0
  232. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/v2/ssh/collect.py +0 -0
  233. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/v2/ssh/collect_pixi.py +0 -0
  234. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/v2/ssh/deactivate.py +0 -0
  235. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/v2/ssh/deactivate_pixi.py +0 -0
  236. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/v2/ssh/delete.py +0 -0
  237. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/v2/ssh/reactivate.py +0 -0
  238. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/v2/ssh/reactivate_pixi.py +0 -0
  239. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/v2/templates/1_create_venv.sh +0 -0
  240. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/v2/templates/2_pip_install.sh +0 -0
  241. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/v2/templates/3_pip_freeze.sh +0 -0
  242. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/v2/templates/4_pip_show.sh +0 -0
  243. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/v2/templates/5_get_venv_size_and_file_number.sh +0 -0
  244. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/v2/templates/6_pip_install_from_freeze.sh +0 -0
  245. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/v2/templates/pixi_1_extract.sh +0 -0
  246. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/v2/templates/pixi_2_install.sh +0 -0
  247. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/v2/templates/pixi_3_post_install.sh +0 -0
  248. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/v2/utils_background.py +0 -0
  249. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/v2/utils_database.py +0 -0
  250. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/v2/utils_package_names.py +0 -0
  251. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/v2/utils_pixi.py +0 -0
  252. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/v2/utils_python_interpreter.py +0 -0
  253. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/tasks/v2/utils_templates.py +0 -0
  254. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/types/__init__.py +0 -0
  255. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/types/validators/__init__.py +0 -0
  256. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/types/validators/_common_validators.py +0 -0
  257. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/types/validators/_filter_validators.py +0 -0
  258. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/types/validators/_workflow_task_arguments_validators.py +0 -0
  259. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/urls.py +0 -0
  260. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/fractal_server/utils.py +0 -0
  261. {fractal_server-2.17.0a8 → fractal_server-2.17.0a9}/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.0a8
3
+ Version: 2.17.0a9
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.0a9"
@@ -62,7 +62,7 @@ async def get_resource_list(
62
62
  Query `Resource` table.
63
63
  """
64
64
 
65
- stm = select(Resource)
65
+ stm = select(Resource).order_by(Resource.id)
66
66
  res = await db.execute(stm)
67
67
  resource_list = res.scalars().all()
68
68
 
@@ -103,6 +103,7 @@ async def query_tasks(
103
103
  .where(TaskGroupV2.resource_id == resource_id)
104
104
  )
105
105
 
106
+ stm = stm.order_by(TaskV2.id)
106
107
  res = await db.execute(stm)
107
108
  task_list = res.scalars().all()
108
109
  if len(task_list) > max_number_of_results:
@@ -133,6 +133,7 @@ async def query_task_group_list(
133
133
  if resource_id is not None:
134
134
  stm = stm.where(TaskGroupV2.resource_id == resource_id)
135
135
 
136
+ stm = stm.order_by(TaskGroupV2.id)
136
137
  res = await db.execute(stm)
137
138
  task_groups_list = res.scalars().all()
138
139
  return task_groups_list
@@ -20,7 +20,9 @@ from fractal_server.app.models.v2 import WorkflowTaskV2
20
20
  from fractal_server.app.routes.api.v2._aux_functions import (
21
21
  _get_user_resource_id,
22
22
  )
23
- from fractal_server.app.routes.auth._aux_auth import _get_default_usergroup_id
23
+ from fractal_server.app.routes.auth._aux_auth import (
24
+ _get_default_usergroup_id_or_none,
25
+ )
24
26
  from fractal_server.app.routes.auth._aux_auth import (
25
27
  _verify_user_belongs_to_group,
26
28
  )
@@ -73,7 +75,7 @@ async def _get_task_group_read_access(
73
75
  status_code=status.HTTP_403_FORBIDDEN,
74
76
  detail=(
75
77
  "Current user has no read access to TaskGroupV2 "
76
- f"{task_group_id}.",
78
+ f"{task_group_id}."
77
79
  ),
78
80
  )
79
81
 
@@ -90,7 +92,7 @@ async def _get_task_group_read_access(
90
92
  .where(LinkUserGroup.user_id == user_id)
91
93
  .where(UserOAuth.id == user_id)
92
94
  .where(Profile.id == UserOAuth.profile_id)
93
- .where(TaskGroupV2.resource_id == Profile.resource_id)
95
+ .where(task_group.resource_id == Profile.resource_id)
94
96
  )
95
97
  res = await db.execute(stm)
96
98
  link = res.unique().scalars().one_or_none()
@@ -237,7 +239,7 @@ async def _get_valid_user_group_id(
237
239
  elif private is True:
238
240
  user_group_id = None
239
241
  elif user_group_id is None:
240
- user_group_id = await _get_default_usergroup_id(db=db)
242
+ user_group_id = await _get_default_usergroup_id_or_none(db=db)
241
243
  else:
242
244
  await _verify_user_belongs_to_group(
243
245
  user_id=user_id, user_group_id=user_group_id, db=db
@@ -370,7 +372,9 @@ async def _verify_non_duplication_group_constraint(
370
372
 
371
373
 
372
374
  async def _verify_non_duplication_group_path(
375
+ *,
373
376
  path: str | None,
377
+ resource_id: int,
374
378
  db: AsyncSession,
375
379
  ) -> None:
376
380
  """
@@ -378,7 +382,11 @@ async def _verify_non_duplication_group_path(
378
382
  """
379
383
  if path is None:
380
384
  return
381
- stm = select(TaskGroupV2.id).where(TaskGroupV2.path == path)
385
+ stm = (
386
+ select(TaskGroupV2.id)
387
+ .where(TaskGroupV2.path == path)
388
+ .where(TaskGroupV2.resource_id == resource_id)
389
+ )
382
390
  res = await db.execute(stm)
383
391
  duplicate_ids = res.scalars().all()
384
392
  if duplicate_ids:
@@ -5,8 +5,10 @@ from sqlmodel import select
5
5
  from fractal_server.app.db import AsyncSession
6
6
  from fractal_server.app.models import LinkUserGroup
7
7
  from fractal_server.app.models.v2 import TaskGroupV2
8
+ from fractal_server.config import get_settings
8
9
  from fractal_server.exceptions import UnreachableBranchError
9
10
  from fractal_server.logger import set_logger
11
+ from fractal_server.syringe import Inject
10
12
 
11
13
 
12
14
  logger = set_logger(__name__)
@@ -16,7 +18,7 @@ async def _disambiguate_task_groups(
16
18
  *,
17
19
  matching_task_groups: list[TaskGroupV2],
18
20
  user_id: int,
19
- default_group_id: int,
21
+ default_group_id: int | None,
20
22
  db: AsyncSession,
21
23
  ) -> TaskGroupV2 | None:
22
24
  """
@@ -49,21 +51,23 @@ async def _disambiguate_task_groups(
49
51
  )
50
52
 
51
53
  # Medium priority: task groups owned by default user group
52
- list_user_group_ids = [tg.user_group_id for tg in matching_task_groups]
53
- try:
54
- ind_user_group_id = list_user_group_ids.index(default_group_id)
55
- task_group = matching_task_groups[ind_user_group_id]
56
- logger.debug(
57
- "[_disambiguate_task_groups] "
58
- f"Found task group {task_group.id} with {user_id=}, return."
59
- )
60
- return task_group
61
- except ValueError:
62
- logger.debug(
63
- "[_disambiguate_task_groups] "
64
- "No task group with user_group_id="
65
- f"{default_group_id}, continue."
66
- )
54
+ settings = Inject(get_settings)
55
+ if settings.FRACTAL_DEFAULT_GROUP_NAME is not None:
56
+ list_user_group_ids = [tg.user_group_id for tg in matching_task_groups]
57
+ try:
58
+ ind_user_group_id = list_user_group_ids.index(default_group_id)
59
+ task_group = matching_task_groups[ind_user_group_id]
60
+ logger.debug(
61
+ "[_disambiguate_task_groups] "
62
+ f"Found task group {task_group.id} with {user_id=}, return."
63
+ )
64
+ return task_group
65
+ except ValueError:
66
+ logger.debug(
67
+ "[_disambiguate_task_groups] "
68
+ "No task group with user_group_id="
69
+ f"{default_group_id}, continue."
70
+ )
67
71
 
68
72
  # Lowest priority: task groups owned by other groups, sorted
69
73
  # according to age of the user/usergroup link
@@ -97,7 +101,7 @@ async def _disambiguate_task_groups_not_none(
97
101
  *,
98
102
  matching_task_groups: list[TaskGroupV2],
99
103
  user_id: int,
100
- default_group_id: int,
104
+ default_group_id: int | None,
101
105
  db: AsyncSession,
102
106
  ) -> TaskGroupV2:
103
107
  """
@@ -133,7 +137,7 @@ async def remove_duplicate_task_groups(
133
137
  *,
134
138
  task_groups: list[TaskGroupV2],
135
139
  user_id: int,
136
- default_group_id: int,
140
+ default_group_id: int | None,
137
141
  db: AsyncSession,
138
142
  ) -> list[TaskGroupV2]:
139
143
  """
@@ -73,6 +73,7 @@ async def get_list_task(
73
73
  if author is not None:
74
74
  stm = stm.where(TaskV2.authors.icontains(author))
75
75
 
76
+ stm = stm.order_by(TaskV2.id)
76
77
  res = await db.execute(stm)
77
78
  task_list = list(res.scalars().all())
78
79
  await db.close()
@@ -305,6 +305,7 @@ async def collect_tasks_pip(
305
305
  )
306
306
  await _verify_non_duplication_group_path(
307
307
  path=task_group_attrs["path"],
308
+ resource_id=resource_id,
308
309
  db=db,
309
310
  )
310
311
 
@@ -159,6 +159,7 @@ async def collect_task_pixi(
159
159
  )
160
160
  await _verify_non_duplication_group_path(
161
161
  path=task_group_attrs["path"],
162
+ resource_id=resource_id,
162
163
  db=db,
163
164
  )
164
165
 
@@ -11,6 +11,7 @@ from pydantic.types import AwareDatetime
11
11
  from sqlmodel import or_
12
12
  from sqlmodel import select
13
13
 
14
+ from ._aux_functions import _get_user_resource_id
14
15
  from ._aux_functions_tasks import _get_task_group_full_access
15
16
  from ._aux_functions_tasks import _get_task_group_read_access
16
17
  from ._aux_functions_tasks import _verify_non_duplication_group_constraint
@@ -22,7 +23,9 @@ from fractal_server.app.models import UserOAuth
22
23
  from fractal_server.app.models.v2 import TaskGroupActivityV2
23
24
  from fractal_server.app.models.v2 import TaskGroupV2
24
25
  from fractal_server.app.routes.auth import current_user_act_ver_prof
25
- from fractal_server.app.routes.auth._aux_auth import _get_default_usergroup_id
26
+ from fractal_server.app.routes.auth._aux_auth import (
27
+ _get_default_usergroup_id_or_none,
28
+ )
26
29
  from fractal_server.app.routes.auth._aux_auth import (
27
30
  _verify_user_belongs_to_group,
28
31
  )
@@ -142,7 +145,14 @@ async def get_task_group_list(
142
145
  )
143
146
  ),
144
147
  )
145
- stm = select(TaskGroupV2).where(condition).order_by(TaskGroupV2.pkg_name)
148
+
149
+ user_resource_id = await _get_user_resource_id(user_id=user.id, db=db)
150
+ stm = (
151
+ select(TaskGroupV2)
152
+ .where(TaskGroupV2.resource_id == user_resource_id)
153
+ .where(condition)
154
+ .order_by(TaskGroupV2.pkg_name)
155
+ )
146
156
  if only_active:
147
157
  stm = stm.where(TaskGroupV2.active)
148
158
 
@@ -155,7 +165,7 @@ async def get_task_group_list(
155
165
  setattr(task, "args_schema_non_parallel", None)
156
166
  setattr(task, "args_schema_parallel", None)
157
167
 
158
- default_group_id = await _get_default_usergroup_id(db)
168
+ default_group_id = await _get_default_usergroup_id_or_none(db)
159
169
  grouped_result = [
160
170
  (
161
171
  pkg_name,
@@ -15,6 +15,7 @@ from ....schemas.v2 import WorkflowReadV2WithWarnings
15
15
  from ....schemas.v2 import WorkflowTaskCreateV2
16
16
  from ._aux_functions import _check_workflow_exists
17
17
  from ._aux_functions import _get_project_check_owner
18
+ from ._aux_functions import _get_user_resource_id
18
19
  from ._aux_functions import _workflow_insert_task
19
20
  from ._aux_functions_tasks import _add_warnings_to_workflow_tasks
20
21
  from ._aux_functions_tasks import _check_type_filters_compatibility
@@ -25,7 +26,9 @@ from fractal_server.app.routes.api.v2._aux_task_group_disambiguation import (
25
26
  _disambiguate_task_groups,
26
27
  )
27
28
  from fractal_server.app.routes.auth import current_user_act_ver_prof
28
- from fractal_server.app.routes.auth._aux_auth import _get_default_usergroup_id
29
+ from fractal_server.app.routes.auth._aux_auth import (
30
+ _get_default_usergroup_id_or_none,
31
+ )
29
32
  from fractal_server.app.schemas.v2 import TaskImportV2
30
33
  from fractal_server.logger import set_logger
31
34
 
@@ -38,20 +41,26 @@ logger = set_logger(__name__)
38
41
  async def _get_user_accessible_taskgroups(
39
42
  *,
40
43
  user_id: int,
44
+ user_resource_id: int,
41
45
  db: AsyncSession,
42
46
  ) -> list[TaskGroupV2]:
43
47
  """
44
48
  Retrieve list of task groups that the user has access to.
45
49
  """
46
- stm = select(TaskGroupV2).where(
47
- or_(
48
- TaskGroupV2.user_id == user_id,
49
- TaskGroupV2.user_group_id.in_(
50
- select(LinkUserGroup.group_id).where(
51
- LinkUserGroup.user_id == user_id
52
- )
53
- ),
50
+
51
+ stm = (
52
+ select(TaskGroupV2)
53
+ .where(
54
+ or_(
55
+ TaskGroupV2.user_id == user_id,
56
+ TaskGroupV2.user_group_id.in_(
57
+ select(LinkUserGroup.group_id).where(
58
+ LinkUserGroup.user_id == user_id
59
+ )
60
+ ),
61
+ )
54
62
  )
63
+ .where(TaskGroupV2.resource_id == user_resource_id)
55
64
  )
56
65
  res = await db.execute(stm)
57
66
  accessible_task_groups = res.scalars().all()
@@ -93,7 +102,7 @@ async def _get_task_by_taskimport(
93
102
  task_import: TaskImportV2,
94
103
  task_groups_list: list[TaskGroupV2],
95
104
  user_id: int,
96
- default_group_id: int,
105
+ default_group_id: int | None,
97
106
  db: AsyncSession,
98
107
  ) -> int | None:
99
108
  """
@@ -212,6 +221,8 @@ async def import_workflow(
212
221
  Import an existing workflow into a project and create required objects.
213
222
  """
214
223
 
224
+ user_resource_id = await _get_user_resource_id(user_id=user.id, db=db)
225
+
215
226
  # Preliminary checks
216
227
  await _get_project_check_owner(
217
228
  project_id=project_id,
@@ -227,8 +238,9 @@ async def import_workflow(
227
238
  task_group_list = await _get_user_accessible_taskgroups(
228
239
  user_id=user.id,
229
240
  db=db,
241
+ user_resource_id=user_resource_id,
230
242
  )
231
- default_group_id = await _get_default_usergroup_id(db)
243
+ default_group_id = await _get_default_usergroup_id_or_none(db)
232
244
 
233
245
  list_wf_tasks = []
234
246
  list_task_ids = []
@@ -9,8 +9,10 @@ from fractal_server.app.models.security import UserGroup
9
9
  from fractal_server.app.models.security import UserOAuth
10
10
  from fractal_server.app.schemas.user import UserRead
11
11
  from fractal_server.app.schemas.user_group import UserGroupRead
12
- from fractal_server.app.security import FRACTAL_DEFAULT_GROUP_NAME
12
+ from fractal_server.config import get_settings
13
13
  from fractal_server.logger import set_logger
14
+ from fractal_server.syringe import Inject
15
+
14
16
 
15
17
  logger = set_logger(__name__)
16
18
 
@@ -29,6 +31,9 @@ async def _get_single_user_with_groups(
29
31
  Returns:
30
32
  A `UserRead` object with `group_ids_names` dict
31
33
  """
34
+
35
+ settings = Inject(get_settings)
36
+
32
37
  stm_groups = (
33
38
  select(UserGroup)
34
39
  .join(LinkUserGroup)
@@ -39,25 +44,25 @@ async def _get_single_user_with_groups(
39
44
  groups = res.scalars().unique().all()
40
45
  group_ids_names = [(group.id, group.name) for group in groups]
41
46
 
42
- # Check that Fractal Default Group is the first of the list. If not, fix.
47
+ # Identify the default-group position in the list of groups
43
48
  index = next(
44
49
  (
45
- i
46
- for i, group_tuple in enumerate(group_ids_names)
47
- if group_tuple[1] == FRACTAL_DEFAULT_GROUP_NAME
50
+ ind
51
+ for ind, group_tuple in enumerate(group_ids_names)
52
+ if group_tuple[1] == settings.FRACTAL_DEFAULT_GROUP_NAME
48
53
  ),
49
54
  None,
50
55
  )
51
- if index is None:
52
- logger.warning(
53
- f"User {user.id} not in "
54
- f"default UserGroup '{FRACTAL_DEFAULT_GROUP_NAME}'"
55
- )
56
- elif index != 0:
56
+ if (index is None) or (index == 0):
57
+ # Either the default group does not exist, or it is already the first
58
+ # one. No action needed.
59
+ pass
60
+ else:
61
+ # Move the default group to the first position
57
62
  default_group = group_ids_names.pop(index)
58
63
  group_ids_names.insert(0, default_group)
59
- else:
60
- pass
64
+
65
+ # Create dump of `user.oauth_accounts` relationship
61
66
  oauth_accounts = [
62
67
  oauth_account.model_dump() for oauth_account in user.oauth_accounts
63
68
  ]
@@ -121,17 +126,31 @@ async def _usergroup_or_404(usergroup_id: int, db: AsyncSession) -> UserGroup:
121
126
  return user
122
127
 
123
128
 
124
- async def _get_default_usergroup_id(db: AsyncSession) -> int:
129
+ async def _get_default_usergroup_id_or_none(db: AsyncSession) -> int | None:
130
+ """
131
+ Return the ID of the group named `"All"`, if `FRACTAL_DEFAULT_GROUP_NAME`
132
+ is set and such group exists. Return `None`, if
133
+ `FRACTAL_DEFAULT_GROUP_NAME=None` or if the `"All"` group does not exist.
134
+ """
135
+ settings = Inject(get_settings)
125
136
  stm = select(UserGroup.id).where(
126
- UserGroup.name == FRACTAL_DEFAULT_GROUP_NAME
137
+ UserGroup.name == settings.FRACTAL_DEFAULT_GROUP_NAME
127
138
  )
128
139
  res = await db.execute(stm)
129
140
  user_group_id = res.scalars().one_or_none()
130
- if user_group_id is None:
141
+
142
+ if (
143
+ settings.FRACTAL_DEFAULT_GROUP_NAME is not None
144
+ and user_group_id is None
145
+ ):
131
146
  raise HTTPException(
132
147
  status_code=status.HTTP_404_NOT_FOUND,
133
- detail=f"User group '{FRACTAL_DEFAULT_GROUP_NAME}' not found.",
148
+ detail=(
149
+ f"User group '{settings.FRACTAL_DEFAULT_GROUP_NAME}'"
150
+ " not found.",
151
+ ),
134
152
  )
153
+
135
154
  return user_group_id
136
155
 
137
156
 
@@ -10,7 +10,7 @@ from sqlalchemy.ext.asyncio import AsyncSession
10
10
  from sqlmodel import select
11
11
 
12
12
  from . import current_superuser_act
13
- from ._aux_auth import _get_default_usergroup_id
13
+ from ._aux_auth import _get_default_usergroup_id_or_none
14
14
  from ._aux_auth import _get_single_usergroup_with_user_ids
15
15
  from ._aux_auth import _user_or_404
16
16
  from ._aux_auth import _usergroup_or_404
@@ -21,11 +21,13 @@ from fractal_server.app.models import UserOAuth
21
21
  from fractal_server.app.schemas.user_group import UserGroupCreate
22
22
  from fractal_server.app.schemas.user_group import UserGroupRead
23
23
  from fractal_server.app.schemas.user_group import UserGroupUpdate
24
- from fractal_server.app.security import FRACTAL_DEFAULT_GROUP_NAME
24
+ from fractal_server.config import get_settings
25
25
  from fractal_server.logger import set_logger
26
+ from fractal_server.syringe import Inject
26
27
 
27
28
  logger = set_logger(__name__)
28
29
 
30
+
29
31
  router_group = APIRouter()
30
32
 
31
33
 
@@ -138,19 +140,24 @@ async def delete_single_group(
138
140
  user: UserOAuth = Depends(current_superuser_act),
139
141
  db: AsyncSession = Depends(get_async_db),
140
142
  ) -> Response:
143
+ """
144
+ Delete a user group.
145
+
146
+ If `FRACTAL_DEFAULT_GROUP_NAME="All"`, a group named `"All"` cannot be
147
+ deleted. If `FRACTAL_DEFAULT_GROUP_NAME=None`, any group can be deleted.
148
+ """
149
+ settings = Inject(get_settings)
141
150
  group = await _usergroup_or_404(group_id, db)
142
151
 
143
- if group.name == FRACTAL_DEFAULT_GROUP_NAME:
152
+ if group.name == settings.FRACTAL_DEFAULT_GROUP_NAME:
144
153
  raise HTTPException(
145
154
  status_code=status.HTTP_422_UNPROCESSABLE_CONTENT,
146
155
  detail=(
147
156
  "Cannot delete default UserGroup "
148
- f"'{FRACTAL_DEFAULT_GROUP_NAME}'."
157
+ f"'{settings.FRACTAL_DEFAULT_GROUP_NAME}'."
149
158
  ),
150
159
  )
151
160
 
152
- # Delete
153
-
154
161
  await db.delete(group)
155
162
  await db.commit()
156
163
 
@@ -188,18 +195,21 @@ async def remove_user_from_group(
188
195
  superuser: UserOAuth = Depends(current_superuser_act),
189
196
  db: AsyncSession = Depends(get_async_db),
190
197
  ) -> UserGroupRead:
198
+ settings = Inject(get_settings)
191
199
  # Check that user and group exist
192
200
  await _usergroup_or_404(group_id, db)
193
201
  user = await _user_or_404(user_id, db)
194
202
 
195
203
  # Check that group is not the default one
196
- default_user_group_id = await _get_default_usergroup_id(db=db)
197
- if default_user_group_id == group_id:
204
+ default_user_group_id_or_none = await _get_default_usergroup_id_or_none(
205
+ db=db
206
+ )
207
+ if default_user_group_id_or_none == group_id:
198
208
  raise HTTPException(
199
209
  status_code=status.HTTP_422_UNPROCESSABLE_CONTENT,
200
210
  detail=(
201
- f"Cannot remove user from '{FRACTAL_DEFAULT_GROUP_NAME}' "
202
- "group.",
211
+ f"Cannot remove user from "
212
+ f"'{settings.FRACTAL_DEFAULT_GROUP_NAME}' group.",
203
213
  ),
204
214
  )
205
215
 
@@ -15,9 +15,8 @@ from . import current_superuser_act
15
15
  from ...db import get_async_db
16
16
  from ...schemas.user import UserRead
17
17
  from ...schemas.user import UserUpdate
18
- from ._aux_auth import _get_default_usergroup_id
18
+ from ._aux_auth import _get_default_usergroup_id_or_none
19
19
  from ._aux_auth import _get_single_user_with_groups
20
- from ._aux_auth import FRACTAL_DEFAULT_GROUP_NAME
21
20
  from fractal_server.app.models import LinkUserGroup
22
21
  from fractal_server.app.models import UserGroup
23
22
  from fractal_server.app.models import UserOAuth
@@ -26,7 +25,10 @@ from fractal_server.app.routes.auth._aux_auth import _user_or_404
26
25
  from fractal_server.app.schemas.user import UserUpdateGroups
27
26
  from fractal_server.app.security import get_user_manager
28
27
  from fractal_server.app.security import UserManager
28
+ from fractal_server.config import get_settings
29
29
  from fractal_server.logger import set_logger
30
+ from fractal_server.syringe import Inject
31
+
30
32
 
31
33
  router_users = APIRouter()
32
34
 
@@ -146,6 +148,7 @@ async def set_user_groups(
146
148
  superuser: UserOAuth = Depends(current_superuser_act),
147
149
  db: AsyncSession = Depends(get_async_db),
148
150
  ) -> UserRead:
151
+ settings = Inject(get_settings)
149
152
  # Preliminary check that all objects exist in the db
150
153
  user = await _user_or_404(user_id=user_id, db=db)
151
154
  target_group_ids = user_update.group_ids
@@ -161,13 +164,16 @@ async def set_user_groups(
161
164
  )
162
165
 
163
166
  # Check that default group is not being removed
164
- default_group_id = await _get_default_usergroup_id(db=db)
165
- if default_group_id not in target_group_ids:
167
+ default_group_id_or_none = await _get_default_usergroup_id_or_none(db=db)
168
+ if (
169
+ default_group_id_or_none is not None
170
+ and default_group_id_or_none not in target_group_ids
171
+ ):
166
172
  raise HTTPException(
167
173
  status_code=status.HTTP_422_UNPROCESSABLE_CONTENT,
168
174
  detail=(
169
175
  f"Cannot remove user from "
170
- f"'{FRACTAL_DEFAULT_GROUP_NAME}' group.",
176
+ f"'{settings.FRACTAL_DEFAULT_GROUP_NAME}' group.",
171
177
  ),
172
178
  )
173
179