fractal-server 2.7.0a0__tar.gz → 2.7.0a1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/PKG-INFO +1 -1
  2. fractal_server-2.7.0a1/fractal_server/__init__.py +1 -0
  3. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/models/linkusergroup.py +11 -0
  4. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/api/v2/task_group.py +11 -3
  5. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/auth/_aux_auth.py +30 -29
  6. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/auth/current_user.py +5 -5
  7. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/auth/router.py +0 -2
  8. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/auth/users.py +8 -7
  9. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/schemas/user.py +1 -2
  10. fractal_server-2.7.0a1/fractal_server/migrations/versions/df7cc3501bf7_linkusergroup_timestamp_created.py +42 -0
  11. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/pyproject.toml +2 -2
  12. fractal_server-2.7.0a0/fractal_server/__init__.py +0 -1
  13. fractal_server-2.7.0a0/fractal_server/app/routes/auth/group_names.py +0 -34
  14. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/LICENSE +0 -0
  15. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/README.md +0 -0
  16. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/__main__.py +0 -0
  17. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/alembic.ini +0 -0
  18. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/__init__.py +0 -0
  19. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/db/__init__.py +0 -0
  20. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/models/__init__.py +0 -0
  21. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/models/linkuserproject.py +0 -0
  22. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/models/security.py +0 -0
  23. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/models/user_settings.py +0 -0
  24. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/models/v1/__init__.py +0 -0
  25. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/models/v1/dataset.py +0 -0
  26. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/models/v1/job.py +0 -0
  27. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/models/v1/project.py +0 -0
  28. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/models/v1/state.py +0 -0
  29. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/models/v1/task.py +0 -0
  30. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/models/v1/workflow.py +0 -0
  31. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/models/v2/__init__.py +0 -0
  32. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/models/v2/collection_state.py +0 -0
  33. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/models/v2/dataset.py +0 -0
  34. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/models/v2/job.py +0 -0
  35. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/models/v2/project.py +0 -0
  36. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/models/v2/task.py +0 -0
  37. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/models/v2/workflow.py +0 -0
  38. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/models/v2/workflowtask.py +0 -0
  39. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/__init__.py +0 -0
  40. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/admin/__init__.py +0 -0
  41. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/admin/v1.py +0 -0
  42. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/admin/v2.py +0 -0
  43. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/api/__init__.py +0 -0
  44. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/api/v1/__init__.py +0 -0
  45. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/api/v1/_aux_functions.py +0 -0
  46. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/api/v1/dataset.py +0 -0
  47. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/api/v1/job.py +0 -0
  48. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/api/v1/project.py +0 -0
  49. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/api/v1/task.py +0 -0
  50. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/api/v1/task_collection.py +0 -0
  51. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/api/v1/workflow.py +0 -0
  52. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/api/v1/workflowtask.py +0 -0
  53. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/api/v2/__init__.py +0 -0
  54. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/api/v2/_aux_functions.py +0 -0
  55. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/api/v2/_aux_functions_tasks.py +0 -0
  56. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/api/v2/dataset.py +0 -0
  57. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/api/v2/images.py +0 -0
  58. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/api/v2/job.py +0 -0
  59. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/api/v2/project.py +0 -0
  60. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/api/v2/status.py +0 -0
  61. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/api/v2/submit.py +0 -0
  62. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/api/v2/task.py +0 -0
  63. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/api/v2/task_collection.py +0 -0
  64. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/api/v2/task_collection_custom.py +0 -0
  65. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/api/v2/workflow.py +0 -0
  66. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/api/v2/workflowtask.py +0 -0
  67. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/auth/__init__.py +0 -0
  68. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/auth/group.py +0 -0
  69. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/auth/login.py +0 -0
  70. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/auth/oauth.py +0 -0
  71. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/auth/register.py +0 -0
  72. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/aux/__init__.py +0 -0
  73. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/aux/_job.py +0 -0
  74. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/aux/_runner.py +0 -0
  75. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/routes/aux/validate_user_settings.py +0 -0
  76. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/.gitignore +0 -0
  77. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/__init__.py +0 -0
  78. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/async_wrap.py +0 -0
  79. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/components.py +0 -0
  80. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/compress_folder.py +0 -0
  81. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/exceptions.py +0 -0
  82. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/executors/__init__.py +0 -0
  83. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/executors/slurm/__init__.py +0 -0
  84. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/executors/slurm/_batching.py +0 -0
  85. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/executors/slurm/_slurm_config.py +0 -0
  86. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/executors/slurm/remote.py +0 -0
  87. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/executors/slurm/ssh/__init__.py +0 -0
  88. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/executors/slurm/ssh/_executor_wait_thread.py +0 -0
  89. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/executors/slurm/ssh/_slurm_job.py +0 -0
  90. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/executors/slurm/ssh/executor.py +0 -0
  91. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/executors/slurm/sudo/__init__.py +0 -0
  92. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/executors/slurm/sudo/_check_jobs_status.py +0 -0
  93. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/executors/slurm/sudo/_executor_wait_thread.py +0 -0
  94. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/executors/slurm/sudo/_subprocess_run_as_user.py +0 -0
  95. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/executors/slurm/sudo/executor.py +0 -0
  96. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/extract_archive.py +0 -0
  97. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/filenames.py +0 -0
  98. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/run_subprocess.py +0 -0
  99. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/set_start_and_last_task_index.py +0 -0
  100. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/shutdown.py +0 -0
  101. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/task_files.py +0 -0
  102. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/v1/__init__.py +0 -0
  103. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/v1/_common.py +0 -0
  104. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/v1/_local/__init__.py +0 -0
  105. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/v1/_local/_local_config.py +0 -0
  106. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/v1/_local/_submit_setup.py +0 -0
  107. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/v1/_local/executor.py +0 -0
  108. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/v1/_slurm/__init__.py +0 -0
  109. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/v1/_slurm/_submit_setup.py +0 -0
  110. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/v1/_slurm/get_slurm_config.py +0 -0
  111. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/v1/common.py +0 -0
  112. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/v1/handle_failed_job.py +0 -0
  113. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/v2/__init__.py +0 -0
  114. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/v2/_local/__init__.py +0 -0
  115. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/v2/_local/_local_config.py +0 -0
  116. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/v2/_local/_submit_setup.py +0 -0
  117. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/v2/_local/executor.py +0 -0
  118. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/v2/_local_experimental/__init__.py +0 -0
  119. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/v2/_local_experimental/_local_config.py +0 -0
  120. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/v2/_local_experimental/_submit_setup.py +0 -0
  121. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/v2/_local_experimental/executor.py +0 -0
  122. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/v2/_slurm_common/__init__.py +0 -0
  123. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/v2/_slurm_common/get_slurm_config.py +0 -0
  124. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/v2/_slurm_ssh/__init__.py +0 -0
  125. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/v2/_slurm_ssh/_submit_setup.py +0 -0
  126. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/v2/_slurm_sudo/__init__.py +0 -0
  127. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/v2/_slurm_sudo/_submit_setup.py +0 -0
  128. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/v2/deduplicate_list.py +0 -0
  129. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/v2/handle_failed_job.py +0 -0
  130. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/v2/merge_outputs.py +0 -0
  131. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/v2/runner.py +0 -0
  132. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/v2/runner_functions.py +0 -0
  133. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/v2/runner_functions_low_level.py +0 -0
  134. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/v2/task_interface.py +0 -0
  135. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/runner/versions.py +0 -0
  136. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/schemas/__init__.py +0 -0
  137. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/schemas/_validators.py +0 -0
  138. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/schemas/user_group.py +0 -0
  139. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/schemas/user_settings.py +0 -0
  140. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/schemas/v1/__init__.py +0 -0
  141. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/schemas/v1/applyworkflow.py +0 -0
  142. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/schemas/v1/dataset.py +0 -0
  143. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/schemas/v1/dumps.py +0 -0
  144. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/schemas/v1/manifest.py +0 -0
  145. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/schemas/v1/project.py +0 -0
  146. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/schemas/v1/state.py +0 -0
  147. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/schemas/v1/task.py +0 -0
  148. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/schemas/v1/task_collection.py +0 -0
  149. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/schemas/v1/workflow.py +0 -0
  150. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/schemas/v2/__init__.py +0 -0
  151. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/schemas/v2/dataset.py +0 -0
  152. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/schemas/v2/dumps.py +0 -0
  153. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/schemas/v2/job.py +0 -0
  154. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/schemas/v2/manifest.py +0 -0
  155. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/schemas/v2/project.py +0 -0
  156. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/schemas/v2/status.py +0 -0
  157. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/schemas/v2/task.py +0 -0
  158. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/schemas/v2/task_collection.py +0 -0
  159. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/schemas/v2/task_group.py +0 -0
  160. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/schemas/v2/workflow.py +0 -0
  161. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/schemas/v2/workflowtask.py +0 -0
  162. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/security/__init__.py +0 -0
  163. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/app/user_settings.py +0 -0
  164. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/config.py +0 -0
  165. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/data_migrations/README.md +0 -0
  166. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/data_migrations/tools.py +0 -0
  167. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/gunicorn_fractal.py +0 -0
  168. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/images/__init__.py +0 -0
  169. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/images/models.py +0 -0
  170. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/images/tools.py +0 -0
  171. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/logger.py +0 -0
  172. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/main.py +0 -0
  173. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/migrations/README +0 -0
  174. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/migrations/env.py +0 -0
  175. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/migrations/naming_convention.py +0 -0
  176. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/migrations/script.py.mako +0 -0
  177. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/migrations/versions/091b01f51f88_add_usergroup_and_linkusergroup_table.py +0 -0
  178. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/migrations/versions/4c308bcaea2b_add_task_args_schema_and_task_args_.py +0 -0
  179. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/migrations/versions/4cedeb448a53_workflowtask_foreign_keys_not_nullables.py +0 -0
  180. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/migrations/versions/501961cfcd85_remove_link_between_v1_and_v2_tasks_.py +0 -0
  181. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/migrations/versions/50a13d6138fd_initial_schema.py +0 -0
  182. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/migrations/versions/5bf02391cfef_v2.py +0 -0
  183. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/migrations/versions/70e77f1c38b0_add_applyworkflow_first_task_index_and_.py +0 -0
  184. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/migrations/versions/71eefd1dd202_add_slurm_accounts.py +0 -0
  185. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/migrations/versions/7cf1baae8fb4_task_group_v2.py +0 -0
  186. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/migrations/versions/84bf0fffde30_add_dumps_to_applyworkflow.py +0 -0
  187. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/migrations/versions/8f79bd162e35_add_docs_info_and_docs_link_to_task_.py +0 -0
  188. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/migrations/versions/94a47ea2d3ff_remove_cache_dir_slurm_user_and_slurm_.py +0 -0
  189. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/migrations/versions/97f444d47249_add_applyworkflow_project_dump.py +0 -0
  190. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/migrations/versions/99ea79d9e5d2_add_dataset_history.py +0 -0
  191. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/migrations/versions/9c5ae74c9b98_add_user_settings_table.py +0 -0
  192. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/migrations/versions/9fd26a2b0de4_add_workflow_timestamp_created.py +0 -0
  193. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/migrations/versions/a7f4d6137b53_add_workflow_dump_to_applyworkflow.py +0 -0
  194. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/migrations/versions/d4fe3708d309_make_applyworkflow_workflow_dump_non_.py +0 -0
  195. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/migrations/versions/da2cb2ac4255_user_group_viewer_paths.py +0 -0
  196. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/migrations/versions/e75cac726012_make_applyworkflow_start_timestamp_not_.py +0 -0
  197. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/migrations/versions/efa89c30e0a4_add_project_timestamp_created.py +0 -0
  198. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/migrations/versions/f384e1c0cf5d_drop_task_default_args_columns.py +0 -0
  199. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/py.typed +0 -0
  200. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/ssh/__init__.py +0 -0
  201. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/ssh/_fabric.py +0 -0
  202. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/string_tools.py +0 -0
  203. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/syringe.py +0 -0
  204. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/tasks/__init__.py +0 -0
  205. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/tasks/utils.py +0 -0
  206. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/tasks/v1/_TaskCollectPip.py +0 -0
  207. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/tasks/v1/__init__.py +0 -0
  208. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/tasks/v1/background_operations.py +0 -0
  209. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/tasks/v1/endpoint_operations.py +0 -0
  210. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/tasks/v1/get_collection_data.py +0 -0
  211. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/tasks/v1/utils.py +0 -0
  212. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/tasks/v2/_TaskCollectPip.py +0 -0
  213. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/tasks/v2/__init__.py +0 -0
  214. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/tasks/v2/_venv_pip.py +0 -0
  215. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/tasks/v2/background_operations.py +0 -0
  216. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/tasks/v2/background_operations_ssh.py +0 -0
  217. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/tasks/v2/database_operations.py +0 -0
  218. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/tasks/v2/endpoint_operations.py +0 -0
  219. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/tasks/v2/templates/_1_create_venv.sh +0 -0
  220. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/tasks/v2/templates/_2_upgrade_pip.sh +0 -0
  221. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/tasks/v2/templates/_3_pip_install.sh +0 -0
  222. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/tasks/v2/templates/_4_pip_freeze.sh +0 -0
  223. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/tasks/v2/templates/_5_pip_show.sh +0 -0
  224. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/tasks/v2/utils.py +0 -0
  225. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/urls.py +0 -0
  226. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/utils.py +0 -0
  227. {fractal_server-2.7.0a0 → fractal_server-2.7.0a1}/fractal_server/zip_tools.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fractal-server
