fractal-server 2.14.0a20__tar.gz → 2.14.0a22__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 (214) hide show
  1. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/PKG-INFO +1 -1
  2. fractal_server-2.14.0a22/fractal_server/__init__.py +1 -0
  3. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/api/v2/history.py +57 -3
  4. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/compress_folder.py +30 -12
  5. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/executors/slurm_common/base_slurm_runner.py +45 -23
  6. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/v2/db_tools.py +19 -0
  7. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/v2/runner.py +14 -0
  8. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/pyproject.toml +2 -2
  9. fractal_server-2.14.0a20/fractal_server/__init__.py +0 -1
  10. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/LICENSE +0 -0
  11. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/README.md +0 -0
  12. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/__main__.py +0 -0
  13. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/alembic.ini +0 -0
  14. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/__init__.py +0 -0
  15. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/db/__init__.py +0 -0
  16. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/history/__init__.py +0 -0
  17. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/models/__init__.py +0 -0
  18. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/models/linkusergroup.py +0 -0
  19. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/models/linkuserproject.py +0 -0
  20. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/models/security.py +0 -0
  21. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/models/user_settings.py +0 -0
  22. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/models/v2/__init__.py +0 -0
  23. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/models/v2/accounting.py +0 -0
  24. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/models/v2/dataset.py +0 -0
  25. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/models/v2/history.py +0 -0
  26. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/models/v2/job.py +0 -0
  27. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/models/v2/project.py +0 -0
  28. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/models/v2/task.py +0 -0
  29. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/models/v2/task_group.py +0 -0
  30. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/models/v2/workflow.py +0 -0
  31. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/models/v2/workflowtask.py +0 -0
  32. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/__init__.py +0 -0
  33. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/admin/__init__.py +0 -0
  34. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/admin/v2/__init__.py +0 -0
  35. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/admin/v2/accounting.py +0 -0
  36. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/admin/v2/impersonate.py +0 -0
  37. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/admin/v2/job.py +0 -0
  38. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/admin/v2/project.py +0 -0
  39. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/admin/v2/task.py +0 -0
  40. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/admin/v2/task_group.py +0 -0
  41. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/admin/v2/task_group_lifecycle.py +0 -0
  42. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/api/__init__.py +0 -0
  43. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/api/v2/__init__.py +0 -0
  44. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/api/v2/_aux_functions.py +0 -0
  45. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/api/v2/_aux_functions_history.py +0 -0
  46. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/api/v2/_aux_functions_task_lifecycle.py +0 -0
  47. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/api/v2/_aux_functions_tasks.py +0 -0
  48. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/api/v2/dataset.py +0 -0
  49. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/api/v2/images.py +0 -0
  50. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/api/v2/job.py +0 -0
  51. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/api/v2/project.py +0 -0
  52. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/api/v2/status_legacy.py +0 -0
  53. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/api/v2/submit.py +0 -0
  54. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/api/v2/task.py +0 -0
  55. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/api/v2/task_collection.py +0 -0
  56. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/api/v2/task_collection_custom.py +0 -0
  57. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/api/v2/task_group.py +0 -0
  58. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/api/v2/task_group_lifecycle.py +0 -0
  59. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/api/v2/verify_image_types.py +0 -0
  60. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/api/v2/workflow.py +0 -0
  61. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/api/v2/workflow_import.py +0 -0
  62. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/api/v2/workflowtask.py +0 -0
  63. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/auth/__init__.py +0 -0
  64. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/auth/_aux_auth.py +0 -0
  65. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/auth/current_user.py +0 -0
  66. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/auth/group.py +0 -0
  67. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/auth/login.py +0 -0
  68. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/auth/oauth.py +0 -0
  69. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/auth/register.py +0 -0
  70. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/auth/router.py +0 -0
  71. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/auth/users.py +0 -0
  72. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/aux/__init__.py +0 -0
  73. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/aux/_job.py +0 -0
  74. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/aux/_runner.py +0 -0
  75. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/aux/validate_user_settings.py +0 -0
  76. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/routes/pagination.py +0 -0
  77. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/__init__.py +0 -0
  78. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/components.py +0 -0
  79. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/exceptions.py +0 -0
  80. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/executors/__init__.py +0 -0
  81. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/executors/base_runner.py +0 -0
  82. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/executors/local/__init__.py +0 -0
  83. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/executors/local/get_local_config.py +0 -0
  84. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/executors/local/runner.py +0 -0
  85. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/executors/slurm_common/__init__.py +0 -0
  86. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/executors/slurm_common/_batching.py +0 -0
  87. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/executors/slurm_common/_job_states.py +0 -0
  88. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/executors/slurm_common/_slurm_config.py +0 -0
  89. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/executors/slurm_common/get_slurm_config.py +0 -0
  90. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/executors/slurm_common/remote.py +0 -0
  91. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/executors/slurm_common/slurm_job_task_models.py +0 -0
  92. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/executors/slurm_common/utils_executors.py +0 -0
  93. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/executors/slurm_ssh/__init__.py +0 -0
  94. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/executors/slurm_ssh/runner.py +0 -0
  95. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/executors/slurm_sudo/__init__.py +0 -0
  96. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/executors/slurm_sudo/_subprocess_run_as_user.py +0 -0
  97. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/executors/slurm_sudo/runner.py +0 -0
  98. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/extract_archive.py +0 -0
  99. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/filenames.py +0 -0
  100. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/run_subprocess.py +0 -0
  101. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/set_start_and_last_task_index.py +0 -0
  102. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/shutdown.py +0 -0
  103. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/task_files.py +0 -0
  104. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/v2/__init__.py +0 -0
  105. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/v2/_local.py +0 -0
  106. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/v2/_slurm_ssh.py +0 -0
  107. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/v2/_slurm_sudo.py +0 -0
  108. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/v2/deduplicate_list.py +0 -0
  109. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/v2/merge_outputs.py +0 -0
  110. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/v2/runner_functions.py +0 -0
  111. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/v2/runner_functions_low_level.py +0 -0
  112. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/v2/submit_workflow.py +0 -0
  113. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/v2/task_interface.py +0 -0
  114. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/runner/versions.py +0 -0
  115. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/schemas/__init__.py +0 -0
  116. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/schemas/_filter_validators.py +0 -0
  117. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/schemas/_validators.py +0 -0
  118. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/schemas/user.py +0 -0
  119. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/schemas/user_group.py +0 -0
  120. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/schemas/user_settings.py +0 -0
  121. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/schemas/v2/__init__.py +0 -0
  122. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/schemas/v2/accounting.py +0 -0
  123. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/schemas/v2/dataset.py +0 -0
  124. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/schemas/v2/dumps.py +0 -0
  125. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/schemas/v2/history.py +0 -0
  126. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/schemas/v2/job.py +0 -0
  127. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/schemas/v2/manifest.py +0 -0
  128. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/schemas/v2/project.py +0 -0
  129. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/schemas/v2/status_legacy.py +0 -0
  130. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/schemas/v2/task.py +0 -0
  131. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/schemas/v2/task_collection.py +0 -0
  132. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/schemas/v2/task_group.py +0 -0
  133. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/schemas/v2/workflow.py +0 -0
  134. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/schemas/v2/workflowtask.py +0 -0
  135. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/security/__init__.py +0 -0
  136. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/security/signup_email.py +0 -0
  137. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/app/user_settings.py +0 -0
  138. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/config.py +0 -0
  139. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/data_migrations/README.md +0 -0
  140. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/data_migrations/tools.py +0 -0
  141. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/gunicorn_fractal.py +0 -0
  142. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/images/__init__.py +0 -0
  143. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/images/models.py +0 -0
  144. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/images/tools.py +0 -0
  145. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/logger.py +0 -0
  146. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/main.py +0 -0
  147. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/env.py +0 -0
  148. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/naming_convention.py +0 -0
  149. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/versions/034a469ec2eb_task_groups.py +0 -0
  150. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/versions/091b01f51f88_add_usergroup_and_linkusergroup_table.py +0 -0
  151. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/versions/19eca0dd47a9_user_settings_project_dir.py +0 -0
  152. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/versions/1eac13a26c83_drop_v1_tables.py +0 -0
  153. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/versions/316140ff7ee1_remove_usersettings_cache_dir.py +0 -0
  154. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/versions/47351f8c7ebc_drop_dataset_filters.py +0 -0
  155. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/versions/4c308bcaea2b_add_task_args_schema_and_task_args_.py +0 -0
  156. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/versions/4cedeb448a53_workflowtask_foreign_keys_not_nullables.py +0 -0
  157. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/versions/501961cfcd85_remove_link_between_v1_and_v2_tasks_.py +0 -0
  158. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/versions/50a13d6138fd_initial_schema.py +0 -0
  159. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/versions/5bf02391cfef_v2.py +0 -0
  160. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/versions/70e77f1c38b0_add_applyworkflow_first_task_index_and_.py +0 -0
  161. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/versions/71eefd1dd202_add_slurm_accounts.py +0 -0
  162. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/versions/84bf0fffde30_add_dumps_to_applyworkflow.py +0 -0
  163. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/versions/8e8f227a3e36_update_taskv2_post_2_7_0.py +0 -0
  164. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/versions/8f79bd162e35_add_docs_info_and_docs_link_to_task_.py +0 -0
  165. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/versions/94a47ea2d3ff_remove_cache_dir_slurm_user_and_slurm_.py +0 -0
  166. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/versions/97f444d47249_add_applyworkflow_project_dump.py +0 -0
  167. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/versions/99ea79d9e5d2_add_dataset_history.py +0 -0
  168. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/versions/9c5ae74c9b98_add_user_settings_table.py +0 -0
  169. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/versions/9db60297b8b2_set_ondelete.py +0 -0
  170. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/versions/9fd26a2b0de4_add_workflow_timestamp_created.py +0 -0
  171. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/versions/a7f4d6137b53_add_workflow_dump_to_applyworkflow.py +0 -0
  172. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/versions/af1ef1c83c9b_add_accounting_tables.py +0 -0
  173. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/versions/af8673379a5c_drop_old_filter_columns.py +0 -0
  174. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/versions/d256a7379ab8_taskgroup_activity_and_venv_info_to_.py +0 -0
  175. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/versions/d4fe3708d309_make_applyworkflow_workflow_dump_non_.py +0 -0
  176. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/versions/da2cb2ac4255_user_group_viewer_paths.py +0 -0
  177. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/versions/db09233ad13a_split_filters_and_keep_old_columns.py +0 -0
  178. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/versions/e75cac726012_make_applyworkflow_start_timestamp_not_.py +0 -0
  179. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/versions/e81103413827_add_job_type_filters.py +0 -0
  180. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/versions/efa89c30e0a4_add_project_timestamp_created.py +0 -0
  181. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/versions/f384e1c0cf5d_drop_task_default_args_columns.py +0 -0
  182. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/migrations/versions/fbce16ff4e47_new_history_items.py +0 -0
  183. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/py.typed +0 -0
  184. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/ssh/__init__.py +0 -0
  185. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/ssh/_fabric.py +0 -0
  186. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/string_tools.py +0 -0
  187. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/syringe.py +0 -0
  188. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/tasks/__init__.py +0 -0
  189. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/tasks/utils.py +0 -0
  190. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/tasks/v2/__init__.py +0 -0
  191. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/tasks/v2/local/__init__.py +0 -0
  192. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/tasks/v2/local/_utils.py +0 -0
  193. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/tasks/v2/local/collect.py +0 -0
  194. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/tasks/v2/local/deactivate.py +0 -0
  195. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/tasks/v2/local/reactivate.py +0 -0
  196. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/tasks/v2/ssh/__init__.py +0 -0
  197. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/tasks/v2/ssh/_utils.py +0 -0
  198. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/tasks/v2/ssh/collect.py +0 -0
  199. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/tasks/v2/ssh/deactivate.py +0 -0
  200. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/tasks/v2/ssh/reactivate.py +0 -0
  201. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/tasks/v2/templates/1_create_venv.sh +0 -0
  202. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/tasks/v2/templates/2_pip_install.sh +0 -0
  203. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/tasks/v2/templates/3_pip_freeze.sh +0 -0
  204. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/tasks/v2/templates/4_pip_show.sh +0 -0
  205. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/tasks/v2/templates/5_get_venv_size_and_file_number.sh +0 -0
  206. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/tasks/v2/templates/6_pip_install_from_freeze.sh +0 -0
  207. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/tasks/v2/utils_background.py +0 -0
  208. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/tasks/v2/utils_database.py +0 -0
  209. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/tasks/v2/utils_package_names.py +0 -0
  210. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/tasks/v2/utils_python_interpreter.py +0 -0
  211. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/tasks/v2/utils_templates.py +0 -0
  212. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/urls.py +0 -0
  213. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/utils.py +0 -0
  214. {fractal_server-2.14.0a20 → fractal_server-2.14.0a22}/fractal_server/zip_tools.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: fractal-server
