fractal-server 2.14.0a13__tar.gz → 2.14.0a15__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.14.0a13 → fractal_server-2.14.0a15}/PKG-INFO +1 -1
- fractal_server-2.14.0a15/fractal_server/__init__.py +1 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/models/linkusergroup.py +6 -2
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/models/v2/dataset.py +1 -1
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/models/v2/job.py +7 -3
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/models/v2/task_group.py +2 -2
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/models/v2/workflow.py +1 -1
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/models/v2/workflowtask.py +1 -1
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/admin/v2/task_group.py +0 -17
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/api/v2/_aux_functions_history.py +8 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/api/v2/dataset.py +0 -8
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/api/v2/history.py +111 -27
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/api/v2/images.py +16 -14
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/api/v2/project.py +0 -52
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/api/v2/task_group.py +0 -17
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/api/v2/workflow.py +0 -8
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/auth/group.py +0 -16
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/executors/base_runner.py +5 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/executors/local/runner.py +15 -7
- fractal_server-2.14.0a15/fractal_server/app/runner/executors/slurm_common/_handle_exception_proxy.py +17 -0
- fractal_server-2.14.0a13/fractal_server/app/runner/executors/slurm_sudo/runner.py → fractal_server-2.14.0a15/fractal_server/app/runner/executors/slurm_common/base_slurm_runner.py +287 -393
- fractal_server-2.14.0a15/fractal_server/app/runner/executors/slurm_common/slurm_job_task_models.py +102 -0
- fractal_server-2.14.0a15/fractal_server/app/runner/executors/slurm_ssh/runner.py +169 -0
- fractal_server-2.14.0a15/fractal_server/app/runner/executors/slurm_sudo/runner.py +154 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/task_files.py +20 -6
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/v2/_slurm_ssh.py +6 -6
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/v2/_slurm_sudo.py +4 -4
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/v2/runner.py +4 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/v2/runner_functions.py +2 -2
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/v2/submit_workflow.py +7 -16
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/schemas/v2/__init__.py +3 -1
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/schemas/v2/history.py +27 -2
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/config.py +6 -2
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/images/tools.py +23 -0
- fractal_server-2.14.0a15/fractal_server/migrations/versions/5b6007027595_on_cascade.py +250 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/migrations/versions/fbce16ff4e47_new_history_items.py +2 -2
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/tasks/v2/utils_background.py +0 -19
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/pyproject.toml +2 -2
- fractal_server-2.14.0a13/fractal_server/__init__.py +0 -1
- fractal_server-2.14.0a13/fractal_server/app/runner/executors/slurm_common/_check_jobs_status.py +0 -77
- fractal_server-2.14.0a13/fractal_server/app/runner/executors/slurm_ssh/_check_job_status_ssh.py +0 -67
- fractal_server-2.14.0a13/fractal_server/app/runner/executors/slurm_ssh/_executor_wait_thread.py +0 -126
- fractal_server-2.14.0a13/fractal_server/app/runner/executors/slurm_ssh/_slurm_job.py +0 -116
- fractal_server-2.14.0a13/fractal_server/app/runner/executors/slurm_ssh/executor.py +0 -1386
- fractal_server-2.14.0a13/fractal_server/app/runner/executors/slurm_ssh/runner.py +0 -707
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/LICENSE +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/README.md +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/__main__.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/alembic.ini +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/__init__.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/db/__init__.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/history/__init__.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/models/__init__.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/models/linkuserproject.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/models/security.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/models/user_settings.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/models/v2/__init__.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/models/v2/accounting.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/models/v2/history.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/models/v2/project.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/models/v2/task.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/__init__.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/admin/__init__.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/admin/v2/__init__.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/admin/v2/accounting.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/admin/v2/impersonate.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/admin/v2/job.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/admin/v2/project.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/admin/v2/task.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/admin/v2/task_group_lifecycle.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/api/__init__.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/api/v2/__init__.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/api/v2/_aux_functions.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/api/v2/_aux_functions_task_lifecycle.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/api/v2/_aux_functions_tasks.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/api/v2/job.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/api/v2/status_legacy.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/api/v2/submit.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/api/v2/task.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/api/v2/task_collection.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/api/v2/task_collection_custom.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/api/v2/task_group_lifecycle.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/api/v2/verify_image_types.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/api/v2/workflow_import.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/api/v2/workflowtask.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/auth/__init__.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/auth/_aux_auth.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/auth/current_user.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/auth/login.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/auth/oauth.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/auth/register.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/auth/router.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/auth/users.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/aux/__init__.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/aux/_job.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/aux/_runner.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/aux/validate_user_settings.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/pagination.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/__init__.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/components.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/compress_folder.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/exceptions.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/executors/__init__.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/executors/local/__init__.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/executors/local/get_local_config.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/executors/slurm_common/__init__.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/executors/slurm_common/_batching.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/executors/slurm_common/_job_states.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/executors/slurm_common/_slurm_config.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/executors/slurm_common/get_slurm_config.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/executors/slurm_common/remote.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/executors/slurm_common/utils_executors.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/executors/slurm_ssh/__init__.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/executors/slurm_sudo/__init__.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/executors/slurm_sudo/_subprocess_run_as_user.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/extract_archive.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/filenames.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/run_subprocess.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/set_start_and_last_task_index.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/shutdown.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/v2/__init__.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/v2/_local.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/v2/db_tools.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/v2/deduplicate_list.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/v2/merge_outputs.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/v2/runner_functions_low_level.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/v2/task_interface.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/runner/versions.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/schemas/__init__.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/schemas/_filter_validators.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/schemas/_validators.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/schemas/user.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/schemas/user_group.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/schemas/user_settings.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/schemas/v2/accounting.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/schemas/v2/dataset.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/schemas/v2/dumps.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/schemas/v2/job.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/schemas/v2/manifest.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/schemas/v2/project.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/schemas/v2/status_legacy.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/schemas/v2/task.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/schemas/v2/task_collection.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/schemas/v2/task_group.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/schemas/v2/workflow.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/schemas/v2/workflowtask.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/security/__init__.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/security/signup_email.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/user_settings.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/data_migrations/README.md +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/data_migrations/tools.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/gunicorn_fractal.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/images/__init__.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/images/models.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/logger.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/main.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/migrations/env.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/migrations/naming_convention.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/migrations/versions/034a469ec2eb_task_groups.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/migrations/versions/091b01f51f88_add_usergroup_and_linkusergroup_table.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/migrations/versions/19eca0dd47a9_user_settings_project_dir.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/migrations/versions/1eac13a26c83_drop_v1_tables.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/migrations/versions/316140ff7ee1_remove_usersettings_cache_dir.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/migrations/versions/47351f8c7ebc_drop_dataset_filters.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/migrations/versions/4c308bcaea2b_add_task_args_schema_and_task_args_.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/migrations/versions/4cedeb448a53_workflowtask_foreign_keys_not_nullables.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/migrations/versions/501961cfcd85_remove_link_between_v1_and_v2_tasks_.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/migrations/versions/50a13d6138fd_initial_schema.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/migrations/versions/5bf02391cfef_v2.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/migrations/versions/70e77f1c38b0_add_applyworkflow_first_task_index_and_.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/migrations/versions/71eefd1dd202_add_slurm_accounts.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/migrations/versions/84bf0fffde30_add_dumps_to_applyworkflow.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/migrations/versions/8e8f227a3e36_update_taskv2_post_2_7_0.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/migrations/versions/8f79bd162e35_add_docs_info_and_docs_link_to_task_.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/migrations/versions/94a47ea2d3ff_remove_cache_dir_slurm_user_and_slurm_.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/migrations/versions/97f444d47249_add_applyworkflow_project_dump.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/migrations/versions/99ea79d9e5d2_add_dataset_history.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/migrations/versions/9c5ae74c9b98_add_user_settings_table.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/migrations/versions/9fd26a2b0de4_add_workflow_timestamp_created.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/migrations/versions/a7f4d6137b53_add_workflow_dump_to_applyworkflow.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/migrations/versions/af1ef1c83c9b_add_accounting_tables.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/migrations/versions/af8673379a5c_drop_old_filter_columns.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/migrations/versions/d256a7379ab8_taskgroup_activity_and_venv_info_to_.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/migrations/versions/d4fe3708d309_make_applyworkflow_workflow_dump_non_.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/migrations/versions/da2cb2ac4255_user_group_viewer_paths.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/migrations/versions/db09233ad13a_split_filters_and_keep_old_columns.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/migrations/versions/e75cac726012_make_applyworkflow_start_timestamp_not_.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/migrations/versions/e81103413827_add_job_type_filters.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/migrations/versions/efa89c30e0a4_add_project_timestamp_created.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/migrations/versions/f384e1c0cf5d_drop_task_default_args_columns.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/py.typed +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/ssh/__init__.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/ssh/_fabric.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/string_tools.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/syringe.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/tasks/__init__.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/tasks/utils.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/tasks/v2/__init__.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/tasks/v2/local/__init__.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/tasks/v2/local/_utils.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/tasks/v2/local/collect.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/tasks/v2/local/deactivate.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/tasks/v2/local/reactivate.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/tasks/v2/ssh/__init__.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/tasks/v2/ssh/_utils.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/tasks/v2/ssh/collect.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/tasks/v2/ssh/deactivate.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/tasks/v2/ssh/reactivate.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/tasks/v2/templates/1_create_venv.sh +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/tasks/v2/templates/2_pip_install.sh +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/tasks/v2/templates/3_pip_freeze.sh +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/tasks/v2/templates/4_pip_show.sh +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/tasks/v2/templates/5_get_venv_size_and_file_number.sh +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/tasks/v2/templates/6_pip_install_from_freeze.sh +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/tasks/v2/utils_database.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/tasks/v2/utils_package_names.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/tasks/v2/utils_python_interpreter.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/tasks/v2/utils_templates.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/urls.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/utils.py +0 -0
- {fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/zip_tools.py +0 -0
@@ -0,0 +1 @@
|
|
1
|
+
__VERSION__ = "2.14.0a15"
|
{fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/models/linkusergroup.py
RENAMED
@@ -13,8 +13,12 @@ class LinkUserGroup(SQLModel, table=True):
|
|
13
13
|
Crossing table between User and UserGroup
|
14
14
|
"""
|
15
15
|
|
16
|
-
group_id: int = Field(
|
17
|
-
|
16
|
+
group_id: int = Field(
|
17
|
+
foreign_key="usergroup.id", primary_key=True, ondelete="CASCADE"
|
18
|
+
)
|
19
|
+
user_id: int = Field(
|
20
|
+
foreign_key="user_oauth.id", primary_key=True, ondelete="CASCADE"
|
21
|
+
)
|
18
22
|
|
19
23
|
timestamp_created: datetime = Field(
|
20
24
|
default_factory=get_timestamp,
|
{fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/models/v2/dataset.py
RENAMED
@@ -19,7 +19,7 @@ class DatasetV2(SQLModel, table=True):
|
|
19
19
|
id: Optional[int] = Field(default=None, primary_key=True)
|
20
20
|
name: str
|
21
21
|
|
22
|
-
project_id: int = Field(foreign_key="projectv2.id")
|
22
|
+
project_id: int = Field(foreign_key="projectv2.id", ondelete="CASCADE")
|
23
23
|
project: "ProjectV2" = Relationship( # noqa: F821
|
24
24
|
sa_relationship_kwargs=dict(lazy="selectin"),
|
25
25
|
)
|
@@ -18,11 +18,15 @@ class JobV2(SQLModel, table=True):
|
|
18
18
|
model_config = ConfigDict(arbitrary_types_allowed=True)
|
19
19
|
|
20
20
|
id: Optional[int] = Field(default=None, primary_key=True)
|
21
|
-
project_id: Optional[int] = Field(
|
21
|
+
project_id: Optional[int] = Field(
|
22
|
+
foreign_key="projectv2.id", default=None, ondelete="SET NULL"
|
23
|
+
)
|
22
24
|
workflow_id: Optional[int] = Field(
|
23
|
-
foreign_key="workflowv2.id", default=None
|
25
|
+
foreign_key="workflowv2.id", default=None, ondelete="SET NULL"
|
26
|
+
)
|
27
|
+
dataset_id: Optional[int] = Field(
|
28
|
+
foreign_key="datasetv2.id", default=None, ondelete="SET NULL"
|
24
29
|
)
|
25
|
-
dataset_id: Optional[int] = Field(foreign_key="datasetv2.id", default=None)
|
26
30
|
|
27
31
|
user_email: str = Field(nullable=False)
|
28
32
|
slurm_account: Optional[str] = None
|
{fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/models/v2/task_group.py
RENAMED
@@ -23,7 +23,7 @@ class TaskGroupV2(SQLModel, table=True):
|
|
23
23
|
|
24
24
|
user_id: int = Field(foreign_key="user_oauth.id")
|
25
25
|
user_group_id: Optional[int] = Field(
|
26
|
-
foreign_key="usergroup.id", default=None
|
26
|
+
foreign_key="usergroup.id", default=None, ondelete="SET NULL"
|
27
27
|
)
|
28
28
|
|
29
29
|
origin: str
|
@@ -100,7 +100,7 @@ class TaskGroupActivityV2(SQLModel, table=True):
|
|
100
100
|
id: Optional[int] = Field(default=None, primary_key=True)
|
101
101
|
user_id: int = Field(foreign_key="user_oauth.id")
|
102
102
|
taskgroupv2_id: Optional[int] = Field(
|
103
|
-
default=None, foreign_key="taskgroupv2.id"
|
103
|
+
default=None, foreign_key="taskgroupv2.id", ondelete="SET NULL"
|
104
104
|
)
|
105
105
|
timestamp_started: datetime = Field(
|
106
106
|
default_factory=get_timestamp,
|
{fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/models/v2/workflow.py
RENAMED
@@ -16,7 +16,7 @@ class WorkflowV2(SQLModel, table=True):
|
|
16
16
|
|
17
17
|
id: Optional[int] = Field(default=None, primary_key=True)
|
18
18
|
name: str
|
19
|
-
project_id: int = Field(foreign_key="projectv2.id")
|
19
|
+
project_id: int = Field(foreign_key="projectv2.id", ondelete="CASCADE")
|
20
20
|
project: "ProjectV2" = Relationship( # noqa: F821
|
21
21
|
sa_relationship_kwargs=dict(lazy="selectin"),
|
22
22
|
)
|
{fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/models/v2/workflowtask.py
RENAMED
@@ -16,7 +16,7 @@ class WorkflowTaskV2(SQLModel, table=True):
|
|
16
16
|
|
17
17
|
id: Optional[int] = Field(default=None, primary_key=True)
|
18
18
|
|
19
|
-
workflow_id: int = Field(foreign_key="workflowv2.id")
|
19
|
+
workflow_id: int = Field(foreign_key="workflowv2.id", ondelete="CASCADE")
|
20
20
|
order: Optional[int] = None
|
21
21
|
meta_parallel: Optional[dict[str, Any]] = Field(
|
22
22
|
sa_column=Column(JSON), default=None
|
@@ -192,23 +192,6 @@ async def delete_task_group(
|
|
192
192
|
detail=f"TaskV2 {workflow_tasks[0].task_id} is still in use",
|
193
193
|
)
|
194
194
|
|
195
|
-
# Cascade operations: set foreign-keys to null for TaskGroupActivityV2
|
196
|
-
# which are in relationship with the current TaskGroupV2
|
197
|
-
logger.debug("Start of cascade operations on TaskGroupActivityV2.")
|
198
|
-
stm = select(TaskGroupActivityV2).where(
|
199
|
-
TaskGroupActivityV2.taskgroupv2_id == task_group_id
|
200
|
-
)
|
201
|
-
res = await db.execute(stm)
|
202
|
-
task_group_activity_list = res.scalars().all()
|
203
|
-
for task_group_activity in task_group_activity_list:
|
204
|
-
logger.debug(
|
205
|
-
f"Setting TaskGroupActivityV2[{task_group_activity.id}]"
|
206
|
-
".taskgroupv2_id to None."
|
207
|
-
)
|
208
|
-
task_group_activity.taskgroupv2_id = None
|
209
|
-
db.add(task_group_activity)
|
210
|
-
logger.debug("End of cascade operations on TaskGroupActivityV2.")
|
211
|
-
|
212
195
|
await db.delete(task_group)
|
213
196
|
await db.commit()
|
214
197
|
|
@@ -20,6 +20,10 @@ from fractal_server.app.routes.api.v2._aux_functions import (
|
|
20
20
|
from fractal_server.app.routes.api.v2._aux_functions import (
|
21
21
|
_get_workflowtask_or_404,
|
22
22
|
)
|
23
|
+
from fractal_server.logger import set_logger
|
24
|
+
|
25
|
+
|
26
|
+
logger = set_logger(__name__)
|
23
27
|
|
24
28
|
|
25
29
|
async def get_history_unit_or_404(
|
@@ -67,6 +71,10 @@ def read_log_file(
|
|
67
71
|
dataset_id: int,
|
68
72
|
):
|
69
73
|
if logfile is None or not Path(logfile).exists():
|
74
|
+
logger.debug(
|
75
|
+
f"Logs for task '{wftask.task.name}' in dataset "
|
76
|
+
f"{dataset_id} are not available ({logfile=})."
|
77
|
+
)
|
70
78
|
return (
|
71
79
|
f"Logs for task '{wftask.task.name}' in dataset "
|
72
80
|
f"{dataset_id} are not available."
|
{fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/api/v2/dataset.py
RENAMED
@@ -212,14 +212,6 @@ async def delete_dataset(
|
|
212
212
|
),
|
213
213
|
)
|
214
214
|
|
215
|
-
# Cascade operations: set foreign-keys to null for jobs which are in
|
216
|
-
# relationship with the current dataset
|
217
|
-
stm = select(JobV2).where(JobV2.dataset_id == dataset_id)
|
218
|
-
res = await db.execute(stm)
|
219
|
-
jobs = res.scalars().all()
|
220
|
-
for job in jobs:
|
221
|
-
job.dataset_id = None
|
222
|
-
|
223
215
|
# Delete dataset
|
224
216
|
await db.delete(dataset)
|
225
217
|
await db.commit()
|
{fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/api/v2/history.py
RENAMED
@@ -1,3 +1,4 @@
|
|
1
|
+
from typing import Any
|
1
2
|
from typing import Optional
|
2
3
|
|
3
4
|
from fastapi import APIRouter
|
@@ -15,6 +16,7 @@ from ._aux_functions_history import get_history_run_or_404
|
|
15
16
|
from ._aux_functions_history import get_history_unit_or_404
|
16
17
|
from ._aux_functions_history import get_wftask_check_owner
|
17
18
|
from ._aux_functions_history import read_log_file
|
19
|
+
from .images import ImageQuery
|
18
20
|
from fractal_server.app.db import AsyncSession
|
19
21
|
from fractal_server.app.db import get_async_db
|
20
22
|
from fractal_server.app.models import UserOAuth
|
@@ -25,15 +27,26 @@ from fractal_server.app.routes.auth import current_active_user
|
|
25
27
|
from fractal_server.app.routes.pagination import get_pagination_params
|
26
28
|
from fractal_server.app.routes.pagination import PaginationRequest
|
27
29
|
from fractal_server.app.routes.pagination import PaginationResponse
|
30
|
+
from fractal_server.app.schemas.v2 import HistoryRunRead
|
28
31
|
from fractal_server.app.schemas.v2 import HistoryRunReadAggregated
|
29
32
|
from fractal_server.app.schemas.v2 import HistoryUnitRead
|
30
33
|
from fractal_server.app.schemas.v2 import HistoryUnitStatus
|
34
|
+
from fractal_server.app.schemas.v2 import HistoryUnitStatusQuery
|
31
35
|
from fractal_server.app.schemas.v2 import ImageLogsRequest
|
32
|
-
from fractal_server.app.schemas.v2 import
|
36
|
+
from fractal_server.app.schemas.v2 import SingleImageWithStatus
|
37
|
+
from fractal_server.images.tools import aggregate_attributes
|
38
|
+
from fractal_server.images.tools import aggregate_types
|
33
39
|
from fractal_server.images.tools import filter_image_list
|
34
40
|
from fractal_server.images.tools import merge_type_filters
|
35
41
|
from fractal_server.logger import set_logger
|
36
42
|
|
43
|
+
|
44
|
+
class ImageWithStatusPage(PaginationResponse[SingleImageWithStatus]):
|
45
|
+
|
46
|
+
attributes: dict[str, list[Any]]
|
47
|
+
types: list[str]
|
48
|
+
|
49
|
+
|
37
50
|
router = APIRouter()
|
38
51
|
logger = set_logger(__name__)
|
39
52
|
|
@@ -70,8 +83,11 @@ async def get_workflow_tasks_statuses(
|
|
70
83
|
.order_by(HistoryRun.timestamp_started.desc())
|
71
84
|
.limit(1)
|
72
85
|
)
|
73
|
-
latest_history_run = res.
|
74
|
-
if
|
86
|
+
latest_history_run = res.scalar_one_or_none()
|
87
|
+
if latest_history_run is None:
|
88
|
+
logger.debug(
|
89
|
+
f"No HistoryRun found for {dataset_id=} and {wftask.id=}."
|
90
|
+
)
|
75
91
|
response[wftask.id] = None
|
76
92
|
continue
|
77
93
|
response[wftask.id] = dict(
|
@@ -213,15 +229,17 @@ async def get_history_run_units(
|
|
213
229
|
)
|
214
230
|
|
215
231
|
|
216
|
-
@router.
|
232
|
+
@router.post("/project/{project_id}/status/images/")
|
217
233
|
async def get_history_images(
|
218
234
|
project_id: int,
|
219
235
|
dataset_id: int,
|
220
236
|
workflowtask_id: int,
|
237
|
+
request_body: ImageQuery,
|
238
|
+
unit_status: Optional[HistoryUnitStatusQuery] = None,
|
221
239
|
user: UserOAuth = Depends(current_active_user),
|
222
240
|
db: AsyncSession = Depends(get_async_db),
|
223
241
|
pagination: PaginationRequest = Depends(get_pagination_params),
|
224
|
-
) ->
|
242
|
+
) -> ImageWithStatusPage:
|
225
243
|
|
226
244
|
# Access control and object retrieval
|
227
245
|
wftask = await get_wftask_check_owner(
|
@@ -264,10 +282,15 @@ async def get_history_images(
|
|
264
282
|
actual_filters.update(type_filters_patch)
|
265
283
|
logger.debug(f"{prefix} {actual_filters=}")
|
266
284
|
# (1D) Get all matching images from the dataset
|
267
|
-
|
285
|
+
pre_filtered_dataset_images = filter_image_list(
|
268
286
|
images=dataset.images,
|
269
287
|
type_filters=inferred_dataset_type_filters,
|
270
288
|
)
|
289
|
+
filtered_dataset_images = filter_image_list(
|
290
|
+
pre_filtered_dataset_images,
|
291
|
+
type_filters=request_body.type_filters,
|
292
|
+
attribute_filters=request_body.attribute_filters,
|
293
|
+
)
|
271
294
|
logger.debug(f"{prefix} {len(dataset.images)=}")
|
272
295
|
logger.debug(f"{prefix} {len(filtered_dataset_images)=}")
|
273
296
|
# (1E) Extract the list of URLs for filtered images
|
@@ -276,52 +299,84 @@ async def get_history_images(
|
|
276
299
|
)
|
277
300
|
|
278
301
|
# (2) Get `(zarr_url, status)` pairs for all images that have already
|
279
|
-
# been processed
|
280
|
-
|
302
|
+
# been processed, and
|
303
|
+
# (3) When relevant, find images that have not been processed
|
304
|
+
base_stmt = (
|
281
305
|
select(HistoryImageCache.zarr_url, HistoryUnit.status)
|
282
306
|
.join(HistoryUnit)
|
283
307
|
.where(HistoryImageCache.dataset_id == dataset_id)
|
284
308
|
.where(HistoryImageCache.workflowtask_id == workflowtask_id)
|
285
309
|
.where(HistoryImageCache.latest_history_unit_id == HistoryUnit.id)
|
286
310
|
.where(HistoryImageCache.zarr_url.in_(filtered_dataset_images_url))
|
287
|
-
.order_by(HistoryImageCache.zarr_url)
|
288
311
|
)
|
289
|
-
|
312
|
+
|
313
|
+
if unit_status in [HistoryUnitStatusQuery.UNSET, None]:
|
314
|
+
stmt = base_stmt.order_by(HistoryImageCache.zarr_url)
|
315
|
+
res = await db.execute(stmt)
|
316
|
+
list_processed_url_status = res.all()
|
317
|
+
list_processed_url = list(
|
318
|
+
item[0] for item in list_processed_url_status
|
319
|
+
)
|
320
|
+
list_non_processed_url_status = list(
|
321
|
+
(url, None)
|
322
|
+
for url in filtered_dataset_images_url
|
323
|
+
if url not in list_processed_url
|
324
|
+
)
|
325
|
+
if unit_status == HistoryUnitStatusQuery.UNSET:
|
326
|
+
list_processed_url_status = []
|
327
|
+
else:
|
328
|
+
stmt = base_stmt.where(HistoryUnit.status == unit_status).order_by(
|
329
|
+
HistoryImageCache.zarr_url
|
330
|
+
)
|
331
|
+
res = await db.execute(stmt)
|
332
|
+
list_processed_url_status = res.all()
|
333
|
+
list_non_processed_url_status = []
|
334
|
+
|
290
335
|
logger.debug(f"{prefix} {len(list_processed_url_status)=}")
|
336
|
+
logger.debug(f"{prefix} {len(list_non_processed_url_status)=}")
|
291
337
|
|
292
338
|
# (3) Combine outputs from 1 and 2
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
list_non_processed_url_status = list(
|
297
|
-
(url, None)
|
298
|
-
for url in filtered_dataset_images_url
|
299
|
-
if url not in list_processed_url
|
339
|
+
full_list_url_status = (
|
340
|
+
list_processed_url_status + list_non_processed_url_status
|
300
341
|
)
|
301
|
-
logger.debug(f"{prefix} {len(
|
342
|
+
logger.debug(f"{prefix} {len(full_list_url_status)=}")
|
343
|
+
|
344
|
+
attributes = aggregate_attributes(pre_filtered_dataset_images)
|
345
|
+
types = aggregate_types(pre_filtered_dataset_images)
|
302
346
|
|
303
347
|
sorted_list_url_status = sorted(
|
304
|
-
|
348
|
+
full_list_url_status,
|
305
349
|
key=lambda url_status: url_status[0],
|
306
350
|
)
|
307
351
|
logger.debug(f"{prefix} {len(sorted_list_url_status)=}")
|
308
352
|
|
309
353
|
# Final list of objects
|
310
|
-
sorted_list_objects = list(
|
311
|
-
dict(zarr_url=url_status[0], status=url_status[1])
|
312
|
-
for url_status in sorted_list_url_status
|
313
|
-
)
|
314
354
|
|
315
|
-
total_count = len(
|
355
|
+
total_count = len(sorted_list_url_status)
|
316
356
|
page_size = pagination.page_size or total_count
|
317
357
|
|
358
|
+
paginated_list_url_status = sorted_list_url_status[
|
359
|
+
(pagination.page - 1) * page_size : pagination.page * page_size
|
360
|
+
]
|
361
|
+
|
362
|
+
# Aggregate information to create 'SingleImageWithStatus'
|
363
|
+
items = [
|
364
|
+
{
|
365
|
+
**filtered_dataset_images[
|
366
|
+
filtered_dataset_images_url.index(url_status[0])
|
367
|
+
],
|
368
|
+
"status": url_status[1],
|
369
|
+
}
|
370
|
+
for url_status in paginated_list_url_status
|
371
|
+
]
|
372
|
+
|
318
373
|
return dict(
|
319
374
|
current_page=pagination.page,
|
320
375
|
page_size=page_size,
|
321
376
|
total_count=total_count,
|
322
|
-
items=
|
323
|
-
|
324
|
-
|
377
|
+
items=items,
|
378
|
+
attributes=attributes,
|
379
|
+
types=types,
|
325
380
|
)
|
326
381
|
|
327
382
|
|
@@ -402,3 +457,32 @@ async def get_history_unit_log(
|
|
402
457
|
dataset_id=dataset_id,
|
403
458
|
)
|
404
459
|
return JSONResponse(content=log)
|
460
|
+
|
461
|
+
|
462
|
+
@router.get("/project/{project_id}/dataset/{dataset_id}/history/")
|
463
|
+
async def get_dataset_history(
|
464
|
+
project_id: int,
|
465
|
+
dataset_id: int,
|
466
|
+
user: UserOAuth = Depends(current_active_user),
|
467
|
+
db: AsyncSession = Depends(get_async_db),
|
468
|
+
) -> list[HistoryRunRead]:
|
469
|
+
"""
|
470
|
+
Returns a list of all HistoryRuns associated to a given dataset, sorted by
|
471
|
+
timestamp.
|
472
|
+
"""
|
473
|
+
# Access control
|
474
|
+
await _get_dataset_check_owner(
|
475
|
+
project_id=project_id,
|
476
|
+
dataset_id=dataset_id,
|
477
|
+
user_id=user.id,
|
478
|
+
db=db,
|
479
|
+
)
|
480
|
+
|
481
|
+
res = await db.execute(
|
482
|
+
select(HistoryRun)
|
483
|
+
.where(HistoryRun.dataset_id == dataset_id)
|
484
|
+
.order_by(HistoryRun.timestamp_started)
|
485
|
+
)
|
486
|
+
history_run_list = res.scalars().all()
|
487
|
+
|
488
|
+
return history_run_list
|
{fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/api/v2/images.py
RENAMED
@@ -11,10 +11,12 @@ from pydantic import Field
|
|
11
11
|
from pydantic import field_validator
|
12
12
|
from pydantic import model_validator
|
13
13
|
from sqlalchemy.orm.attributes import flag_modified
|
14
|
+
from sqlmodel import delete
|
14
15
|
|
15
16
|
from ._aux_functions import _get_dataset_check_owner
|
16
17
|
from fractal_server.app.db import AsyncSession
|
17
18
|
from fractal_server.app.db import get_async_db
|
19
|
+
from fractal_server.app.models import HistoryImageCache
|
18
20
|
from fractal_server.app.models import UserOAuth
|
19
21
|
from fractal_server.app.routes.auth import current_active_user
|
20
22
|
from fractal_server.app.routes.pagination import get_pagination_params
|
@@ -28,6 +30,8 @@ from fractal_server.app.schemas._validators import root_validate_dict_keys
|
|
28
30
|
from fractal_server.images import SingleImage
|
29
31
|
from fractal_server.images import SingleImageUpdate
|
30
32
|
from fractal_server.images.models import AttributeFiltersType
|
33
|
+
from fractal_server.images.tools import aggregate_attributes
|
34
|
+
from fractal_server.images.tools import aggregate_types
|
31
35
|
from fractal_server.images.tools import find_image_by_zarr_url
|
32
36
|
from fractal_server.images.tools import match_filter
|
33
37
|
|
@@ -133,16 +137,8 @@ async def query_dataset_images(
|
|
133
137
|
dataset = output["dataset"]
|
134
138
|
images = dataset.images
|
135
139
|
|
136
|
-
attributes =
|
137
|
-
|
138
|
-
for k, v in image["attributes"].items():
|
139
|
-
attributes.setdefault(k, []).append(v)
|
140
|
-
for k, v in attributes.items():
|
141
|
-
attributes[k] = list(set(v))
|
142
|
-
|
143
|
-
types = list(
|
144
|
-
set(type for image in images for type in image["types"].keys())
|
145
|
-
)
|
140
|
+
attributes = aggregate_attributes(images)
|
141
|
+
types = aggregate_types(images)
|
146
142
|
|
147
143
|
if query is not None:
|
148
144
|
|
@@ -210,10 +206,10 @@ async def delete_dataset_images(
|
|
210
206
|
)
|
211
207
|
dataset = output["dataset"]
|
212
208
|
|
213
|
-
image_to_remove =
|
214
|
-
|
215
|
-
None,
|
209
|
+
image_to_remove = find_image_by_zarr_url(
|
210
|
+
images=dataset.images, zarr_url=zarr_url
|
216
211
|
)
|
212
|
+
|
217
213
|
if image_to_remove is None:
|
218
214
|
raise HTTPException(
|
219
215
|
status_code=status.HTTP_404_NOT_FOUND,
|
@@ -223,9 +219,15 @@ async def delete_dataset_images(
|
|
223
219
|
),
|
224
220
|
)
|
225
221
|
|
226
|
-
dataset.images.remove(image_to_remove)
|
222
|
+
dataset.images.remove(image_to_remove["image"])
|
227
223
|
flag_modified(dataset, "images")
|
228
224
|
|
225
|
+
await db.execute(
|
226
|
+
delete(HistoryImageCache)
|
227
|
+
.where(HistoryImageCache.dataset_id == dataset_id)
|
228
|
+
.where(HistoryImageCache.zarr_url == zarr_url)
|
229
|
+
)
|
230
|
+
|
229
231
|
await db.commit()
|
230
232
|
|
231
233
|
return Response(status_code=status.HTTP_204_NO_CONTENT)
|
{fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/api/v2/project.py
RENAMED
@@ -11,11 +11,9 @@ from .....logger import reset_logger_handlers
|
|
11
11
|
from .....logger import set_logger
|
12
12
|
from ....db import AsyncSession
|
13
13
|
from ....db import get_async_db
|
14
|
-
from ....models.v2 import DatasetV2
|
15
14
|
from ....models.v2 import JobV2
|
16
15
|
from ....models.v2 import LinkUserProjectV2
|
17
16
|
from ....models.v2 import ProjectV2
|
18
|
-
from ....models.v2 import WorkflowV2
|
19
17
|
from ....schemas.v2 import ProjectCreateV2
|
20
18
|
from ....schemas.v2 import ProjectReadV2
|
21
19
|
from ....schemas.v2 import ProjectUpdateV2
|
@@ -145,56 +143,6 @@ async def delete_project(
|
|
145
143
|
),
|
146
144
|
)
|
147
145
|
|
148
|
-
# Cascade operations
|
149
|
-
|
150
|
-
# Workflows
|
151
|
-
stm = select(WorkflowV2).where(WorkflowV2.project_id == project_id)
|
152
|
-
res = await db.execute(stm)
|
153
|
-
workflows = res.scalars().all()
|
154
|
-
logger.info("Start of cascade operations on Workflows.")
|
155
|
-
for wf in workflows:
|
156
|
-
# Cascade operations: set foreign-keys to null for jobs which are in
|
157
|
-
# relationship with the current workflow
|
158
|
-
stm = select(JobV2).where(JobV2.workflow_id == wf.id)
|
159
|
-
res = await db.execute(stm)
|
160
|
-
jobs = res.scalars().all()
|
161
|
-
for job in jobs:
|
162
|
-
logger.info(f"Setting Job[{job.id}].workflow_id to None.")
|
163
|
-
job.workflow_id = None
|
164
|
-
# Delete workflow
|
165
|
-
logger.info(f"Adding Workflow[{wf.id}] to deletion.")
|
166
|
-
await db.delete(wf)
|
167
|
-
logger.info("End of cascade operations on Workflows.")
|
168
|
-
|
169
|
-
# Dataset
|
170
|
-
stm = select(DatasetV2).where(DatasetV2.project_id == project_id)
|
171
|
-
res = await db.execute(stm)
|
172
|
-
datasets = res.scalars().all()
|
173
|
-
logger.info("Start of cascade operations on Datasets.")
|
174
|
-
for ds in datasets:
|
175
|
-
# Cascade operations: set foreign-keys to null for jobs which are in
|
176
|
-
# relationship with the current dataset
|
177
|
-
stm = select(JobV2).where(JobV2.dataset_id == ds.id)
|
178
|
-
res = await db.execute(stm)
|
179
|
-
jobs = res.scalars().all()
|
180
|
-
for job in jobs:
|
181
|
-
logger.info(f"Setting Job[{job.id}].dataset_id to None.")
|
182
|
-
job.dataset_id = None
|
183
|
-
# Delete dataset
|
184
|
-
logger.info(f"Adding Dataset[{ds.id}] to deletion.")
|
185
|
-
await db.delete(ds)
|
186
|
-
logger.info("End of cascade operations on Datasets.")
|
187
|
-
|
188
|
-
# Job
|
189
|
-
logger.info("Start of cascade operations on Jobs.")
|
190
|
-
stm = select(JobV2).where(JobV2.project_id == project_id)
|
191
|
-
res = await db.execute(stm)
|
192
|
-
jobs = res.scalars().all()
|
193
|
-
for job in jobs:
|
194
|
-
logger.info(f"Setting Job[{job.id}].project_id to None.")
|
195
|
-
job.project_id = None
|
196
|
-
logger.info("End of cascade operations on Jobs.")
|
197
|
-
|
198
146
|
logger.info(f"Adding Project[{project.id}] to deletion.")
|
199
147
|
await db.delete(project)
|
200
148
|
|
{fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/api/v2/task_group.py
RENAMED
@@ -181,23 +181,6 @@ async def delete_task_group(
|
|
181
181
|
detail=f"TaskV2 {workflow_tasks[0].task_id} is still in use",
|
182
182
|
)
|
183
183
|
|
184
|
-
# Cascade operations: set foreign-keys to null for TaskGroupActivityV2
|
185
|
-
# which are in relationship with the current TaskGroupV2
|
186
|
-
logger.debug("Start of cascade operations on TaskGroupActivityV2.")
|
187
|
-
stm = select(TaskGroupActivityV2).where(
|
188
|
-
TaskGroupActivityV2.taskgroupv2_id == task_group_id
|
189
|
-
)
|
190
|
-
res = await db.execute(stm)
|
191
|
-
task_group_activity_list = res.scalars().all()
|
192
|
-
for task_group_activity in task_group_activity_list:
|
193
|
-
logger.debug(
|
194
|
-
f"Setting TaskGroupActivityV2[{task_group_activity.id}]"
|
195
|
-
".taskgroupv2_id to None."
|
196
|
-
)
|
197
|
-
task_group_activity.taskgroupv2_id = None
|
198
|
-
db.add(task_group_activity)
|
199
|
-
logger.debug("End of cascade operations on TaskGroupActivityV2.")
|
200
|
-
|
201
184
|
await db.delete(task_group)
|
202
185
|
await db.commit()
|
203
186
|
|
{fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/api/v2/workflow.py
RENAMED
@@ -221,14 +221,6 @@ async def delete_workflow(
|
|
221
221
|
),
|
222
222
|
)
|
223
223
|
|
224
|
-
# Cascade operation: set foreign-keys to null for jobs which are in
|
225
|
-
# relationship with the current workflow.
|
226
|
-
stm = select(JobV2).where(JobV2.workflow_id == workflow_id)
|
227
|
-
res = await db.execute(stm)
|
228
|
-
jobs = res.scalars().all()
|
229
|
-
for job in jobs:
|
230
|
-
job.workflow_id = None
|
231
|
-
|
232
224
|
# Delete workflow
|
233
225
|
await db.delete(workflow)
|
234
226
|
await db.commit()
|
{fractal_server-2.14.0a13 → fractal_server-2.14.0a15}/fractal_server/app/routes/auth/group.py
RENAMED
@@ -19,7 +19,6 @@ from fractal_server.app.models import LinkUserGroup
|
|
19
19
|
from fractal_server.app.models import UserGroup
|
20
20
|
from fractal_server.app.models import UserOAuth
|
21
21
|
from fractal_server.app.models import UserSettings
|
22
|
-
from fractal_server.app.models.v2 import TaskGroupV2
|
23
22
|
from fractal_server.app.schemas.user_group import UserGroupCreate
|
24
23
|
from fractal_server.app.schemas.user_group import UserGroupRead
|
25
24
|
from fractal_server.app.schemas.user_group import UserGroupUpdate
|
@@ -156,21 +155,6 @@ async def delete_single_group(
|
|
156
155
|
),
|
157
156
|
)
|
158
157
|
|
159
|
-
# Cascade operations
|
160
|
-
|
161
|
-
res = await db.execute(
|
162
|
-
select(LinkUserGroup).where(LinkUserGroup.group_id == group_id)
|
163
|
-
)
|
164
|
-
for link in res.scalars().all():
|
165
|
-
await db.delete(link)
|
166
|
-
|
167
|
-
res = await db.execute(
|
168
|
-
select(TaskGroupV2).where(TaskGroupV2.user_group_id == group_id)
|
169
|
-
)
|
170
|
-
for task_group in res.scalars().all():
|
171
|
-
task_group.user_group_id = None
|
172
|
-
db.add(task_group)
|
173
|
-
|
174
158
|
# Delete
|
175
159
|
|
176
160
|
await db.delete(group)
|
@@ -2,6 +2,7 @@ from typing import Any
|
|
2
2
|
|
3
3
|
from fractal_server.app.runner.task_files import TaskFiles
|
4
4
|
from fractal_server.app.schemas.v2.task import TaskTypeType
|
5
|
+
from fractal_server.logger import set_logger
|
5
6
|
|
6
7
|
|
7
8
|
TASK_TYPES_SUBMIT: list[TaskTypeType] = [
|
@@ -16,6 +17,8 @@ TASK_TYPES_MULTISUBMIT: list[TaskTypeType] = [
|
|
16
17
|
"parallel",
|
17
18
|
]
|
18
19
|
|
20
|
+
logger = set_logger(__name__)
|
21
|
+
|
19
22
|
|
20
23
|
class BaseRunner(object):
|
21
24
|
"""
|
@@ -88,6 +91,7 @@ class BaseRunner(object):
|
|
88
91
|
parameters: Parameters dictionary.
|
89
92
|
task_type: Task type.s
|
90
93
|
"""
|
94
|
+
logger.info("[validate_submit_parameters] START")
|
91
95
|
if task_type not in TASK_TYPES_SUBMIT:
|
92
96
|
raise ValueError(f"Invalid {task_type=} for `submit`.")
|
93
97
|
if not isinstance(parameters, dict):
|
@@ -102,6 +106,7 @@ class BaseRunner(object):
|
|
102
106
|
raise ValueError(
|
103
107
|
f"Forbidden 'zarr_urls' key in {list(parameters.keys())}"
|
104
108
|
)
|
109
|
+
logger.info("[validate_submit_parameters] END")
|
105
110
|
|
106
111
|
def validate_multisubmit_parameters(
|
107
112
|
self,
|