fractal-server 2.11.0a4__tar.gz → 2.11.0a6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/PKG-INFO +1 -1
- fractal_server-2.11.0a6/fractal_server/__init__.py +1 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/api/v2/_aux_functions_tasks.py +21 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/api/v2/images.py +1 -1
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/api/v2/submit.py +6 -3
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/api/v2/workflow_import.py +8 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/api/v2/workflowtask.py +43 -24
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/executors/slurm/ssh/executor.py +2 -2
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/schemas/_filter_validators.py +4 -8
- fractal_server-2.11.0a6/fractal_server/data_migrations/2_11_0.py +116 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/images/models.py +1 -1
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/images/tools.py +0 -2
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/logger.py +4 -1
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/tasks/v2/local/collect.py +2 -2
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/tasks/v2/local/deactivate.py +2 -2
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/tasks/v2/local/reactivate.py +2 -3
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/tasks/v2/ssh/collect.py +2 -2
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/tasks/v2/ssh/deactivate.py +2 -2
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/tasks/v2/ssh/reactivate.py +2 -2
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/pyproject.toml +2 -2
- fractal_server-2.11.0a4/fractal_server/__init__.py +0 -1
- fractal_server-2.11.0a4/fractal_server/data_migrations/2_11_0.py +0 -69
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/LICENSE +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/README.md +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/__main__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/alembic.ini +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/db/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/models/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/models/linkusergroup.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/models/linkuserproject.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/models/security.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/models/user_settings.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/models/v1/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/models/v1/dataset.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/models/v1/job.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/models/v1/project.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/models/v1/state.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/models/v1/task.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/models/v1/workflow.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/models/v2/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/models/v2/dataset.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/models/v2/job.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/models/v2/project.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/models/v2/task.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/models/v2/task_group.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/models/v2/workflow.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/models/v2/workflowtask.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/admin/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/admin/v1.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/admin/v2/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/admin/v2/job.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/admin/v2/project.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/admin/v2/task.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/admin/v2/task_group.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/admin/v2/task_group_lifecycle.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/api/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/api/v1/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/api/v1/_aux_functions.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/api/v1/dataset.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/api/v1/job.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/api/v1/project.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/api/v1/task.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/api/v1/task_collection.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/api/v1/workflow.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/api/v1/workflowtask.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/api/v2/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/api/v2/_aux_functions.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/api/v2/_aux_functions_task_lifecycle.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/api/v2/dataset.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/api/v2/job.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/api/v2/project.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/api/v2/status.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/api/v2/task.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/api/v2/task_collection.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/api/v2/task_collection_custom.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/api/v2/task_group.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/api/v2/task_group_lifecycle.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/api/v2/workflow.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/auth/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/auth/_aux_auth.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/auth/current_user.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/auth/group.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/auth/login.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/auth/oauth.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/auth/register.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/auth/router.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/auth/users.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/aux/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/aux/_job.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/aux/_runner.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/aux/validate_user_settings.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/async_wrap.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/components.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/compress_folder.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/exceptions.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/executors/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/executors/slurm/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/executors/slurm/_batching.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/executors/slurm/_slurm_config.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/executors/slurm/remote.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/executors/slurm/ssh/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/executors/slurm/ssh/_executor_wait_thread.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/executors/slurm/ssh/_slurm_job.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/executors/slurm/sudo/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/executors/slurm/sudo/_check_jobs_status.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/executors/slurm/sudo/_executor_wait_thread.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/executors/slurm/sudo/_subprocess_run_as_user.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/executors/slurm/sudo/executor.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/executors/slurm/utils_executors.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/extract_archive.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/filenames.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/run_subprocess.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/set_start_and_last_task_index.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/shutdown.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/task_files.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/v1/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/v1/_common.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/v1/_local/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/v1/_local/_local_config.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/v1/_local/_submit_setup.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/v1/_local/executor.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/v1/_slurm/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/v1/_slurm/_submit_setup.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/v1/_slurm/get_slurm_config.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/v1/common.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/v1/handle_failed_job.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/v2/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/v2/_local/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/v2/_local/_local_config.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/v2/_local/_submit_setup.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/v2/_local/executor.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/v2/_local_experimental/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/v2/_local_experimental/_local_config.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/v2/_local_experimental/_submit_setup.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/v2/_local_experimental/executor.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/v2/_slurm_common/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/v2/_slurm_common/get_slurm_config.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/v2/_slurm_ssh/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/v2/_slurm_ssh/_submit_setup.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/v2/_slurm_sudo/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/v2/_slurm_sudo/_submit_setup.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/v2/deduplicate_list.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/v2/handle_failed_job.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/v2/merge_outputs.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/v2/runner.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/v2/runner_functions.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/v2/runner_functions_low_level.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/v2/task_interface.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/runner/versions.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/schemas/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/schemas/_validators.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/schemas/user.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/schemas/user_group.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/schemas/user_settings.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/schemas/v1/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/schemas/v1/applyworkflow.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/schemas/v1/dataset.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/schemas/v1/dumps.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/schemas/v1/manifest.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/schemas/v1/project.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/schemas/v1/state.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/schemas/v1/task.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/schemas/v1/task_collection.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/schemas/v1/workflow.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/schemas/v2/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/schemas/v2/dataset.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/schemas/v2/dumps.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/schemas/v2/job.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/schemas/v2/manifest.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/schemas/v2/project.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/schemas/v2/status.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/schemas/v2/task.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/schemas/v2/task_collection.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/schemas/v2/task_group.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/schemas/v2/workflow.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/schemas/v2/workflowtask.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/security/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/security/signup_email.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/user_settings.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/config.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/data_migrations/README.md +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/data_migrations/tools.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/gunicorn_fractal.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/images/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/main.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/migrations/env.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/migrations/naming_convention.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/migrations/versions/034a469ec2eb_task_groups.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/migrations/versions/091b01f51f88_add_usergroup_and_linkusergroup_table.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/migrations/versions/19eca0dd47a9_user_settings_project_dir.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/migrations/versions/316140ff7ee1_remove_usersettings_cache_dir.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/migrations/versions/4c308bcaea2b_add_task_args_schema_and_task_args_.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/migrations/versions/4cedeb448a53_workflowtask_foreign_keys_not_nullables.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/migrations/versions/501961cfcd85_remove_link_between_v1_and_v2_tasks_.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/migrations/versions/50a13d6138fd_initial_schema.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/migrations/versions/5bf02391cfef_v2.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/migrations/versions/70e77f1c38b0_add_applyworkflow_first_task_index_and_.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/migrations/versions/71eefd1dd202_add_slurm_accounts.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/migrations/versions/84bf0fffde30_add_dumps_to_applyworkflow.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/migrations/versions/8e8f227a3e36_update_taskv2_post_2_7_0.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/migrations/versions/8f79bd162e35_add_docs_info_and_docs_link_to_task_.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/migrations/versions/94a47ea2d3ff_remove_cache_dir_slurm_user_and_slurm_.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/migrations/versions/97f444d47249_add_applyworkflow_project_dump.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/migrations/versions/99ea79d9e5d2_add_dataset_history.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/migrations/versions/9c5ae74c9b98_add_user_settings_table.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/migrations/versions/9fd26a2b0de4_add_workflow_timestamp_created.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/migrations/versions/a7f4d6137b53_add_workflow_dump_to_applyworkflow.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/migrations/versions/d256a7379ab8_taskgroup_activity_and_venv_info_to_.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/migrations/versions/d4fe3708d309_make_applyworkflow_workflow_dump_non_.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/migrations/versions/da2cb2ac4255_user_group_viewer_paths.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/migrations/versions/db09233ad13a_split_filters_and_keep_old_columns.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/migrations/versions/e75cac726012_make_applyworkflow_start_timestamp_not_.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/migrations/versions/efa89c30e0a4_add_project_timestamp_created.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/migrations/versions/f384e1c0cf5d_drop_task_default_args_columns.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/py.typed +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/ssh/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/ssh/_fabric.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/string_tools.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/syringe.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/tasks/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/tasks/utils.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/tasks/v1/_TaskCollectPip.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/tasks/v1/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/tasks/v1/background_operations.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/tasks/v1/endpoint_operations.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/tasks/v1/get_collection_data.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/tasks/v1/utils.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/tasks/v2/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/tasks/v2/local/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/tasks/v2/local/_utils.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/tasks/v2/ssh/__init__.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/tasks/v2/ssh/_utils.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/tasks/v2/templates/1_create_venv.sh +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/tasks/v2/templates/2_pip_install.sh +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/tasks/v2/templates/3_pip_freeze.sh +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/tasks/v2/templates/4_pip_show.sh +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/tasks/v2/templates/5_get_venv_size_and_file_number.sh +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/tasks/v2/templates/6_pip_install_from_freeze.sh +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/tasks/v2/utils_background.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/tasks/v2/utils_database.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/tasks/v2/utils_package_names.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/tasks/v2/utils_python_interpreter.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/tasks/v2/utils_templates.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/urls.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/utils.py +0 -0
- {fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/zip_tools.py +0 -0
@@ -0,0 +1 @@
|
|
1
|
+
__VERSION__ = "2.11.0a6"
|
@@ -22,6 +22,7 @@ from fractal_server.app.routes.auth._aux_auth import (
|
|
22
22
|
_verify_user_belongs_to_group,
|
23
23
|
)
|
24
24
|
from fractal_server.app.schemas.v2 import TaskGroupActivityActionV2
|
25
|
+
from fractal_server.images.tools import merge_type_filters
|
25
26
|
from fractal_server.logger import set_logger
|
26
27
|
|
27
28
|
logger = set_logger(__name__)
|
@@ -351,3 +352,23 @@ async def _add_warnings_to_workflow_tasks(
|
|
351
352
|
wftask_data["warning"] = "Current user has no access to this task."
|
352
353
|
wftask_list_with_warnings.append(wftask_data)
|
353
354
|
return wftask_list_with_warnings
|
355
|
+
|
356
|
+
|
357
|
+
def _check_type_filters_compatibility(
|
358
|
+
*,
|
359
|
+
task_input_types: dict[str, bool],
|
360
|
+
wftask_type_filters: dict[str, bool],
|
361
|
+
) -> None:
|
362
|
+
"""
|
363
|
+
Wrap `merge_type_filters` and raise `HTTPException` if needed.
|
364
|
+
"""
|
365
|
+
try:
|
366
|
+
merge_type_filters(
|
367
|
+
task_input_types=task_input_types,
|
368
|
+
wftask_type_filters=wftask_type_filters,
|
369
|
+
)
|
370
|
+
except ValueError as e:
|
371
|
+
raise HTTPException(
|
372
|
+
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
373
|
+
detail=f"Incompatible type filters.\nOriginal error: {str(e)}",
|
374
|
+
)
|
{fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/api/v2/images.py
RENAMED
@@ -207,7 +207,7 @@ async def query_dataset_images(
|
|
207
207
|
if page > last_page:
|
208
208
|
page = last_page
|
209
209
|
offset = (page - 1) * page_size
|
210
|
-
images = images[offset : offset + page_size]
|
210
|
+
images = images[offset : offset + page_size]
|
211
211
|
|
212
212
|
return ImagePage(
|
213
213
|
total_count=total_count,
|
{fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/api/v2/submit.py
RENAMED
@@ -28,6 +28,7 @@ from ...aux.validate_user_settings import validate_user_settings
|
|
28
28
|
from ._aux_functions import _get_dataset_check_owner
|
29
29
|
from ._aux_functions import _get_workflow_check_owner
|
30
30
|
from ._aux_functions import clean_app_job_list_v2
|
31
|
+
from ._aux_functions_tasks import _check_type_filters_compatibility
|
31
32
|
from fractal_server.app.models import TaskGroupV2
|
32
33
|
from fractal_server.app.models import UserOAuth
|
33
34
|
from fractal_server.app.routes.api.v2._aux_functions_tasks import (
|
@@ -108,15 +109,17 @@ async def apply_workflow(
|
|
108
109
|
|
109
110
|
# Check that tasks have read-access and are `active`
|
110
111
|
used_task_group_ids = set()
|
111
|
-
for wftask in workflow.task_list[
|
112
|
-
first_task_index : last_task_index + 1 # noqa: E203
|
113
|
-
]:
|
112
|
+
for wftask in workflow.task_list[first_task_index : last_task_index + 1]:
|
114
113
|
task = await _get_task_read_access(
|
115
114
|
user_id=user.id,
|
116
115
|
task_id=wftask.task_id,
|
117
116
|
require_active=True,
|
118
117
|
db=db,
|
119
118
|
)
|
119
|
+
_check_type_filters_compatibility(
|
120
|
+
task_input_types=task.input_types,
|
121
|
+
wftask_type_filters=wftask.type_filters,
|
122
|
+
)
|
120
123
|
used_task_group_ids.add(task.taskgroupv2_id)
|
121
124
|
|
122
125
|
# Validate user settings
|
@@ -19,6 +19,7 @@ from ._aux_functions import _check_workflow_exists
|
|
19
19
|
from ._aux_functions import _get_project_check_owner
|
20
20
|
from ._aux_functions import _workflow_insert_task
|
21
21
|
from ._aux_functions_tasks import _add_warnings_to_workflow_tasks
|
22
|
+
from ._aux_functions_tasks import _check_type_filters_compatibility
|
22
23
|
from fractal_server.app.models import LinkUserGroup
|
23
24
|
from fractal_server.app.models import UserOAuth
|
24
25
|
from fractal_server.app.models.v2 import TaskGroupV2
|
@@ -325,6 +326,13 @@ async def import_workflow(
|
|
325
326
|
list_wf_tasks.append(new_wf_task)
|
326
327
|
list_task_ids.append(task_id)
|
327
328
|
|
329
|
+
for wftask, task_id in zip(list_wf_tasks, list_task_ids):
|
330
|
+
task = await db.get(TaskV2, task_id)
|
331
|
+
_check_type_filters_compatibility(
|
332
|
+
task_input_types=task.input_types,
|
333
|
+
wftask_type_filters=wftask.type_filters,
|
334
|
+
)
|
335
|
+
|
328
336
|
# Create new Workflow
|
329
337
|
db_workflow = WorkflowV2(
|
330
338
|
project_id=project_id,
|
{fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/routes/api/v2/workflowtask.py
RENAMED
@@ -12,6 +12,7 @@ from ....db import get_async_db
|
|
12
12
|
from ._aux_functions import _get_workflow_check_owner
|
13
13
|
from ._aux_functions import _get_workflow_task_check_owner
|
14
14
|
from ._aux_functions import _workflow_insert_task
|
15
|
+
from ._aux_functions_tasks import _check_type_filters_compatibility
|
15
16
|
from ._aux_functions_tasks import _get_task_read_access
|
16
17
|
from fractal_server.app.models import UserOAuth
|
17
18
|
from fractal_server.app.models.v2 import WorkflowTaskV2
|
@@ -47,24 +48,29 @@ async def replace_workflowtask(
|
|
47
48
|
db=db,
|
48
49
|
)
|
49
50
|
|
50
|
-
|
51
|
+
new_task = await _get_task_read_access(
|
51
52
|
task_id=task_id, user_id=user.id, db=db, require_active=True
|
52
53
|
)
|
53
54
|
|
54
|
-
if
|
55
|
+
if new_task.type != old_workflow_task.task.type:
|
55
56
|
raise HTTPException(
|
56
57
|
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
57
58
|
detail=(
|
58
59
|
f"Cannot replace a Task '{old_workflow_task.task.type}' with a"
|
59
|
-
f" Task '{
|
60
|
+
f" Task '{new_task.type}'."
|
60
61
|
),
|
61
62
|
)
|
62
63
|
|
64
|
+
_check_type_filters_compatibility(
|
65
|
+
task_input_types=new_task.input_types,
|
66
|
+
wftask_type_filters=old_workflow_task.type_filters,
|
67
|
+
)
|
68
|
+
|
63
69
|
_args_non_parallel = old_workflow_task.args_non_parallel
|
64
70
|
_args_parallel = old_workflow_task.args_parallel
|
65
71
|
if replace is not None:
|
66
72
|
if replace.args_non_parallel is not None:
|
67
|
-
if
|
73
|
+
if new_task.type == "parallel":
|
68
74
|
raise HTTPException(
|
69
75
|
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
70
76
|
detail=(
|
@@ -76,7 +82,7 @@ async def replace_workflowtask(
|
|
76
82
|
_args_non_parallel = replace.args_non_parallel
|
77
83
|
|
78
84
|
if replace.args_parallel is not None:
|
79
|
-
if
|
85
|
+
if new_task.type == "non_parallel":
|
80
86
|
raise HTTPException(
|
81
87
|
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
82
88
|
detail=(
|
@@ -92,22 +98,24 @@ async def replace_workflowtask(
|
|
92
98
|
if (
|
93
99
|
old_workflow_task.meta_non_parallel
|
94
100
|
!= old_workflow_task.task.meta_non_parallel
|
95
|
-
) and (
|
101
|
+
) and (
|
102
|
+
old_workflow_task.task.meta_non_parallel == new_task.meta_non_parallel
|
103
|
+
):
|
96
104
|
_meta_non_parallel = old_workflow_task.meta_non_parallel
|
97
105
|
else:
|
98
|
-
_meta_non_parallel =
|
106
|
+
_meta_non_parallel = new_task.meta_non_parallel
|
99
107
|
# Same for `meta_parallel`
|
100
108
|
if (
|
101
109
|
old_workflow_task.meta_parallel != old_workflow_task.task.meta_parallel
|
102
|
-
) and (old_workflow_task.task.meta_parallel ==
|
110
|
+
) and (old_workflow_task.task.meta_parallel == new_task.meta_parallel):
|
103
111
|
_meta_parallel = old_workflow_task.meta_parallel
|
104
112
|
else:
|
105
|
-
_meta_parallel =
|
113
|
+
_meta_parallel = new_task.meta_parallel
|
106
114
|
|
107
115
|
new_workflow_task = WorkflowTaskV2(
|
108
|
-
task_id=
|
109
|
-
task_type=
|
110
|
-
task=
|
116
|
+
task_id=new_task.id,
|
117
|
+
task_type=new_task.type,
|
118
|
+
task=new_task,
|
111
119
|
# old-task values
|
112
120
|
type_filters=old_workflow_task.type_filters,
|
113
121
|
# possibly new values
|
@@ -134,7 +142,7 @@ async def create_workflowtask(
|
|
134
142
|
project_id: int,
|
135
143
|
workflow_id: int,
|
136
144
|
task_id: int,
|
137
|
-
|
145
|
+
wftask: WorkflowTaskCreateV2,
|
138
146
|
user: UserOAuth = Depends(current_active_user),
|
139
147
|
db: AsyncSession = Depends(get_async_db),
|
140
148
|
) -> Optional[WorkflowTaskReadV2]:
|
@@ -152,8 +160,8 @@ async def create_workflowtask(
|
|
152
160
|
|
153
161
|
if task.type == "parallel":
|
154
162
|
if (
|
155
|
-
|
156
|
-
or
|
163
|
+
wftask.meta_non_parallel is not None
|
164
|
+
or wftask.args_non_parallel is not None
|
157
165
|
):
|
158
166
|
raise HTTPException(
|
159
167
|
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
@@ -165,8 +173,8 @@ async def create_workflowtask(
|
|
165
173
|
)
|
166
174
|
elif task.type == "non_parallel":
|
167
175
|
if (
|
168
|
-
|
169
|
-
or
|
176
|
+
wftask.meta_parallel is not None
|
177
|
+
or wftask.args_parallel is not None
|
170
178
|
):
|
171
179
|
raise HTTPException(
|
172
180
|
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
@@ -176,20 +184,26 @@ async def create_workflowtask(
|
|
176
184
|
"is `non_parallel`."
|
177
185
|
),
|
178
186
|
)
|
179
|
-
|
187
|
+
|
188
|
+
_check_type_filters_compatibility(
|
189
|
+
task_input_types=task.input_types,
|
190
|
+
wftask_type_filters=wftask.type_filters,
|
191
|
+
)
|
192
|
+
|
193
|
+
wftask_db = await _workflow_insert_task(
|
180
194
|
workflow_id=workflow.id,
|
181
195
|
task_id=task_id,
|
182
|
-
meta_non_parallel=
|
183
|
-
meta_parallel=
|
184
|
-
args_non_parallel=
|
185
|
-
args_parallel=
|
186
|
-
type_filters=
|
196
|
+
meta_non_parallel=wftask.meta_non_parallel,
|
197
|
+
meta_parallel=wftask.meta_parallel,
|
198
|
+
args_non_parallel=wftask.args_non_parallel,
|
199
|
+
args_parallel=wftask.args_parallel,
|
200
|
+
type_filters=wftask.type_filters,
|
187
201
|
db=db,
|
188
202
|
)
|
189
203
|
|
190
204
|
await db.close()
|
191
205
|
|
192
|
-
return
|
206
|
+
return wftask_db
|
193
207
|
|
194
208
|
|
195
209
|
@router.get(
|
@@ -236,6 +250,11 @@ async def update_workflowtask(
|
|
236
250
|
user_id=user.id,
|
237
251
|
db=db,
|
238
252
|
)
|
253
|
+
if workflow_task_update.type_filters is not None:
|
254
|
+
_check_type_filters_compatibility(
|
255
|
+
task_input_types=db_wf_task.task.input_types,
|
256
|
+
wftask_type_filters=workflow_task_update.type_filters,
|
257
|
+
)
|
239
258
|
|
240
259
|
if db_wf_task.task_type == "parallel" and (
|
241
260
|
workflow_task_update.args_non_parallel is not None
|
@@ -966,8 +966,8 @@ class FractalSlurmSSHExecutor(SlurmExecutor):
|
|
966
966
|
# Retrieve job and future objects
|
967
967
|
job = jobs[ind_job]
|
968
968
|
future = futures[ind_job]
|
969
|
-
remaining_job_ids = job_ids[ind_job + 1 :]
|
970
|
-
remaining_futures = futures[ind_job + 1 :]
|
969
|
+
remaining_job_ids = job_ids[ind_job + 1 :]
|
970
|
+
remaining_futures = futures[ind_job + 1 :]
|
971
971
|
|
972
972
|
outputs = []
|
973
973
|
|
{fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/schemas/_filter_validators.py
RENAMED
@@ -22,14 +22,10 @@ def validate_attribute_filters(
|
|
22
22
|
|
23
23
|
attribute_filters = valdict_keys("attribute_filters")(attribute_filters)
|
24
24
|
for key, values in attribute_filters.items():
|
25
|
-
if values
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
elif values == []:
|
30
|
-
# WARNING: in this case, no image can match with the current
|
31
|
-
# filter. In the future we may deprecate this possibility.
|
32
|
-
pass
|
25
|
+
if values == []:
|
26
|
+
raise ValueError(
|
27
|
+
f"attribute_filters[{key}] cannot be an empty list."
|
28
|
+
)
|
33
29
|
else:
|
34
30
|
# values is a non-empty list, and its items must all be of the
|
35
31
|
# same scalar non-None type
|
@@ -0,0 +1,116 @@
|
|
1
|
+
import logging
|
2
|
+
from typing import Union
|
3
|
+
|
4
|
+
from sqlalchemy.orm.attributes import flag_modified
|
5
|
+
from sqlmodel import select
|
6
|
+
|
7
|
+
from fractal_server.app.db import get_sync_db
|
8
|
+
from fractal_server.app.models import DatasetV2
|
9
|
+
from fractal_server.app.models import JobV2
|
10
|
+
from fractal_server.app.models import WorkflowTaskV2
|
11
|
+
from fractal_server.app.schemas.v2 import DatasetReadV2
|
12
|
+
from fractal_server.app.schemas.v2 import JobReadV2
|
13
|
+
from fractal_server.app.schemas.v2 import ProjectReadV2
|
14
|
+
from fractal_server.app.schemas.v2 import TaskReadV2
|
15
|
+
from fractal_server.app.schemas.v2 import WorkflowTaskReadV2
|
16
|
+
|
17
|
+
logger = logging.getLogger("fix_db")
|
18
|
+
logger.setLevel(logging.INFO)
|
19
|
+
|
20
|
+
|
21
|
+
def dict_values_to_list(
|
22
|
+
input_dict: dict[str, Union[int, float, bool, str, None]],
|
23
|
+
identifier: str,
|
24
|
+
) -> dict[str, list[Union[int, float, bool, str]]]:
|
25
|
+
for k, v in input_dict.items():
|
26
|
+
if not isinstance(v, (int, float, bool, str, type(None))):
|
27
|
+
error_msg = (
|
28
|
+
f"Attribute '{k}' from '{identifier}' "
|
29
|
+
f"has invalid type '{type(v)}'."
|
30
|
+
)
|
31
|
+
logger.error(error_msg)
|
32
|
+
raise RuntimeError(error_msg)
|
33
|
+
elif v is None:
|
34
|
+
logger.warning(
|
35
|
+
f"Attribute '{k}' from '{identifier}' is None and it "
|
36
|
+
"will be removed."
|
37
|
+
)
|
38
|
+
else:
|
39
|
+
input_dict[k] = [v]
|
40
|
+
return input_dict
|
41
|
+
|
42
|
+
|
43
|
+
def fix_db():
|
44
|
+
logger.info("START execution of fix_db function")
|
45
|
+
|
46
|
+
with next(get_sync_db()) as db:
|
47
|
+
# DatasetV2.filters
|
48
|
+
# DatasetV2.history[].workflowtask.input_filters
|
49
|
+
stm = select(DatasetV2).order_by(DatasetV2.id)
|
50
|
+
datasets = db.execute(stm).scalars().all()
|
51
|
+
for ds in datasets:
|
52
|
+
logger.info(f"DatasetV2[{ds.id}] START")
|
53
|
+
ds.attribute_filters = dict_values_to_list(
|
54
|
+
ds.filters["attributes"],
|
55
|
+
f"Dataset[{ds.id}].filters.attributes",
|
56
|
+
)
|
57
|
+
ds.type_filters = ds.filters["types"]
|
58
|
+
ds.filters = None
|
59
|
+
for i, h in enumerate(ds.history):
|
60
|
+
ds.history[i]["workflowtask"]["type_filters"] = h[
|
61
|
+
"workflowtask"
|
62
|
+
]["input_filters"]["types"]
|
63
|
+
flag_modified(ds, "history")
|
64
|
+
DatasetReadV2(
|
65
|
+
**ds.model_dump(),
|
66
|
+
project=ProjectReadV2(**ds.project.model_dump()),
|
67
|
+
)
|
68
|
+
db.add(ds)
|
69
|
+
logger.info(f"DatasetV2[{ds.id}] END - fixed filters")
|
70
|
+
|
71
|
+
logger.info("------ switch from dataset to workflowtasks ------")
|
72
|
+
|
73
|
+
# WorkflowTaskV2.input_filters
|
74
|
+
stm = select(WorkflowTaskV2).order_by(WorkflowTaskV2.id)
|
75
|
+
wftasks = db.execute(stm).scalars().all()
|
76
|
+
for wft in wftasks:
|
77
|
+
logger.info(f"WorkflowTaskV2[{wft.id}] START")
|
78
|
+
wft.type_filters = wft.input_filters["types"]
|
79
|
+
if wft.input_filters["attributes"]:
|
80
|
+
logger.warning(
|
81
|
+
"Removing input_filters['attributes']. "
|
82
|
+
f"(previous value: {wft.input_filters['attributes']})"
|
83
|
+
)
|
84
|
+
wft.input_filters = None
|
85
|
+
flag_modified(wft, "input_filters")
|
86
|
+
WorkflowTaskReadV2(
|
87
|
+
**wft.model_dump(),
|
88
|
+
task=TaskReadV2(**wft.task.model_dump()),
|
89
|
+
)
|
90
|
+
db.add(wft)
|
91
|
+
logger.info(f"WorkflowTaskV2[{wft.id}] END - fixed filters")
|
92
|
+
|
93
|
+
logger.info("------ switch from workflowtasks to jobs ------")
|
94
|
+
|
95
|
+
# JOBS V2
|
96
|
+
stm = select(JobV2).order_by(JobV2.id)
|
97
|
+
jobs = db.execute(stm).scalars().all()
|
98
|
+
for job in jobs:
|
99
|
+
logger.info(f"JobV2[{job.id}] START")
|
100
|
+
job.dataset_dump["type_filters"] = job.dataset_dump["filters"][
|
101
|
+
"types"
|
102
|
+
]
|
103
|
+
job.dataset_dump["attribute_filters"] = dict_values_to_list(
|
104
|
+
job.dataset_dump["filters"]["attributes"],
|
105
|
+
f"JobV2[{job.id}].dataset_dump.filters.attributes",
|
106
|
+
)
|
107
|
+
job.dataset_dump.pop("filters")
|
108
|
+
flag_modified(job, "dataset_dump")
|
109
|
+
JobReadV2(**job.model_dump())
|
110
|
+
db.add(job)
|
111
|
+
logger.info(f"JobV2[{job.id}] END - fixed filters")
|
112
|
+
|
113
|
+
db.commit()
|
114
|
+
logger.info("Changes committed.")
|
115
|
+
|
116
|
+
logger.info("END execution of fix_db function")
|
@@ -9,7 +9,7 @@ from pydantic import validator
|
|
9
9
|
from fractal_server.app.schemas._validators import valdict_keys
|
10
10
|
from fractal_server.urls import normalize_url
|
11
11
|
|
12
|
-
AttributeFiltersType = dict[str,
|
12
|
+
AttributeFiltersType = dict[str, list[Any]]
|
13
13
|
|
14
14
|
|
15
15
|
class _SingleImageBase(BaseModel):
|
@@ -109,7 +109,10 @@ def set_logger(
|
|
109
109
|
if isinstance(handler, logging.FileHandler)
|
110
110
|
]
|
111
111
|
if len(current_file_handlers) > 1:
|
112
|
-
logger.warning(
|
112
|
+
logger.warning(
|
113
|
+
f"Logger {logger_name} has multiple file handlers: "
|
114
|
+
f"{current_file_handlers}"
|
115
|
+
)
|
113
116
|
|
114
117
|
return logger
|
115
118
|
|
{fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/tasks/v2/local/collect.py
RENAMED
@@ -33,8 +33,6 @@ from fractal_server.tasks.v2.utils_templates import (
|
|
33
33
|
from fractal_server.tasks.v2.utils_templates import SCRIPTS_SUBFOLDER
|
34
34
|
from fractal_server.utils import get_timestamp
|
35
35
|
|
36
|
-
LOGGER_NAME = __name__
|
37
|
-
|
38
36
|
|
39
37
|
def collect_local(
|
40
38
|
*,
|
@@ -59,6 +57,8 @@ def collect_local(
|
|
59
57
|
wheel_file:
|
60
58
|
"""
|
61
59
|
|
60
|
+
LOGGER_NAME = f"{__name__}.ID{task_group_activity_id}"
|
61
|
+
|
62
62
|
with TemporaryDirectory() as tmpdir:
|
63
63
|
log_file_path = get_log_path(Path(tmpdir))
|
64
64
|
logger = set_logger(
|
{fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/tasks/v2/local/deactivate.py
RENAMED
@@ -21,8 +21,6 @@ from fractal_server.tasks.v2.utils_background import get_current_log
|
|
21
21
|
from fractal_server.tasks.v2.utils_templates import SCRIPTS_SUBFOLDER
|
22
22
|
from fractal_server.utils import get_timestamp
|
23
23
|
|
24
|
-
LOGGER_NAME = __name__
|
25
|
-
|
26
24
|
|
27
25
|
def deactivate_local(
|
28
26
|
*,
|
@@ -40,6 +38,8 @@ def deactivate_local(
|
|
40
38
|
task_group_activity_id:
|
41
39
|
"""
|
42
40
|
|
41
|
+
LOGGER_NAME = f"{__name__}.ID{task_group_activity_id}"
|
42
|
+
|
43
43
|
with TemporaryDirectory() as tmpdir:
|
44
44
|
log_file_path = get_log_path(Path(tmpdir))
|
45
45
|
logger = set_logger(
|
{fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/tasks/v2/local/reactivate.py
RENAMED
@@ -23,9 +23,6 @@ from fractal_server.tasks.v2.utils_templates import SCRIPTS_SUBFOLDER
|
|
23
23
|
from fractal_server.utils import get_timestamp
|
24
24
|
|
25
25
|
|
26
|
-
LOGGER_NAME = __name__
|
27
|
-
|
28
|
-
|
29
26
|
def reactivate_local(
|
30
27
|
*,
|
31
28
|
task_group_activity_id: int,
|
@@ -42,6 +39,8 @@ def reactivate_local(
|
|
42
39
|
task_group_activity_id:
|
43
40
|
"""
|
44
41
|
|
42
|
+
LOGGER_NAME = f"{__name__}.ID{task_group_activity_id}"
|
43
|
+
|
45
44
|
with TemporaryDirectory() as tmpdir:
|
46
45
|
log_file_path = get_log_path(Path(tmpdir))
|
47
46
|
logger = set_logger(
|
@@ -30,8 +30,6 @@ from fractal_server.tasks.v2.utils_templates import (
|
|
30
30
|
from fractal_server.tasks.v2.utils_templates import SCRIPTS_SUBFOLDER
|
31
31
|
from fractal_server.utils import get_timestamp
|
32
32
|
|
33
|
-
LOGGER_NAME = __name__
|
34
|
-
|
35
33
|
|
36
34
|
def collect_ssh(
|
37
35
|
*,
|
@@ -62,6 +60,8 @@ def collect_ssh(
|
|
62
60
|
wheel_file:
|
63
61
|
"""
|
64
62
|
|
63
|
+
LOGGER_NAME = f"{__name__}.ID{task_group_activity_id}"
|
64
|
+
|
65
65
|
# Work within a temporary folder, where also logs will be placed
|
66
66
|
with TemporaryDirectory() as tmpdir:
|
67
67
|
LOGGER_NAME = "task_collection_ssh"
|
{fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/tasks/v2/ssh/deactivate.py
RENAMED
@@ -22,8 +22,6 @@ from fractal_server.tasks.v2.utils_background import get_current_log
|
|
22
22
|
from fractal_server.tasks.v2.utils_templates import SCRIPTS_SUBFOLDER
|
23
23
|
from fractal_server.utils import get_timestamp
|
24
24
|
|
25
|
-
LOGGER_NAME = __name__
|
26
|
-
|
27
25
|
|
28
26
|
def deactivate_ssh(
|
29
27
|
*,
|
@@ -47,6 +45,8 @@ def deactivate_ssh(
|
|
47
45
|
`user_settings.ssh_tasks_dir`.
|
48
46
|
"""
|
49
47
|
|
48
|
+
LOGGER_NAME = f"{__name__}.ID{task_group_activity_id}"
|
49
|
+
|
50
50
|
with TemporaryDirectory() as tmpdir:
|
51
51
|
log_file_path = get_log_path(Path(tmpdir))
|
52
52
|
logger = set_logger(
|
{fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/tasks/v2/ssh/reactivate.py
RENAMED
@@ -22,8 +22,6 @@ from fractal_server.tasks.v2.utils_python_interpreter import (
|
|
22
22
|
from fractal_server.tasks.v2.utils_templates import SCRIPTS_SUBFOLDER
|
23
23
|
from fractal_server.utils import get_timestamp
|
24
24
|
|
25
|
-
LOGGER_NAME = __name__
|
26
|
-
|
27
25
|
|
28
26
|
def reactivate_ssh(
|
29
27
|
*,
|
@@ -47,6 +45,8 @@ def reactivate_ssh(
|
|
47
45
|
`user_settings.ssh_tasks_dir`.
|
48
46
|
"""
|
49
47
|
|
48
|
+
LOGGER_NAME = f"{__name__}.ID{task_group_activity_id}"
|
49
|
+
|
50
50
|
with TemporaryDirectory() as tmpdir:
|
51
51
|
log_file_path = get_log_path(Path(tmpdir))
|
52
52
|
logger = set_logger(
|
@@ -1,6 +1,6 @@
|
|
1
1
|
[project]
|
2
2
|
name = "fractal-server"
|
3
|
-
version = "2.11.
|
3
|
+
version = "2.11.0a6"
|
4
4
|
description = "Backend component of the Fractal analytics platform"
|
5
5
|
authors = [
|
6
6
|
{ name="Tommaso Comparin", email="tommaso.comparin@exact-lab.it" },
|
@@ -95,7 +95,7 @@ filterwarnings = [
|
|
95
95
|
]
|
96
96
|
|
97
97
|
[tool.bumpver]
|
98
|
-
current_version = "2.11.
|
98
|
+
current_version = "2.11.0a6"
|
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.11.0a4"
|
@@ -1,69 +0,0 @@
|
|
1
|
-
import logging
|
2
|
-
|
3
|
-
from sqlalchemy.orm.attributes import flag_modified
|
4
|
-
from sqlmodel import select
|
5
|
-
|
6
|
-
from fractal_server.app.db import get_sync_db
|
7
|
-
from fractal_server.app.models import DatasetV2
|
8
|
-
from fractal_server.app.models import JobV2
|
9
|
-
from fractal_server.app.models import WorkflowTaskV2
|
10
|
-
|
11
|
-
logger = logging.getLogger("fix_db")
|
12
|
-
logger.setLevel(logging.INFO)
|
13
|
-
|
14
|
-
|
15
|
-
def fix_db():
|
16
|
-
|
17
|
-
logger.info("START execution of fix_db function")
|
18
|
-
|
19
|
-
with next(get_sync_db()) as db:
|
20
|
-
|
21
|
-
# DatasetV2.filters
|
22
|
-
# DatasetV2.history[].workflowtask.input_filters
|
23
|
-
stm = select(DatasetV2).order_by(DatasetV2.id)
|
24
|
-
datasets = db.execute(stm).scalars().all()
|
25
|
-
for ds in datasets:
|
26
|
-
ds.attribute_filters = ds.filters["attributes"]
|
27
|
-
ds.type_filters = ds.filters["types"]
|
28
|
-
ds.filters = None
|
29
|
-
for i, h in enumerate(ds.history):
|
30
|
-
ds.history[i]["workflowtask"]["type_filters"] = h[
|
31
|
-
"workflowtask"
|
32
|
-
]["input_filters"]["types"]
|
33
|
-
flag_modified(ds, "history")
|
34
|
-
db.add(ds)
|
35
|
-
logger.info(f"Fixed filters in DatasetV2[{ds.id}]")
|
36
|
-
|
37
|
-
# WorkflowTaskV2.input_filters
|
38
|
-
stm = select(WorkflowTaskV2).order_by(WorkflowTaskV2.id)
|
39
|
-
wftasks = db.execute(stm).scalars().all()
|
40
|
-
for wft in wftasks:
|
41
|
-
wft.type_filters = wft.input_filters["types"]
|
42
|
-
if wft.input_filters["attributes"]:
|
43
|
-
logger.warning(
|
44
|
-
f"Removing WorkflowTaskV2[{wft.id}].input_filters"
|
45
|
-
f"['attributes'] = {wft.input_filters['attributes']}"
|
46
|
-
)
|
47
|
-
wft.input_filters = None
|
48
|
-
flag_modified(wft, "input_filters")
|
49
|
-
db.add(wft)
|
50
|
-
logger.info(f"Fixed filters in WorkflowTaskV2[{wft.id}]")
|
51
|
-
|
52
|
-
# JOBS V2
|
53
|
-
stm = select(JobV2).order_by(JobV2.id)
|
54
|
-
jobs = db.execute(stm).scalars().all()
|
55
|
-
for job in jobs:
|
56
|
-
job.dataset_dump["type_filters"] = job.dataset_dump["filters"][
|
57
|
-
"types"
|
58
|
-
]
|
59
|
-
job.dataset_dump["attribute_filters"] = job.dataset_dump[
|
60
|
-
"filters"
|
61
|
-
]["attributes"]
|
62
|
-
job.dataset_dump.pop("filters")
|
63
|
-
flag_modified(job, "dataset_dump")
|
64
|
-
logger.info(f"Fixed filters in JobV2[{job.id}].datasetdump")
|
65
|
-
|
66
|
-
db.commit()
|
67
|
-
logger.info("Changes committed.")
|
68
|
-
|
69
|
-
logger.info("END execution of fix_db function")
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{fractal_server-2.11.0a4 → fractal_server-2.11.0a6}/fractal_server/app/models/linkusergroup.py
RENAMED
File without changes
|