3
- Version: 2.14.0a20
3
+ Version: 2.14.0a22
4
4
  Summary: Backend component of the Fractal analytics platform
5
5
  License: BSD-3-Clause
6
6
  Author: Tommaso Comparin
@@ -0,0 +1 @@
1
+ __VERSION__ = "2.14.0a22"
@@ -1,3 +1,4 @@
1
+ from copy import deepcopy
1
2
  from typing import Any
2
3
  from typing import Optional
3
4
 
@@ -41,6 +42,24 @@ from fractal_server.images.tools import merge_type_filters
41
42
  from fractal_server.logger import set_logger
42
43
 
43
44
 
45
+ def check_historyrun_related_to_dataset_and_wftask(
46
+ history_run: HistoryRun,
47
+ dataset_id: int,
48
+ workflowtask_id: int,
49
+ ):
50
+ if (
51
+ history_run.dataset_id != dataset_id
52
+ or history_run.workflowtask_id != workflowtask_id
53
+ ):
54
+ raise HTTPException(
55
+ status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
56
+ detail=(
57
+ f"Invalid query parameters: HistoryRun[{history_run.id}] is "
58
+ f"not related to {dataset_id=} and {workflowtask_id=}."
59
+ ),
60
+ )
61
+
62
+
44
63
  class ImageWithStatusPage(PaginationResponse[SingleImageWithStatus]):