3
- Version: 2.7.0a0
3
+ Version: 2.7.0a1
4
4
  Summary: Server component of the Fractal analytics platform
5
5
  Home-page: https://github.com/fractal-analytics-platform/fractal-server
6
6
  License: BSD-3-Clause
@@ -0,0 +1 @@
1
+ __VERSION__ = "2.7.0a1"
@@ -1,6 +1,12 @@
1
+ from datetime import datetime
2
+
3
+ from sqlalchemy import Column
4
+ from sqlalchemy.types import DateTime
1
5
  from sqlmodel import Field
2
6
  from sqlmodel import SQLModel
3
7
 
8
+ from fractal_server.utils import get_timestamp
9
+
4
10
 
5
11
  class LinkUserGroup(SQLModel, table=True):
6
12
  """
@@ -9,3 +15,8 @@ class LinkUserGroup(SQLModel, table=True):
9
15
 
10
16
  group_id: int = Field(foreign_key="usergroup.id", primary_key=True)
11
17
  user_id: int = Field(foreign_key="user_oauth.id", primary_key=True)
18
+
19
+ timestamp_created: datetime = Field(
20
+ default_factory=get_timestamp,
21
+ sa_column=Column(DateTime(timezone=True), nullable=False),
22
+ )
@@ -31,12 +31,17 @@ logger = set_logger(__name__)
31
31
  async def get_task_group_list(
32
32
  user: UserOAuth = Depends(current_active_user),
33
33
  db: AsyncSession = Depends(get_async_db),
34
+ only_active: bool = False,
35
+ only_owner: bool = False,
34
36
  ) -> list[TaskGroupReadV2]:
35
37
  """
