fractal-server 2.15.3__tar.gz → 2.15.5__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.15.3 → fractal_server-2.15.5}/PKG-INFO +2 -1
- fractal_server-2.15.5/fractal_server/__init__.py +1 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/models/v2/project.py +0 -1
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/models/v2/task_group.py +0 -1
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/models/v2/workflow.py +0 -1
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/admin/v2/accounting.py +0 -1
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/admin/v2/job.py +27 -1
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/admin/v2/task.py +0 -4
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/admin/v2/task_group.py +0 -3
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/api/v2/_aux_functions.py +0 -1
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/api/v2/_aux_functions_tasks.py +0 -1
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/api/v2/history.py +0 -2
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/api/v2/images.py +0 -5
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/api/v2/pre_submission_checks.py +0 -1
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/api/v2/submit.py +0 -1
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/api/v2/task_collection_custom.py +0 -2
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/api/v2/task_collection_pixi.py +0 -1
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/api/v2/task_group.py +0 -2
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/api/v2/task_group_lifecycle.py +0 -2
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/api/v2/task_version_update.py +0 -2
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/api/v2/workflow.py +0 -2
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/auth/group.py +0 -5
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/pagination.py +0 -2
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/executors/local/runner.py +0 -3
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/v2/db_tools.py +0 -1
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/v2/merge_outputs.py +0 -2
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/v2/runner.py +0 -1
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/v2/task_interface.py +1 -4
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/schemas/v2/accounting.py +0 -1
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/schemas/v2/project.py +0 -3
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/schemas/v2/workflow.py +0 -3
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/config.py +2 -2
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/data_migrations/2_14_10.py +0 -1
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/main.py +0 -1
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/1eac13a26c83_drop_v1_tables.py +0 -1
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/501961cfcd85_remove_link_between_v1_and_v2_tasks_.py +0 -1
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/tasks/v2/local/_utils.py +32 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/tasks/v2/local/collect.py +0 -1
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/tasks/v2/local/collect_pixi.py +7 -6
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/tasks/v2/local/deactivate.py +0 -2
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/tasks/v2/local/deactivate_pixi.py +0 -1
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/tasks/v2/local/reactivate_pixi.py +5 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/tasks/v2/ssh/_utils.py +38 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/tasks/v2/ssh/collect.py +0 -1
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/tasks/v2/ssh/collect_pixi.py +11 -4
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/tasks/v2/ssh/deactivate.py +0 -1
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/tasks/v2/ssh/reactivate_pixi.py +10 -0
- fractal_server-2.15.5/fractal_server/tasks/v2/utils_pixi.py +105 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/tasks/v2/utils_python_interpreter.py +1 -1
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/types/validators/_filter_validators.py +1 -1
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/zip_tools.py +0 -1
- {fractal_server-2.15.3 → fractal_server-2.15.5}/pyproject.toml +4 -3
- fractal_server-2.15.3/fractal_server/__init__.py +0 -1
- fractal_server-2.15.3/fractal_server/tasks/v2/utils_pixi.py +0 -38
- {fractal_server-2.15.3 → fractal_server-2.15.5}/LICENSE +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/README.md +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/__main__.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/alembic.ini +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/__init__.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/db/__init__.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/models/__init__.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/models/linkusergroup.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/models/linkuserproject.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/models/security.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/models/user_settings.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/models/v2/__init__.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/models/v2/accounting.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/models/v2/dataset.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/models/v2/history.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/models/v2/job.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/models/v2/task.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/models/v2/workflowtask.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/__init__.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/admin/__init__.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/admin/v2/__init__.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/admin/v2/impersonate.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/admin/v2/project.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/admin/v2/task_group_lifecycle.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/api/__init__.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/api/v2/__init__.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/api/v2/_aux_functions_history.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/api/v2/_aux_functions_task_lifecycle.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/api/v2/_aux_functions_task_version_update.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/api/v2/_aux_task_group_disambiguation.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/api/v2/dataset.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/api/v2/job.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/api/v2/project.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/api/v2/status_legacy.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/api/v2/task.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/api/v2/task_collection.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/api/v2/workflow_import.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/api/v2/workflowtask.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/auth/__init__.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/auth/_aux_auth.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/auth/current_user.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/auth/login.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/auth/oauth.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/auth/register.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/auth/router.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/auth/users.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/aux/__init__.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/aux/_job.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/aux/_runner.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/aux/validate_user_settings.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/__init__.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/components.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/exceptions.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/executors/__init__.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/executors/base_runner.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/executors/call_command_wrapper.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/executors/local/__init__.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/executors/local/get_local_config.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/executors/slurm_common/__init__.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/executors/slurm_common/_batching.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/executors/slurm_common/_job_states.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/executors/slurm_common/_slurm_config.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/executors/slurm_common/base_slurm_runner.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/executors/slurm_common/get_slurm_config.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/executors/slurm_common/remote.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/executors/slurm_common/slurm_job_task_models.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/executors/slurm_ssh/__init__.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/executors/slurm_ssh/run_subprocess.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/executors/slurm_ssh/runner.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/executors/slurm_ssh/tar_commands.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/executors/slurm_sudo/__init__.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/executors/slurm_sudo/_subprocess_run_as_user.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/executors/slurm_sudo/runner.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/filenames.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/set_start_and_last_task_index.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/shutdown.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/task_files.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/v2/__init__.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/v2/_local.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/v2/_slurm_ssh.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/v2/_slurm_sudo.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/v2/deduplicate_list.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/v2/runner_functions.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/v2/submit_workflow.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/versions.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/schemas/__init__.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/schemas/user.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/schemas/user_group.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/schemas/user_settings.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/schemas/v2/__init__.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/schemas/v2/dataset.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/schemas/v2/dumps.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/schemas/v2/history.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/schemas/v2/job.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/schemas/v2/manifest.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/schemas/v2/status_legacy.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/schemas/v2/task.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/schemas/v2/task_collection.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/schemas/v2/task_group.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/schemas/v2/workflowtask.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/security/__init__.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/security/signup_email.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/user_settings.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/data_migrations/README.md +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/data_migrations/tools.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/exceptions.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/gunicorn_fractal.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/images/__init__.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/images/models.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/images/status_tools.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/images/tools.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/logger.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/env.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/naming_convention.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/034a469ec2eb_task_groups.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/091b01f51f88_add_usergroup_and_linkusergroup_table.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/19eca0dd47a9_user_settings_project_dir.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/316140ff7ee1_remove_usersettings_cache_dir.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/47351f8c7ebc_drop_dataset_filters.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/4c308bcaea2b_add_task_args_schema_and_task_args_.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/4cedeb448a53_workflowtask_foreign_keys_not_nullables.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/50a13d6138fd_initial_schema.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/5bf02391cfef_v2.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/70e77f1c38b0_add_applyworkflow_first_task_index_and_.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/71eefd1dd202_add_slurm_accounts.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/791ce783d3d8_add_indices.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/84bf0fffde30_add_dumps_to_applyworkflow.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/8e8f227a3e36_update_taskv2_post_2_7_0.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/8f79bd162e35_add_docs_info_and_docs_link_to_task_.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/94a47ea2d3ff_remove_cache_dir_slurm_user_and_slurm_.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/969d84257cac_add_historyrun_task_id.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/97f444d47249_add_applyworkflow_project_dump.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/99ea79d9e5d2_add_dataset_history.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/9c5ae74c9b98_add_user_settings_table.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/9db60297b8b2_set_ondelete.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/9fd26a2b0de4_add_workflow_timestamp_created.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/a7f4d6137b53_add_workflow_dump_to_applyworkflow.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/af1ef1c83c9b_add_accounting_tables.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/af8673379a5c_drop_old_filter_columns.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/b1e7f7a1ff71_task_group_for_pixi.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/b3ffb095f973_json_to_jsonb.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/c90a7c76e996_job_id_in_history_run.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/d256a7379ab8_taskgroup_activity_and_venv_info_to_.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/d4fe3708d309_make_applyworkflow_workflow_dump_non_.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/da2cb2ac4255_user_group_viewer_paths.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/db09233ad13a_split_filters_and_keep_old_columns.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/e75cac726012_make_applyworkflow_start_timestamp_not_.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/e81103413827_add_job_type_filters.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/efa89c30e0a4_add_project_timestamp_created.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/f37aceb45062_make_historyunit_logfile_required.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/f384e1c0cf5d_drop_task_default_args_columns.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/migrations/versions/fbce16ff4e47_new_history_items.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/py.typed +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/ssh/__init__.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/ssh/_fabric.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/string_tools.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/syringe.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/tasks/__init__.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/tasks/utils.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/tasks/v2/__init__.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/tasks/v2/local/__init__.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/tasks/v2/local/reactivate.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/tasks/v2/ssh/__init__.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/tasks/v2/ssh/deactivate_pixi.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/tasks/v2/ssh/reactivate.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/tasks/v2/templates/1_create_venv.sh +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/tasks/v2/templates/2_pip_install.sh +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/tasks/v2/templates/3_pip_freeze.sh +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/tasks/v2/templates/4_pip_show.sh +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/tasks/v2/templates/5_get_venv_size_and_file_number.sh +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/tasks/v2/templates/6_pip_install_from_freeze.sh +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/tasks/v2/templates/pixi_1_extract.sh +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/tasks/v2/templates/pixi_2_install.sh +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/tasks/v2/templates/pixi_3_post_install.sh +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/tasks/v2/utils_background.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/tasks/v2/utils_database.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/tasks/v2/utils_package_names.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/tasks/v2/utils_templates.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/types/__init__.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/types/validators/__init__.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/types/validators/_common_validators.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/types/validators/_workflow_task_arguments_validators.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/urls.py +0 -0
- {fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: fractal-server
|
|
3
|
-
Version: 2.15.
|
|
3
|
+
Version: 2.15.5
|
|
4
4
|
Summary: Backend component of the Fractal analytics platform
|
|
5
5
|
License: BSD-3-Clause
|
|
6
6
|
Author: Tommaso Comparin
|
|
@@ -23,6 +23,7 @@ Requires-Dist: pydantic-settings (>=2.7.0)
|
|
|
23
23
|
Requires-Dist: python-dotenv (>=1.1.0,<1.2.0)
|
|
24
24
|
Requires-Dist: sqlalchemy[asyncio] (>=2.0.23,<2.1)
|
|
25
25
|
Requires-Dist: sqlmodel (==0.0.24)
|
|
26
|
+
Requires-Dist: tomli_w (>=1.2.0,<1.3.0)
|
|
26
27
|
Requires-Dist: uvicorn (>=0.29.0,<0.35.0)
|
|
27
28
|
Requires-Dist: uvicorn-worker (==0.3.0)
|
|
28
29
|
Project-URL: Documentation, https://fractal-analytics-platform.github.io/fractal-server
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__VERSION__ = "2.15.5"
|
|
@@ -107,7 +107,6 @@ class TaskGroupV2(SQLModel, table=True):
|
|
|
107
107
|
|
|
108
108
|
|
|
109
109
|
class TaskGroupActivityV2(SQLModel, table=True):
|
|
110
|
-
|
|
111
110
|
id: int | None = Field(default=None, primary_key=True)
|
|
112
111
|
user_id: int = Field(foreign_key="user_oauth.id")
|
|
113
112
|
taskgroupv2_id: int | None = Field(
|
{fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/admin/v2/accounting.py
RENAMED
|
@@ -82,7 +82,6 @@ async def query_accounting_slurm(
|
|
|
82
82
|
superuser: UserOAuth = Depends(current_active_superuser),
|
|
83
83
|
db: AsyncSession = Depends(get_async_db),
|
|
84
84
|
) -> JSONResponse:
|
|
85
|
-
|
|
86
85
|
stm = select(AccountingRecordSlurm.slurm_job_ids)
|
|
87
86
|
if query.user_id is not None:
|
|
88
87
|
stm = stm.where(AccountingRecordSlurm.user_id == query.user_id)
|
|
@@ -12,12 +12,15 @@ from sqlmodel import select
|
|
|
12
12
|
from fractal_server.app.db import AsyncSession
|
|
13
13
|
from fractal_server.app.db import get_async_db
|
|
14
14
|
from fractal_server.app.models import UserOAuth
|
|
15
|
+
from fractal_server.app.models.v2 import HistoryRun
|
|
16
|
+
from fractal_server.app.models.v2 import HistoryUnit
|
|
15
17
|
from fractal_server.app.models.v2 import JobV2
|
|
16
18
|
from fractal_server.app.models.v2 import ProjectV2
|
|
17
19
|
from fractal_server.app.routes.auth import current_active_superuser
|
|
18
20
|
from fractal_server.app.routes.aux._job import _write_shutdown_file
|
|
19
21
|
from fractal_server.app.routes.aux._runner import _check_shutdown_is_supported
|
|
20
22
|
from fractal_server.app.runner.filenames import WORKFLOW_LOG_FILENAME
|
|
23
|
+
from fractal_server.app.schemas.v2 import HistoryUnitStatus
|
|
21
24
|
from fractal_server.app.schemas.v2 import JobReadV2
|
|
22
25
|
from fractal_server.app.schemas.v2 import JobStatusTypeV2
|
|
23
26
|
from fractal_server.app.schemas.v2 import JobUpdateV2
|
|
@@ -111,7 +114,6 @@ async def view_single_job(
|
|
|
111
114
|
user: UserOAuth = Depends(current_active_superuser),
|
|
112
115
|
db: AsyncSession = Depends(get_async_db),
|
|
113
116
|
) -> JobReadV2:
|
|
114
|
-
|
|
115
117
|
job = await db.get(JobV2, job_id)
|
|
116
118
|
if not job:
|
|
117
119
|
raise HTTPException(
|
|
@@ -149,6 +151,11 @@ async def update_job(
|
|
|
149
151
|
status_code=status.HTTP_404_NOT_FOUND,
|
|
150
152
|
detail=f"Job {job_id} not found",
|
|
151
153
|
)
|
|
154
|
+
if job.status != JobStatusTypeV2.SUBMITTED:
|
|
155
|
+
raise HTTPException(
|
|
156
|
+
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
|
157
|
+
detail=f"Job {job_id} has status {job.status=} != 'submitted'.",
|
|
158
|
+
)
|
|
152
159
|
|
|
153
160
|
if job_update.status != JobStatusTypeV2.FAILED:
|
|
154
161
|
raise HTTPException(
|
|
@@ -165,6 +172,25 @@ async def update_job(
|
|
|
165
172
|
f"{job.log or ''}\nThis job was manually marked as "
|
|
166
173
|
f"'{JobStatusTypeV2.FAILED}' by an admin ({timestamp.isoformat()}).",
|
|
167
174
|
)
|
|
175
|
+
|
|
176
|
+
res = await db.execute(
|
|
177
|
+
select(HistoryRun)
|
|
178
|
+
.where(HistoryRun.job_id == job_id)
|
|
179
|
+
.order_by(HistoryRun.timestamp_started.desc())
|
|
180
|
+
.limit(1)
|
|
181
|
+
)
|
|
182
|
+
latest_run = res.scalar_one_or_none()
|
|
183
|
+
if latest_run is not None:
|
|
184
|
+
setattr(latest_run, "status", HistoryUnitStatus.FAILED)
|
|
185
|
+
res = await db.execute(
|
|
186
|
+
select(HistoryUnit).where(
|
|
187
|
+
HistoryUnit.history_run_id == latest_run.id
|
|
188
|
+
)
|
|
189
|
+
)
|
|
190
|
+
history_units = res.scalars().all()
|
|
191
|
+
for history_unit in history_units:
|
|
192
|
+
setattr(history_unit, "status", HistoryUnitStatus.FAILED)
|
|
193
|
+
|
|
168
194
|
await db.commit()
|
|
169
195
|
await db.refresh(job)
|
|
170
196
|
await db.close()
|
|
@@ -20,7 +20,6 @@ router = APIRouter()
|
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
class TaskV2Minimal(BaseModel):
|
|
23
|
-
|
|
24
23
|
id: int
|
|
25
24
|
name: str
|
|
26
25
|
type: str
|
|
@@ -32,13 +31,11 @@ class TaskV2Minimal(BaseModel):
|
|
|
32
31
|
|
|
33
32
|
|
|
34
33
|
class ProjectUser(BaseModel):
|
|
35
|
-
|
|
36
34
|
id: int
|
|
37
35
|
email: EmailStr
|
|
38
36
|
|
|
39
37
|
|
|
40
38
|
class TaskV2Relationship(BaseModel):
|
|
41
|
-
|
|
42
39
|
workflow_id: int
|
|
43
40
|
workflow_name: str
|
|
44
41
|
project_id: int
|
|
@@ -47,7 +44,6 @@ class TaskV2Relationship(BaseModel):
|
|
|
47
44
|
|
|
48
45
|
|
|
49
46
|
class TaskV2Info(BaseModel):
|
|
50
|
-
|
|
51
47
|
task: TaskV2Minimal
|
|
52
48
|
relationships: list[TaskV2Relationship]
|
|
53
49
|
|
{fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/admin/v2/task_group.py
RENAMED
|
@@ -43,7 +43,6 @@ async def get_task_group_activity_list(
|
|
|
43
43
|
superuser: UserOAuth = Depends(current_active_superuser),
|
|
44
44
|
db: AsyncSession = Depends(get_async_db),
|
|
45
45
|
) -> list[TaskGroupActivityV2Read]:
|
|
46
|
-
|
|
47
46
|
stm = select(TaskGroupActivityV2)
|
|
48
47
|
if task_group_activity_id is not None:
|
|
49
48
|
stm = stm.where(TaskGroupActivityV2.id == task_group_activity_id)
|
|
@@ -73,7 +72,6 @@ async def query_task_group(
|
|
|
73
72
|
user: UserOAuth = Depends(current_active_superuser),
|
|
74
73
|
db: AsyncSession = Depends(get_async_db),
|
|
75
74
|
) -> TaskGroupReadV2:
|
|
76
|
-
|
|
77
75
|
task_group = await db.get(TaskGroupV2, task_group_id)
|
|
78
76
|
if task_group is None:
|
|
79
77
|
raise HTTPException(
|
|
@@ -96,7 +94,6 @@ async def query_task_group_list(
|
|
|
96
94
|
user: UserOAuth = Depends(current_active_superuser),
|
|
97
95
|
db: AsyncSession = Depends(get_async_db),
|
|
98
96
|
) -> list[TaskGroupReadV2]:
|
|
99
|
-
|
|
100
97
|
stm = select(TaskGroupV2)
|
|
101
98
|
|
|
102
99
|
if user_group_id is not None and private is True:
|
|
@@ -71,7 +71,6 @@ async def get_workflow_tasks_statuses(
|
|
|
71
71
|
user: UserOAuth = Depends(current_active_user),
|
|
72
72
|
db: AsyncSession = Depends(get_async_db),
|
|
73
73
|
) -> JSONResponse:
|
|
74
|
-
|
|
75
74
|
# Access control
|
|
76
75
|
workflow = await _get_workflow_check_owner(
|
|
77
76
|
project_id=project_id,
|
|
@@ -335,7 +334,6 @@ async def get_history_images(
|
|
|
335
334
|
db: AsyncSession = Depends(get_async_db),
|
|
336
335
|
pagination: PaginationRequest = Depends(get_pagination_params),
|
|
337
336
|
) -> ImagePage:
|
|
338
|
-
|
|
339
337
|
# Access control and object retrieval
|
|
340
338
|
wftask = await get_wftask_check_owner(
|
|
341
339
|
project_id=project_id,
|
|
@@ -31,7 +31,6 @@ router = APIRouter()
|
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
class ImagePage(PaginationResponse[SingleImage]):
|
|
34
|
-
|
|
35
34
|
attributes: dict[str, list[ImageAttributeValue]]
|
|
36
35
|
types: list[str]
|
|
37
36
|
|
|
@@ -64,7 +63,6 @@ async def post_new_image(
|
|
|
64
63
|
user: UserOAuth = Depends(current_active_user),
|
|
65
64
|
db: AsyncSession = Depends(get_async_db),
|
|
66
65
|
) -> Response:
|
|
67
|
-
|
|
68
66
|
output = await _get_dataset_check_owner(
|
|
69
67
|
project_id=project_id, dataset_id=dataset_id, user_id=user.id, db=db
|
|
70
68
|
)
|
|
@@ -117,7 +115,6 @@ async def query_dataset_images(
|
|
|
117
115
|
user: UserOAuth = Depends(current_active_user),
|
|
118
116
|
db: AsyncSession = Depends(get_async_db),
|
|
119
117
|
) -> ImagePage:
|
|
120
|
-
|
|
121
118
|
page = pagination.page
|
|
122
119
|
page_size = pagination.page_size
|
|
123
120
|
|
|
@@ -131,7 +128,6 @@ async def query_dataset_images(
|
|
|
131
128
|
types = aggregate_types(images)
|
|
132
129
|
|
|
133
130
|
if query is not None:
|
|
134
|
-
|
|
135
131
|
if query.zarr_url is not None:
|
|
136
132
|
image = next(
|
|
137
133
|
(
|
|
@@ -190,7 +186,6 @@ async def delete_dataset_images(
|
|
|
190
186
|
user: UserOAuth = Depends(current_active_user),
|
|
191
187
|
db: AsyncSession = Depends(get_async_db),
|
|
192
188
|
) -> Response:
|
|
193
|
-
|
|
194
189
|
output = await _get_dataset_check_owner(
|
|
195
190
|
project_id=project_id, dataset_id=dataset_id, user_id=user.id, db=db
|
|
196
191
|
)
|
|
@@ -96,7 +96,6 @@ async def check_non_processed_images(
|
|
|
96
96
|
user: UserOAuth = Depends(current_active_user),
|
|
97
97
|
db: AsyncSession = Depends(get_async_db),
|
|
98
98
|
) -> JSONResponse:
|
|
99
|
-
|
|
100
99
|
db_workflow_task, db_workflow = await _get_workflow_task_check_owner(
|
|
101
100
|
project_id=project_id,
|
|
102
101
|
workflow_task_id=workflowtask_id,
|
|
@@ -57,7 +57,6 @@ async def apply_workflow(
|
|
|
57
57
|
user: UserOAuth = Depends(current_active_verified_user),
|
|
58
58
|
db: AsyncSession = Depends(get_async_db),
|
|
59
59
|
) -> JobReadV2 | None:
|
|
60
|
-
|
|
61
60
|
# Remove non-submitted V2 jobs from the app state when the list grows
|
|
62
61
|
# beyond a threshold
|
|
63
62
|
settings = Inject(get_settings)
|
|
@@ -47,7 +47,6 @@ async def collect_task_custom(
|
|
|
47
47
|
user: UserOAuth = Depends(current_active_verified_user),
|
|
48
48
|
db: AsyncSession = Depends(get_async_db),
|
|
49
49
|
) -> list[TaskReadV2]:
|
|
50
|
-
|
|
51
50
|
settings = Inject(get_settings)
|
|
52
51
|
|
|
53
52
|
# Validate query parameters related to user-group ownership
|
|
@@ -97,7 +96,6 @@ async def collect_task_custom(
|
|
|
97
96
|
)
|
|
98
97
|
|
|
99
98
|
if task_collect.package_root is None:
|
|
100
|
-
|
|
101
99
|
package_name_underscore = task_collect.package_name.replace("-", "_")
|
|
102
100
|
# Note that python_command is then used as part of a subprocess.run
|
|
103
101
|
# statement: be careful with mixing `'` and `"`.
|
|
@@ -89,7 +89,6 @@ async def collect_task_pixi(
|
|
|
89
89
|
user: UserOAuth = Depends(current_active_verified_user),
|
|
90
90
|
db: AsyncSession = Depends(get_async_db),
|
|
91
91
|
) -> TaskGroupActivityV2Read:
|
|
92
|
-
|
|
93
92
|
settings = Inject(get_settings)
|
|
94
93
|
# Check if Pixi is available
|
|
95
94
|
if settings.pixi is None:
|
{fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/api/v2/task_group.py
RENAMED
|
@@ -72,7 +72,6 @@ async def get_task_group_activity_list(
|
|
|
72
72
|
user: UserOAuth = Depends(current_active_user),
|
|
73
73
|
db: AsyncSession = Depends(get_async_db),
|
|
74
74
|
) -> list[TaskGroupActivityV2Read]:
|
|
75
|
-
|
|
76
75
|
stm = select(TaskGroupActivityV2).where(
|
|
77
76
|
TaskGroupActivityV2.user_id == user.id
|
|
78
77
|
)
|
|
@@ -105,7 +104,6 @@ async def get_task_group_activity(
|
|
|
105
104
|
user: UserOAuth = Depends(current_active_user),
|
|
106
105
|
db: AsyncSession = Depends(get_async_db),
|
|
107
106
|
) -> TaskGroupActivityV2Read:
|
|
108
|
-
|
|
109
107
|
activity = await db.get(TaskGroupActivityV2, task_group_activity_id)
|
|
110
108
|
|
|
111
109
|
if activity is None:
|
|
@@ -115,7 +115,6 @@ async def deactivate_task_group(
|
|
|
115
115
|
# Submit background task
|
|
116
116
|
settings = Inject(get_settings)
|
|
117
117
|
if settings.FRACTAL_RUNNER_BACKEND == "slurm_ssh":
|
|
118
|
-
|
|
119
118
|
# Validate user settings (backend-specific)
|
|
120
119
|
user_settings = await validate_user_settings(
|
|
121
120
|
user=user, backend=settings.FRACTAL_RUNNER_BACKEND, db=db
|
|
@@ -242,7 +241,6 @@ async def reactivate_task_group(
|
|
|
242
241
|
# Submit background task
|
|
243
242
|
settings = Inject(get_settings)
|
|
244
243
|
if settings.FRACTAL_RUNNER_BACKEND == "slurm_ssh":
|
|
245
|
-
|
|
246
244
|
# Validate user settings (backend-specific)
|
|
247
245
|
user_settings = await validate_user_settings(
|
|
248
246
|
user=user, backend=settings.FRACTAL_RUNNER_BACKEND, db=db
|
|
@@ -78,7 +78,6 @@ async def get_workflow_version_update_candidates(
|
|
|
78
78
|
user: UserOAuth = Depends(current_active_user),
|
|
79
79
|
db: AsyncSession = Depends(get_async_db),
|
|
80
80
|
) -> list[list[TaskVersionRead]]:
|
|
81
|
-
|
|
82
81
|
workflow = await _get_workflow_check_owner(
|
|
83
82
|
project_id=project_id,
|
|
84
83
|
workflow_id=workflow_id,
|
|
@@ -181,7 +180,6 @@ async def replace_workflowtask(
|
|
|
181
180
|
user: UserOAuth = Depends(current_active_user),
|
|
182
181
|
db: AsyncSession = Depends(get_async_db),
|
|
183
182
|
) -> WorkflowTaskReadV2:
|
|
184
|
-
|
|
185
183
|
# Get objects from database
|
|
186
184
|
workflow_task, workflow = await _get_workflow_task_check_owner(
|
|
187
185
|
project_id=project_id,
|
{fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/routes/api/v2/workflow.py
RENAMED
|
@@ -147,7 +147,6 @@ async def update_workflow(
|
|
|
147
147
|
|
|
148
148
|
for key, value in patch.model_dump(exclude_unset=True).items():
|
|
149
149
|
if key == "reordered_workflowtask_ids":
|
|
150
|
-
|
|
151
150
|
if await _workflow_has_submitted_job(
|
|
152
151
|
workflow_id=workflow_id, db=db
|
|
153
152
|
):
|
|
@@ -329,7 +328,6 @@ async def get_workflow_type_filters(
|
|
|
329
328
|
|
|
330
329
|
response_items = []
|
|
331
330
|
for wftask in workflow.task_list:
|
|
332
|
-
|
|
333
331
|
# Compute input_type_filters, based on wftask and task manifest
|
|
334
332
|
input_type_filters = merge_type_filters(
|
|
335
333
|
wftask_type_filters=wftask.type_filters,
|
|
@@ -39,7 +39,6 @@ async def get_list_user_groups(
|
|
|
39
39
|
user: UserOAuth = Depends(current_active_superuser),
|
|
40
40
|
db: AsyncSession = Depends(get_async_db),
|
|
41
41
|
) -> list[UserGroupRead]:
|
|
42
|
-
|
|
43
42
|
# Get all groups
|
|
44
43
|
stm_all_groups = select(UserGroup)
|
|
45
44
|
res = await db.execute(stm_all_groups)
|
|
@@ -88,7 +87,6 @@ async def create_single_group(
|
|
|
88
87
|
user: UserOAuth = Depends(current_active_superuser),
|
|
89
88
|
db: AsyncSession = Depends(get_async_db),
|
|
90
89
|
) -> UserGroupRead:
|
|
91
|
-
|
|
92
90
|
# Check that name is not already in use
|
|
93
91
|
existing_name_str = select(UserGroup).where(
|
|
94
92
|
UserGroup.name == group_create.name
|
|
@@ -121,7 +119,6 @@ async def update_single_group(
|
|
|
121
119
|
user: UserOAuth = Depends(current_active_superuser),
|
|
122
120
|
db: AsyncSession = Depends(get_async_db),
|
|
123
121
|
) -> UserGroupRead:
|
|
124
|
-
|
|
125
122
|
group = await _usergroup_or_404(group_id, db)
|
|
126
123
|
|
|
127
124
|
# Patch `viewer_paths`
|
|
@@ -143,7 +140,6 @@ async def delete_single_group(
|
|
|
143
140
|
user: UserOAuth = Depends(current_active_superuser),
|
|
144
141
|
db: AsyncSession = Depends(get_async_db),
|
|
145
142
|
) -> Response:
|
|
146
|
-
|
|
147
143
|
group = await _usergroup_or_404(group_id, db)
|
|
148
144
|
|
|
149
145
|
if group.name == FRACTAL_DEFAULT_GROUP_NAME:
|
|
@@ -219,7 +215,6 @@ async def remove_user_from_group(
|
|
|
219
215
|
superuser: UserOAuth = Depends(current_active_superuser),
|
|
220
216
|
db: AsyncSession = Depends(get_async_db),
|
|
221
217
|
) -> UserGroupRead:
|
|
222
|
-
|
|
223
218
|
# Check that user and group exist
|
|
224
219
|
await _usergroup_or_404(group_id, db)
|
|
225
220
|
user = await _user_or_404(user_id, db)
|
|
@@ -11,7 +11,6 @@ T = TypeVar("T")
|
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
class PaginationRequest(BaseModel):
|
|
14
|
-
|
|
15
14
|
page: int = Field(ge=1)
|
|
16
15
|
page_size: int | None = Field(ge=1)
|
|
17
16
|
|
|
@@ -38,7 +37,6 @@ def get_pagination_params(
|
|
|
38
37
|
|
|
39
38
|
|
|
40
39
|
class PaginationResponse(BaseModel, Generic[T]):
|
|
41
|
-
|
|
42
40
|
current_page: int = Field(ge=1)
|
|
43
41
|
page_size: int = Field(ge=0)
|
|
44
42
|
total_count: int = Field(ge=0)
|
{fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/executors/local/runner.py
RENAMED
|
@@ -28,7 +28,6 @@ def run_single_task(
|
|
|
28
28
|
parameters: dict[str, Any],
|
|
29
29
|
task_files: TaskFiles,
|
|
30
30
|
):
|
|
31
|
-
|
|
32
31
|
# Write args.json file
|
|
33
32
|
with open(task_files.args_file_local, "w") as f:
|
|
34
33
|
json.dump(parameters, f)
|
|
@@ -169,7 +168,6 @@ class LocalRunner(BaseRunner):
|
|
|
169
168
|
exceptions: dict[int, BaseException] = {}
|
|
170
169
|
|
|
171
170
|
try:
|
|
172
|
-
|
|
173
171
|
self.validate_multisubmit_parameters(
|
|
174
172
|
list_parameters=list_parameters,
|
|
175
173
|
task_type=task_type,
|
|
@@ -208,7 +206,6 @@ class LocalRunner(BaseRunner):
|
|
|
208
206
|
|
|
209
207
|
# Execute tasks, in chunks of size `parallel_tasks_per_job`
|
|
210
208
|
for ind_chunk in range(0, n_elements, parallel_tasks_per_job):
|
|
211
|
-
|
|
212
209
|
list_parameters_chunk = list_parameters[
|
|
213
210
|
ind_chunk : ind_chunk + parallel_tasks_per_job
|
|
214
211
|
]
|
{fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/v2/merge_outputs.py
RENAMED
|
@@ -3,7 +3,6 @@ from fractal_server.app.runner.v2.task_interface import TaskOutput
|
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
def merge_outputs(task_outputs: list[TaskOutput]) -> TaskOutput:
|
|
6
|
-
|
|
7
6
|
if len(task_outputs) == 0:
|
|
8
7
|
return TaskOutput()
|
|
9
8
|
|
|
@@ -11,7 +10,6 @@ def merge_outputs(task_outputs: list[TaskOutput]) -> TaskOutput:
|
|
|
11
10
|
final_image_list_removals = []
|
|
12
11
|
|
|
13
12
|
for task_output in task_outputs:
|
|
14
|
-
|
|
15
13
|
final_image_list_updates.extend(task_output.image_list_updates)
|
|
16
14
|
final_image_list_removals.extend(task_output.image_list_removals)
|
|
17
15
|
|
|
@@ -415,7 +415,6 @@ def execute_tasks_v2(
|
|
|
415
415
|
# Write current dataset images into the database.
|
|
416
416
|
db_dataset = db.get(DatasetV2, dataset.id)
|
|
417
417
|
if ENRICH_IMAGES_WITH_STATUS:
|
|
418
|
-
|
|
419
418
|
db_dataset.images = _remove_status_from_attributes(tmp_images)
|
|
420
419
|
else:
|
|
421
420
|
db_dataset.images = tmp_images
|
{fractal_server-2.15.3 → fractal_server-2.15.5}/fractal_server/app/runner/v2/task_interface.py
RENAMED
|
@@ -11,7 +11,6 @@ from fractal_server.types import ZarrUrlStr
|
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
class TaskOutput(BaseModel):
|
|
14
|
-
|
|
15
14
|
model_config = ConfigDict(extra="forbid")
|
|
16
15
|
|
|
17
16
|
image_list_updates: list[SingleImageTaskOutput] = Field(
|
|
@@ -40,7 +39,6 @@ class TaskOutput(BaseModel):
|
|
|
40
39
|
|
|
41
40
|
|
|
42
41
|
class InitArgsModel(BaseModel):
|
|
43
|
-
|
|
44
42
|
model_config = ConfigDict(extra="forbid")
|
|
45
43
|
|
|
46
44
|
zarr_url: ZarrUrlStr
|
|
@@ -48,14 +46,13 @@ class InitArgsModel(BaseModel):
|
|
|
48
46
|
|
|
49
47
|
|
|
50
48
|
class InitTaskOutput(BaseModel):
|
|
51
|
-
|
|
52
49
|
model_config = ConfigDict(extra="forbid")
|
|
53
50
|
|
|
54
51
|
parallelization_list: list[InitArgsModel] = Field(default_factory=list)
|
|
55
52
|
|
|
56
53
|
|
|
57
54
|
def _cast_and_validate_TaskOutput(
|
|
58
|
-
task_output: dict[str, Any]
|
|
55
|
+
task_output: dict[str, Any],
|
|
59
56
|
) -> TaskOutput | None:
|
|
60
57
|
try:
|
|
61
58
|
validated_task_output = TaskOutput(**task_output)
|
|
@@ -9,14 +9,12 @@ from fractal_server.types import NonEmptyStr
|
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
class ProjectCreateV2(BaseModel):
|
|
12
|
-
|
|
13
12
|
model_config = ConfigDict(extra="forbid")
|
|
14
13
|
|
|
15
14
|
name: NonEmptyStr
|
|
16
15
|
|
|
17
16
|
|
|
18
17
|
class ProjectReadV2(BaseModel):
|
|
19
|
-
|
|
20
18
|
id: int
|
|
21
19
|
name: str
|
|
22
20
|
timestamp_created: AwareDatetime
|
|
@@ -27,7 +25,6 @@ class ProjectReadV2(BaseModel):
|
|
|
27
25
|
|
|
28
26
|
|
|
29
27
|
class ProjectUpdateV2(BaseModel):
|
|
30
|
-
|
|
31
28
|
model_config = ConfigDict(extra="forbid")
|
|
32
29
|
|
|
33
30
|
name: NonEmptyStr = None
|
|
@@ -17,14 +17,12 @@ from fractal_server.types import NonEmptyStr
|
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
class WorkflowCreateV2(BaseModel):
|
|
20
|
-
|
|
21
20
|
model_config = ConfigDict(extra="forbid")
|
|
22
21
|
|
|
23
22
|
name: NonEmptyStr
|
|
24
23
|
|
|
25
24
|
|
|
26
25
|
class WorkflowReadV2(BaseModel):
|
|
27
|
-
|
|
28
26
|
id: int
|
|
29
27
|
name: str
|
|
30
28
|
project_id: int
|
|
@@ -42,7 +40,6 @@ class WorkflowReadV2WithWarnings(WorkflowReadV2):
|
|
|
42
40
|
|
|
43
41
|
|
|
44
42
|
class WorkflowUpdateV2(BaseModel):
|
|
45
|
-
|
|
46
43
|
model_config = ConfigDict(extra="forbid")
|
|
47
44
|
|
|
48
45
|
name: NonEmptyStr = None
|
|
@@ -95,10 +95,11 @@ class PixiSettings(BaseModel):
|
|
|
95
95
|
PIXI_CONCURRENT_SOLVES: int = 4
|
|
96
96
|
PIXI_CONCURRENT_DOWNLOADS: int = 4
|
|
97
97
|
TOKIO_WORKER_THREADS: int = 2
|
|
98
|
+
DEFAULT_ENVIRONMENT: str = "default"
|
|
99
|
+
DEFAULT_PLATFORM: str = "linux-64"
|
|
98
100
|
|
|
99
101
|
@model_validator(mode="after")
|
|
100
102
|
def check_pixi_settings(self):
|
|
101
|
-
|
|
102
103
|
if self.default_version not in self.versions:
|
|
103
104
|
raise ValueError(
|
|
104
105
|
f"Default version '{self.default_version}' not in "
|
|
@@ -108,7 +109,6 @@ class PixiSettings(BaseModel):
|
|
|
108
109
|
pixi_base_dir = Path(self.versions[self.default_version]).parent
|
|
109
110
|
|
|
110
111
|
for key, value in self.versions.items():
|
|
111
|
-
|
|
112
112
|
pixi_path = Path(value)
|
|
113
113
|
|
|
114
114
|
if pixi_path.parent != pixi_base_dir:
|
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
from pathlib import Path
|
|
2
2
|
|
|
3
|
+
from ..utils_pixi import simplify_pyproject_toml
|
|
3
4
|
from fractal_server.app.schemas.v2 import TaskCreateV2
|
|
5
|
+
from fractal_server.config import get_settings
|
|
4
6
|
from fractal_server.logger import get_logger
|
|
7
|
+
from fractal_server.logger import set_logger
|
|
8
|
+
from fractal_server.syringe import Inject
|
|
5
9
|
from fractal_server.tasks.v2.utils_templates import customize_template
|
|
6
10
|
from fractal_server.utils import execute_command_sync
|
|
7
11
|
|
|
8
12
|
|
|
13
|
+
logger = set_logger(__name__)
|
|
14
|
+
|
|
15
|
+
|
|
9
16
|
def _customize_and_run_template(
|
|
10
17
|
template_filename: str,
|
|
11
18
|
replacements: list[tuple[str, str]],
|
|
@@ -69,3 +76,28 @@ def check_task_files_exist(task_list: list[TaskCreateV2]) -> None:
|
|
|
69
76
|
f"Task `{_task.name}` has `command_parallel` "
|
|
70
77
|
f"pointing to missing file `{_task_path}`."
|
|
71
78
|
)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def edit_pyproject_toml_in_place_local(pyproject_toml_path: Path) -> None:
|
|
82
|
+
"""
|
|
83
|
+
Wrapper of `simplify_pyproject_toml`, with I/O.
|
|
84
|
+
"""
|
|
85
|
+
|
|
86
|
+
# Read `pyproject.toml`
|
|
87
|
+
with pyproject_toml_path.open() as f:
|
|
88
|
+
pyproject_contents = f.read()
|
|
89
|
+
|
|
90
|
+
# Simplify contents
|
|
91
|
+
settings = Inject(get_settings)
|
|
92
|
+
new_pyproject_contents = simplify_pyproject_toml(
|
|
93
|
+
original_toml_string=pyproject_contents,
|
|
94
|
+
pixi_environment=settings.pixi.DEFAULT_ENVIRONMENT,
|
|
95
|
+
pixi_platform=settings.pixi.DEFAULT_PLATFORM,
|
|
96
|
+
)
|
|
97
|
+
# Write new `pyproject.toml`
|
|
98
|
+
with pyproject_toml_path.open("w") as f:
|
|
99
|
+
f.write(new_pyproject_contents)
|
|
100
|
+
logger.debug(
|
|
101
|
+
f"Replaced local {pyproject_toml_path.as_posix()} "
|
|
102
|
+
"with simplified version."
|
|
103
|
+
)
|