45
64
 
46
65
  attributes: dict[str, list[Any]]
@@ -74,7 +93,7 @@ async def get_workflow_tasks_statuses(
74
93
  db=db,
75
94
  )
76
95
 
77
- response = {}
96
+ response: dict[int, dict[str, int | str] | None] = {}
78
97
  for wftask in workflow.task_list:
79
98
  res = await db.execute(
80
99
  select(HistoryRun)
@@ -112,7 +131,18 @@ async def get_workflow_tasks_statuses(
112
131
  f"num_{target_status.value}_images"
113
132
  ] = num_images
114
133
 
115
- return JSONResponse(content=response, status_code=200)
134
+ new_response = deepcopy(response)
135
+ for key, value in response.items():
136
+ if value is not None:
137
+ num_total_images = sum(
138
+ value[f"num_{target_status.value}_images"]
139
+ for target_status in HistoryUnitStatus
140
+ )
141
+ if num_total_images > value["num_available_images"]:
142
+ value["num_available_images"] = None
143
+ new_response[key] = value
144
+
145
+ return JSONResponse(content=new_response, status_code=200)
116
146
 
117
147
 
118
148
  @router.get("/project/{project_id}/status/run/")
@@ -199,7 +229,14 @@ async def get_history_run_units(
199
229
  )
200
230
 
201
231
  # Check that `HistoryRun` exists
202
- await get_history_run_or_404(history_run_id=history_run_id, db=db)
232
+ history_run = await get_history_run_or_404(
233
+ history_run_id=history_run_id, db=db
234
+ )
235
+ check_historyrun_related_to_dataset_and_wftask(
236
+ history_run=history_run,
237
+ dataset_id=dataset_id,
238
+ workflowtask_id=workflowtask_id,
239
+ )
203
240
 
204
241
  # Count `HistoryUnit`s
205
242
  stmt = select(func.count(HistoryUnit.id)).where(
@@ -450,6 +487,23 @@ async def get_history_unit_log(
450
487
  db=db,
451
488
  )
452
489
 
490
+ if history_unit.history_run_id != history_run_id:
491
+ raise HTTPException(
492
+ status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
493
+ detail=(
494
+ f"Invalid query parameters: HistoryUnit[{history_unit_id}] "
495
+ f"is not related to HistoryRun[{history_run_id}]"
496
+ ),
497
+ )
498
+ history_run = await get_history_run_or_404(
499
+ history_run_id=history_run_id, db=db
500
+ )
501
+ check_historyrun_related_to_dataset_and_wftask(
502
+ history_run=history_run,
503
+ dataset_id=dataset_id,
504
+ workflowtask_id=workflowtask_id,
505
+ )
506
+
453
507
  # Get log or placeholder text
454
508
  log = read_log_file(
455
509
  logfile=history_unit.logfile,
@@ -11,8 +11,8 @@ built-in `tarfile` library has to do with performance issues we observed
11
11
  when handling files which were just created within a SLURM job, and in the
12
12
  context of a CephFS filesystem.
13
13
  """
14
- import shutil
15
14
  import sys
15
+ import time
16
16
  from pathlib import Path
17
17
 
18
18
  from fractal_server.app.runner.run_subprocess import run_subprocess
@@ -20,21 +20,26 @@ from fractal_server.logger import get_logger
20
20
  from fractal_server.logger import set_logger
21
21
 
22
22
 
23
- def copy_subfolder(src: Path, dest: Path, logger_name: str):
23
+ def _copy_subfolder(src: Path, dest: Path, logger_name: str):
24
+ t_start = time.perf_counter()
24
25
  cmd_cp = f"cp -r {src.as_posix()} {dest.as_posix()}"
25
26
  logger = get_logger(logger_name=logger_name)
26
27
  logger.debug(f"{cmd_cp=}")
27
28
  res = run_subprocess(cmd=cmd_cp, logger_name=logger_name)
29
+ elapsed = time.perf_counter() - t_start
30
+ logger.debug(f"[_copy_subfolder] END {elapsed=} s ({dest.as_posix()})")
28
31
  return res
29
32
 
30
33
 
31
- def create_tar_archive(
32
- tarfile_path: Path,
34
+ def _create_tar_archive(
35
+ tarfile_path: str,
33
36
  subfolder_path_tmp_copy: Path,
34
37
  logger_name: str,
35
38
  remote_to_local: bool,
36
39
  ):
37
40
  logger = get_logger(logger_name)
41
+ logger.debug(f"[_create_tar_archive] START ({tarfile_path})")
42
+ t_start = time.perf_counter()
38
43
 
39
44
  if remote_to_local:
40
45
  exclude_options = "--exclude *sbatch --exclude *_in_*.pickle "
@@ -49,15 +54,24 @@ def create_tar_archive(
49
54
  )
50
55
  logger.debug(f"cmd tar:\n{cmd_tar}")
51
56
  run_subprocess(cmd=cmd_tar, logger_name=logger_name, allow_char="*")
57
+ elapsed = time.perf_counter() - t_start
58
+ logger.debug(f"[_create_tar_archive] END {elapsed=} s ({tarfile_path})")
52
59
 
53
60
 
54
- def remove_temp_subfolder(subfolder_path_tmp_copy: Path, logger_name: str):
61
+ def _remove_temp_subfolder(subfolder_path_tmp_copy: Path, logger_name: str):
55
62
  logger = get_logger(logger_name)
63
+ t_start = time.perf_counter()
56
64
  try:
57
- logger.debug(f"Now remove {subfolder_path_tmp_copy}")
58
- shutil.rmtree(subfolder_path_tmp_copy)
65
+ cmd_rm = f"rm -rf {subfolder_path_tmp_copy}"
66
+ logger.debug(f"cmd rm:\n{cmd_rm}")
67
+ run_subprocess(cmd=cmd_rm, logger_name=logger_name, allow_char="*")
59
68
  except Exception as e:
60
- logger.debug(f"ERROR during shutil.rmtree: {e}")
69
+ logger.debug(f"ERROR during {cmd_rm}: {e}")
70
+ elapsed = time.perf_counter() - t_start
71
+ logger.debug(
72
+ f"[_remove_temp_subfolder] END {elapsed=} s "
73
+ f"({subfolder_path_tmp_copy=})"
74
+ )
61
75
 
62
76
 
63
77
  def compress_folder(
@@ -91,10 +105,12 @@ def compress_folder(
91
105
  subfolder_path.parent / f"{subfolder_path.name}_copy"
92
106
  )
93
107
  try:
94
- copy_subfolder(
95
- subfolder_path, subfolder_path_tmp_copy, logger_name=logger_name
108
+ _copy_subfolder(
109
+ subfolder_path,
110
+ subfolder_path_tmp_copy,
111
+ logger_name=logger_name,
96
112
  )
97
- create_tar_archive(
113
+ _create_tar_archive(
98
114
  tarfile_path,
99
115
  subfolder_path_tmp_copy,
100
116
  logger_name=logger_name,
@@ -107,7 +123,9 @@ def compress_folder(
107
123
  sys.exit(1)
108
124
 
109
125
  finally:
110
- remove_temp_subfolder(subfolder_path_tmp_copy, logger_name=logger_name)
126
+ _remove_temp_subfolder(
127
+ subfolder_path_tmp_copy, logger_name=logger_name
128
+ )
111
129
 
112
130
 
113
131
  def main(sys_argv: list[str]):
@@ -23,6 +23,9 @@ from fractal_server.app.runner.filenames import SHUTDOWN_FILENAME
23
23
  from fractal_server.app.runner.task_files import MULTISUBMIT_PREFIX
24
24
  from fractal_server.app.runner.task_files import SUBMIT_PREFIX
25
25
  from fractal_server.app.runner.task_files import TaskFiles
26
+ from fractal_server.app.runner.v2.db_tools import (
27
+ bulk_update_status_of_history_unit,
28
+ )
26
29
  from fractal_server.app.runner.v2.db_tools import (
27
30
  update_logfile_of_history_unit,
28
31
  )
@@ -47,6 +50,7 @@ class BaseSlurmRunner(BaseRunner):
47
50
  root_dir_local: Path
48
51
  root_dir_remote: Path
49
52
  poll_interval: int
53
+ poll_interval_internal: float
50
54
  jobs: dict[str, SlurmJob]
51
55
  python_worker_interpreter: str
52
56
  slurm_runner_type: Literal["ssh", "sudo"]
@@ -72,6 +76,8 @@ class BaseSlurmRunner(BaseRunner):
72
76
  self.poll_interval = (
73
77
  poll_interval or settings.FRACTAL_SLURM_POLL_INTERVAL
74
78
  )
79
+ self.poll_interval_internal = self.poll_interval / 10.0
80
+
75
81
  self.check_fractal_server_versions()
76
82
 
77
83
  # Create job folders. Note that the local one may or may not exist
@@ -405,6 +411,33 @@ class BaseSlurmRunner(BaseRunner):
405
411
  def job_ids(self) -> list[str]:
406
412
  return list(self.jobs.keys())
407
413
 
414
+ def wait_and_check_shutdown(self) -> list[str]:
415
+ """
416
+ Wait at most `self.poll_interval`, while also checking for shutdown.
417
+ """
418
+ # Sleep for `self.poll_interval`, but keep checking for shutdowns
419
+ start_time = time.perf_counter()
420
+ max_time = start_time + self.poll_interval
421
+ can_return = False
422
+ logger.debug(
423
+ "[wait_and_check_shutdown] "
424
+ f"I will wait at most {self.poll_interval} s, "
425
+ f"in blocks of {self.poll_interval_internal} s."
426
+ )
427
+
428
+ while (time.perf_counter() < max_time) or (can_return is False):
429
+ # Handle shutdown
430
+ if self.is_shutdown():
431
+ logger.info("[wait_and_check_shutdown] Shutdown file detected")
432
+ scancelled_job_ids = self.scancel_jobs()
433
+ logger.info(f"[wait_and_check_shutdown] {scancelled_job_ids=}")
434
+ return scancelled_job_ids
435
+ can_return = True
436
+ time.sleep(self.poll_interval_internal)
437
+
438
+ logger.debug("[wait_and_check_shutdown] No shutdown file detected")
439
+ return []
440
+
408
441
  def submit(
409
442
  self,
410
443
  func: callable,
@@ -491,15 +524,9 @@ class BaseSlurmRunner(BaseRunner):
491
524
 
492
525
  # Retrieval phase
493
526
  logger.info("[submit] START retrieval phase")
527
+ scancelled_job_ids = []
494
528
  while len(self.jobs) > 0:
495
529
 
496
- # Handle shutdown
497
- scancelled_job_ids = []
498
- if self.is_shutdown():
499
- logger.info("[submit] Shutdown file detected")
500
- scancelled_job_ids = self.scancel_jobs()
501
- logger.info(f"[submit] {scancelled_job_ids=}")
502
-
503
530
  # Look for finished jobs
504
531
  finished_job_ids = self._get_finished_jobs(job_ids=self.job_ids)
505
532
  logger.debug(f"[submit] {finished_job_ids=}")
@@ -532,7 +559,7 @@ class BaseSlurmRunner(BaseRunner):
532
559
  )
533
560
 
534
561
  if len(self.jobs) > 0:
535
- time.sleep(self.poll_interval)
562
+ scancelled_job_ids = self.wait_and_check_shutdown()
536
563
 
537
564
  logger.info("[submit] END")
538
565
  return result, exception
@@ -555,13 +582,11 @@ class BaseSlurmRunner(BaseRunner):
555
582
  if self.is_shutdown():
556
583
  if task_type == "parallel":
557
584
  with next(get_sync_db()) as db:
558
- # FIXME: Replace with bulk function
559
- for history_unit_id in history_unit_ids:
560
- update_status_of_history_unit(
561
- history_unit_id=history_unit_id,
562
- status=HistoryUnitStatus.FAILED,
563
- db_sync=db,
564
- )
585
+ bulk_update_status_of_history_unit(
586
+ history_unit_ids=history_unit_ids,
587
+ status=HistoryUnitStatus.FAILED,
588
+ db_sync=db,
589
+ )
565
590
  results = {}
566
591
  exceptions = {
567
592
  ind: SHUTDOWN_EXCEPTION for ind in range(len(list_parameters))
@@ -688,17 +713,11 @@ class BaseSlurmRunner(BaseRunner):
688
713
  logger.info("[multisubmit] START retrieval phase")
689
714
  while len(self.jobs) > 0:
690
715
 
691
- # Handle shutdown
692
- scancelled_job_ids = []
693
- if self.is_shutdown():
694
- logger.info("[multisubmit] Shutdown file detected")
695
- scancelled_job_ids = self.scancel_jobs()
696
- logger.info(f"[multisubmit] {scancelled_job_ids=}")
697
-
698
716
  # Look for finished jobs
699
717
  finished_job_ids = self._get_finished_jobs(job_ids=self.job_ids)
700
718
  logger.debug(f"[multisubmit] {finished_job_ids=}")
701
719
 
720
+ scancelled_job_ids = []
702
721
  with next(get_sync_db()) as db:
703
722
  for slurm_job_id in finished_job_ids:
704
723
  logger.info(f"[multisubmit] Now process {slurm_job_id=}")
@@ -738,7 +757,10 @@ class BaseSlurmRunner(BaseRunner):
738
757
  db_sync=db,
739
758
  )
740
759
 
741
- time.sleep(self.poll_interval)
760
+ if len(self.jobs) > 0:
761
+ scancelled_job_ids = self.wait_and_check_shutdown()
762
+
763
+ logger.info("[multisubmit] END")
742
764
  return results, exceptions
743
765
 
744
766
  def check_fractal_server_versions(self) -> None:
@@ -2,6 +2,7 @@ from typing import Any
2
2
 
3
3
  from sqlalchemy.dialects.postgresql import insert as pg_insert
4
4
  from sqlalchemy.orm import Session
5
+ from sqlmodel import update
5
6
 
6
7
  from fractal_server.app.db import get_sync_db
7
8
  from fractal_server.app.models.v2 import HistoryImageCache
@@ -40,6 +41,24 @@ def update_status_of_history_unit(
40
41
  db_sync.commit()
41
42
 
42
43
 
44
+ def bulk_update_status_of_history_unit(
45
+ *,
46
+ history_unit_ids: list[int],
47
+ status: HistoryUnitStatus,
48
+ db_sync: Session,
49
+ ) -> None:
50
+ for ind in range(0, len(history_unit_ids), _CHUNK_SIZE):
51
+ db_sync.execute(
52
+ update(HistoryUnit)
53
+ .where(
54
+ HistoryUnit.id.in_(history_unit_ids[ind : ind + _CHUNK_SIZE])
55
+ )
56
+ .values(status=status)
57
+ )
58
+ # NOTE: keeping commit within the for loop is much more efficient
59
+ db_sync.commit()
60
+
61
+
43
62
  def update_logfile_of_history_unit(
44
63
  *,
45
64
  history_unit_id: int,
@@ -8,6 +8,7 @@ from typing import Literal
8
8
  from typing import Optional
9
9
 
10
10
  from sqlalchemy.orm.attributes import flag_modified
11
+ from sqlmodel import delete
11
12
 
12
13
  from ....images import SingleImage
13
14
  from ....images.tools import filter_image_list
@@ -21,6 +22,7 @@ from .task_interface import TaskOutput
21
22
  from fractal_server.app.db import get_sync_db
22
23
  from fractal_server.app.models.v2 import AccountingRecord
23
24
  from fractal_server.app.models.v2 import DatasetV2
25
+ from fractal_server.app.models.v2 import HistoryImageCache
24
26
  from fractal_server.app.models.v2 import HistoryRun
25
27
  from fractal_server.app.models.v2 import TaskGroupV2
26
28
  from fractal_server.app.models.v2 import WorkflowTaskV2
@@ -331,6 +333,18 @@ def execute_tasks_v2(
331
333
  db_dataset.images = tmp_images
332
334
  flag_modified(db_dataset, "images")
333
335
  db.merge(db_dataset)
336
+
337
+ db.execute(
338
+ delete(HistoryImageCache)
339
+ .where(HistoryImageCache.dataset_id == dataset.id)
340
+ .where(HistoryImageCache.workflowtask_id == wftask.id)
341
+ .where(
342
+ HistoryImageCache.zarr_url.in_(
343
+ current_task_output.image_list_removals
344
+ )
345
+ )
346
+ )
347
+
334
348
  db.commit()
335
349
  db.close() # FIXME: why is this needed?
336
350
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "fractal-server"
3
- version = "2.14.0a20"
3
+ version = "2.14.0a22"
4
4
  description = "Backend component of the Fractal analytics platform"
5
5
  authors = [
6
6
  { name="Tommaso Comparin", email="tommaso.comparin@exact-lab.it" },
@@ -95,7 +95,7 @@ filterwarnings = [
95
95
  markers = ["container", "ssh"]
96
96
 
97
97
  [tool.bumpver]
98
- current_version = "2.14.0a20"
98
+ current_version = "2.14.0a22"
99
99
  version_pattern = "MAJOR.MINOR.PATCH[PYTAGNUM]"
100
100
  commit_message = "bump version {old_version} -> {new_version}"
101
101
  commit = true
@@ -1 +0,0 @@
1
- __VERSION__ = "2.14.0a20"