36
38
  Get all accessible TaskGroups
37
39
  """
38
- stm = select(TaskGroupV2).where(
39
- or_(
40
+
41
+ if only_owner:
42
+ condition = TaskGroupV2.user_id == user.id
43
+ else:
44
+ condition = or_(
40
45
  TaskGroupV2.user_id == user.id,
41
46
  TaskGroupV2.user_group_id.in_(
42
47
  select(LinkUserGroup.group_id).where(
@@ -44,7 +49,10 @@ async def get_task_group_list(
44
49
  )
45
50
  ),
46
51
  )
47
- )
52
+ stm = select(TaskGroupV2).where(condition)
53
+ if only_active:
54
+ stm = stm.where(TaskGroupV2.active)
55
+
48
56
  res = await db.execute(stm)
49
57
  task_groups = res.scalars().all()
50
58
 
@@ -1,6 +1,7 @@
1
1
  from fastapi import HTTPException
2
2
  from fastapi import status
3
3
  from sqlalchemy.ext.asyncio import AsyncSession
4
+ from sqlmodel import asc
4
5
  from sqlmodel import select
5
6
 
6
7
  from fractal_server.app.models.linkusergroup import LinkUserGroup
@@ -9,58 +10,58 @@ from fractal_server.app.models.security import UserOAuth
9
10
  from fractal_server.app.schemas.user import UserRead
10
11
  from fractal_server.app.schemas.user_group import UserGroupRead
11
12
  from fractal_server.app.security import FRACTAL_DEFAULT_GROUP_NAME
13
+ from fractal_server.logger import set_logger
12
14
 
15
+ logger = set_logger(__name__)
13
16
 
14
- async def _get_single_user_with_group_names(
17
+
18
+ async def _get_single_user_with_groups(
15
19
  user: UserOAuth,
16
20
  db: AsyncSession,
17
21
  ) -> UserRead:
18
22
  """
19
- Enrich a user object by filling its `group_names` attribute.
23
+ Enrich a user object by filling its `group_ids_names` attribute.
20
24
 
21
25
  Arguments:
22
26
  user: The current `UserOAuth` object
23
27
  db: Async db session
24
28
 
25
29
  Returns:
26
- A `UserRead` object with `group_names` set
30
+ A `UserRead` object with `group_ids_names` dict
27
31
  """
28
32
  stm_groups = (
29
33
  select(UserGroup)
30
34
  .join(LinkUserGroup)
31
- .where(LinkUserGroup.user_id == UserOAuth.id)
35
+ .where(LinkUserGroup.user_id == user.id)
36
+ .order_by(asc(LinkUserGroup.timestamp_created))
32
37
  )
33
38
  res = await db.execute(stm_groups)
34
39
  groups = res.scalars().unique().all()
35
- group_names = [group.name for group in groups]
36
- return UserRead(
37
- **user.model_dump(),
38
- group_names=group_names,
39
- oauth_accounts=user.oauth_accounts,
40
+ group_ids_names = [(group.id, group.name) for group in groups]
41
+
42
+ # Check that Fractal Default Group is the first of the list. If not, fix.
43
+ index = next(
44
+ (
45
+ i
46
+ for i, group_tuple in enumerate(group_ids_names)
47
+ if group_tuple[1] == FRACTAL_DEFAULT_GROUP_NAME
48
+ ),
49
+ None,
40
50
  )
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:
57
+ default_group = group_ids_names.pop(index)
58
+ group_ids_names.insert(0, default_group)
59
+ else:
60
+ pass
41
61
 
42
-
43
- async def _get_single_user_with_group_ids(
44
- user: UserOAuth,
45
- db: AsyncSession,
46
- ) -> UserRead:
47
- """
48
- Enrich a user object by filling its `group_ids` attribute.
49
-
50
- Arguments:
51
- user: The current `UserOAuth` object
52
- db: Async db session
53
-
54
- Returns:
55
- A `UserRead` object with `group_ids` set
56
- """
57
- stm_links = select(LinkUserGroup).where(LinkUserGroup.user_id == user.id)
58
- res = await db.execute(stm_links)
59
- links = res.scalars().unique().all()
60
- group_ids = [link.group_id for link in links]
61
62
  return UserRead(
62
63
  **user.model_dump(),
63
- group_ids=group_ids,
64
+ group_ids_names=group_ids_names,
64
65
  oauth_accounts=user.oauth_accounts,
65
66
  )
66
67
 
@@ -13,7 +13,7 @@ from ...schemas.user import UserRead
13
13
  from ...schemas.user import UserUpdate
14
14
  from ...schemas.user import UserUpdateStrict
15
15
  from ..aux.validate_user_settings import verify_user_has_settings
16
- from ._aux_auth import _get_single_user_with_group_names
16
+ from ._aux_auth import _get_single_user_with_groups
17
17
  from fractal_server.app.models import LinkUserGroup
18
18
  from fractal_server.app.models import UserGroup
19
19
  from fractal_server.app.models import UserOAuth
@@ -28,15 +28,15 @@ router_current_user = APIRouter()
28
28
 
29
29
  @router_current_user.get("/current-user/", response_model=UserRead)
30
30
  async def get_current_user(
31
- group_names: bool = False,
31
+ group_ids_names: bool = False,
32
32
  user: UserOAuth = Depends(current_active_user),
33
33
  db: AsyncSession = Depends(get_async_db),
34
34
  ):
35
35
  """
36
36
  Return current user
37
37
  """
38
- if group_names is True:
39
- user_with_groups = await _get_single_user_with_group_names(user, db)
38
+ if group_ids_names is True:
39
+ user_with_groups = await _get_single_user_with_groups(user, db)
40
40
  return user_with_groups
41
41
  else:
42
42
  return user
@@ -65,7 +65,7 @@ async def patch_current_user(
65
65
  patched_user = await db.get(
66
66
  UserOAuth, validated_user.id, populate_existing=True
67
67
  )
68
- patched_user_with_groups = await _get_single_user_with_group_names(
68
+ patched_user_with_groups = await _get_single_user_with_groups(
69
69
  patched_user, db
70
70
  )
71
71
  return patched_user_with_groups
@@ -2,7 +2,6 @@ from fastapi import APIRouter
2
2
 
3
3
  from .current_user import router_current_user
4
4
  from .group import router_group
5
- from .group_names import router_group_names
6
5
  from .login import router_login
7
6
  from .oauth import router_oauth
8
7
  from .register import router_register
@@ -13,7 +12,6 @@ router_auth = APIRouter()
13
12
  router_auth.include_router(router_register)
14
13
  router_auth.include_router(router_current_user)
15
14
  router_auth.include_router(router_login)
16
- router_auth.include_router(router_group_names)
17
15
  router_auth.include_router(router_users)
18
16
  router_auth.include_router(router_group)
19
17
  router_auth.include_router(router_oauth)
@@ -20,7 +20,7 @@ from ...schemas.user import UserRead
20
20
  from ...schemas.user import UserUpdate
21
21
  from ...schemas.user import UserUpdateWithNewGroupIds
22
22
  from ..aux.validate_user_settings import verify_user_has_settings
23
- from ._aux_auth import _get_single_user_with_group_ids
23
+ from ._aux_auth import _get_single_user_with_groups
24
24
  from fractal_server.app.models import LinkUserGroup
25
25
  from fractal_server.app.models import UserGroup
26
26
  from fractal_server.app.models import UserOAuth
@@ -41,13 +41,14 @@ logger = set_logger(__name__)
41
41
  @router_users.get("/users/{user_id}/", response_model=UserRead)
42
42
  async def get_user(
43
43
  user_id: int,
44
- group_ids: bool = True,
44
+ group_ids_names: bool = True,
45
45
  superuser: UserOAuth = Depends(current_active_superuser),
46
46
  db: AsyncSession = Depends(get_async_db),
47
47
  ) -> UserRead:
48
48
  user = await _user_or_404(user_id, db)
49
- if group_ids:
50
- user = await _get_single_user_with_group_ids(user, db)
49
+ if group_ids_names:
50
+ user_with_groups = await _get_single_user_with_groups(user, db)
51
+ return user_with_groups
51
52
  return user
52
53
 
53
54
 
@@ -163,12 +164,12 @@ async def patch_user(
163
164
  # Nothing to do, just continue
164
165
  patched_user = user_to_patch
165
166
 
166
- # Enrich user object with `group_ids` attribute
167
- patched_user_with_group_ids = await _get_single_user_with_group_ids(
167
+ # Enrich user object with `group_ids_names` attribute
168
+ patched_user_with_groups = await _get_single_user_with_groups(
168
169
  patched_user, db
169
170
  )
170
171
 
171
- return patched_user_with_group_ids
172
+ return patched_user_with_groups
172
173
 
173
174
 
174
175
  @router_users.get("/users/", response_model=list[UserRead])
@@ -41,8 +41,7 @@ class UserRead(schemas.BaseUser[int]):
41
41
  """
42
42
 
43
43
  username: Optional[str]
44
- group_names: Optional[list[str]] = None
45
- group_ids: Optional[list[int]] = None
44
+ group_ids_names: Optional[list[tuple[int, str]]] = None
46
45
  oauth_accounts: list[OAuthAccountRead]
47
46
 
48
47
 
@@ -0,0 +1,42 @@
1
+ """LinkUserGroup.timestamp_created
2
+
3
+ Revision ID: df7cc3501bf7
4
+ Revises: 7cf1baae8fb4
5
+ Create Date: 2024-10-03 13:55:53.272269
6
+
7
+ """
8
+ from datetime import datetime
9
+ from datetime import timezone
10
+
11
+ import sqlalchemy as sa
12
+ from alembic import op
13
+
14
+
15
+ # revision identifiers, used by Alembic.
16
+ revision = "df7cc3501bf7"
17
+ down_revision = "7cf1baae8fb4"
18
+ branch_labels = None
19
+ depends_on = None
20
+
21
+
22
+ def upgrade() -> None:
23
+ with op.batch_alter_table("linkusergroup", schema=None) as batch_op:
24
+ batch_op.add_column(
25
+ sa.Column(
26
+ "timestamp_created",
27
+ sa.DateTime(timezone=True),
28
+ nullable=False,
29
+ server_default=str(datetime(2000, 1, 1, tzinfo=timezone.utc)),
30
+ )
31
+ )
32
+
33
+ with op.batch_alter_table("project", schema=None) as batch_op:
34
+ batch_op.alter_column("timestamp_created", server_default=None)
35
+
36
+
37
+ def downgrade() -> None:
38
+ # ### commands auto generated by Alembic - please adjust! ###
39
+ with op.batch_alter_table("linkusergroup", schema=None) as batch_op:
40
+ batch_op.drop_column("timestamp_created")
41
+
42
+ # ### end Alembic commands ###
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "fractal-server"
3
- version = "2.7.0a0"
3
+ version = "2.7.0a1"
4
4
  description = "Server component of the Fractal analytics platform"
5
5
  authors = [
6
6
  "Tommaso Comparin <tommaso.comparin@exact-lab.it>",
@@ -92,7 +92,7 @@ filterwarnings = [
92
92
  ]
93
93
 
94
94
  [tool.bumpver]
95
- current_version = "2.7.0a0"
95
+ current_version = "2.7.0a1"
96
96
  version_pattern = "MAJOR.MINOR.PATCH[PYTAGNUM]"
97
97
  commit_message = "bump version {old_version} -> {new_version}"
98
98
  commit = true
@@ -1 +0,0 @@
1
- __VERSION__ = "2.7.0a0"
@@ -1,34 +0,0 @@
1
- """
2
- Definition `/auth/group-names/` endpoints
3
- """
4
- from fastapi import APIRouter
5
- from fastapi import Depends
6
- from fastapi import status
7
- from sqlalchemy.ext.asyncio import AsyncSession
8
- from sqlmodel import select
9
-
10
- from . import current_active_user
11
- from ...db import get_async_db
12
- from fractal_server.app.models import UserGroup
13
- from fractal_server.app.models import UserOAuth
14
-
15
- router_group_names = APIRouter()
16
-
17
-
18
- @router_group_names.get(
19
- "/group-names/", response_model=list[str], status_code=status.HTTP_200_OK
20
- )
21
- async def get_list_user_group_names(
22
- user: UserOAuth = Depends(current_active_user),
23
- db: AsyncSession = Depends(get_async_db),
24
- ) -> list[str]:
25
- """
26
- Return the available group names.
27
-
28
- This endpoint is not restricted to superusers.
29
- """
30
- stm_all_groups = select(UserGroup)
31
- res = await db.execute(stm_all_groups)
32
- groups = res.scalars().all()
33
- group_names = [group.name for group in groups]
34
- return group_names