fractal-server 2.7.0a1__tar.gz → 2.7.0a2__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.7.0a1 → fractal_server-2.7.0a2}/PKG-INFO +1 -1
- fractal_server-2.7.0a2/fractal_server/__init__.py +1 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/__main__.py +10 -4
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/models/v2/task.py +19 -5
- fractal_server-2.7.0a2/fractal_server/app/routes/admin/v2/__init__.py +16 -0
- fractal_server-2.7.0a1/fractal_server/app/routes/admin/v2.py → fractal_server-2.7.0a2/fractal_server/app/routes/admin/v2/job.py +20 -191
- fractal_server-2.7.0a2/fractal_server/app/routes/admin/v2/project.py +43 -0
- fractal_server-2.7.0a2/fractal_server/app/routes/admin/v2/task.py +146 -0
- fractal_server-2.7.0a2/fractal_server/app/routes/admin/v2/task_group.py +134 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/api/v2/task.py +13 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/api/v2/task_collection_custom.py +7 -1
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/schemas/v2/manifest.py +12 -1
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/schemas/v2/task.py +73 -25
- fractal_server-2.7.0a2/fractal_server/app/schemas/v2/task_group.py +50 -0
- fractal_server-2.7.0a2/fractal_server/data_migrations/2_7_0.py +274 -0
- fractal_server-2.7.0a2/fractal_server/migrations/versions/742b74e1cc6e_revamp_taskv2_and_taskgroupv2.py +101 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/tasks/v2/background_operations.py +12 -1
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/tasks/v2/background_operations_ssh.py +11 -1
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/tasks/v2/endpoint_operations.py +42 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/pyproject.toml +2 -2
- fractal_server-2.7.0a1/fractal_server/__init__.py +0 -1
- fractal_server-2.7.0a1/fractal_server/app/schemas/v2/task_group.py +0 -23
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/LICENSE +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/README.md +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/alembic.ini +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/__init__.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/db/__init__.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/models/__init__.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/models/linkusergroup.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/models/linkuserproject.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/models/security.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/models/user_settings.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/models/v1/__init__.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/models/v1/dataset.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/models/v1/job.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/models/v1/project.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/models/v1/state.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/models/v1/task.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/models/v1/workflow.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/models/v2/__init__.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/models/v2/collection_state.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/models/v2/dataset.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/models/v2/job.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/models/v2/project.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/models/v2/workflow.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/models/v2/workflowtask.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/__init__.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/admin/__init__.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/admin/v1.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/api/__init__.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/api/v1/__init__.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/api/v1/_aux_functions.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/api/v1/dataset.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/api/v1/job.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/api/v1/project.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/api/v1/task.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/api/v1/task_collection.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/api/v1/workflow.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/api/v1/workflowtask.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/api/v2/__init__.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/api/v2/_aux_functions.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/api/v2/_aux_functions_tasks.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/api/v2/dataset.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/api/v2/images.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/api/v2/job.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/api/v2/project.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/api/v2/status.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/api/v2/submit.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/api/v2/task_collection.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/api/v2/task_group.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/api/v2/workflow.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/api/v2/workflowtask.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/auth/__init__.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/auth/_aux_auth.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/auth/current_user.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/auth/group.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/auth/login.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/auth/oauth.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/auth/register.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/auth/router.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/auth/users.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/aux/__init__.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/aux/_job.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/aux/_runner.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/routes/aux/validate_user_settings.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/.gitignore +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/__init__.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/async_wrap.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/components.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/compress_folder.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/exceptions.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/executors/__init__.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/executors/slurm/__init__.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/executors/slurm/_batching.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/executors/slurm/_slurm_config.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/executors/slurm/remote.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/executors/slurm/ssh/__init__.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/executors/slurm/ssh/_executor_wait_thread.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/executors/slurm/ssh/_slurm_job.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/executors/slurm/ssh/executor.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/executors/slurm/sudo/__init__.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/executors/slurm/sudo/_check_jobs_status.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/executors/slurm/sudo/_executor_wait_thread.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/executors/slurm/sudo/_subprocess_run_as_user.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/executors/slurm/sudo/executor.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/extract_archive.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/filenames.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/run_subprocess.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/set_start_and_last_task_index.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/shutdown.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/task_files.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/v1/__init__.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/v1/_common.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/v1/_local/__init__.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/v1/_local/_local_config.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/v1/_local/_submit_setup.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/v1/_local/executor.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/v1/_slurm/__init__.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/v1/_slurm/_submit_setup.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/v1/_slurm/get_slurm_config.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/v1/common.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/v1/handle_failed_job.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/v2/__init__.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/v2/_local/__init__.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/v2/_local/_local_config.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/v2/_local/_submit_setup.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/v2/_local/executor.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/v2/_local_experimental/__init__.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/v2/_local_experimental/_local_config.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/v2/_local_experimental/_submit_setup.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/v2/_local_experimental/executor.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/v2/_slurm_common/__init__.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/v2/_slurm_common/get_slurm_config.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/v2/_slurm_ssh/__init__.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/v2/_slurm_ssh/_submit_setup.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/v2/_slurm_sudo/__init__.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/v2/_slurm_sudo/_submit_setup.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/v2/deduplicate_list.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/v2/handle_failed_job.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/v2/merge_outputs.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/v2/runner.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/v2/runner_functions.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/v2/runner_functions_low_level.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/v2/task_interface.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/runner/versions.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/schemas/__init__.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/schemas/_validators.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/schemas/user.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/schemas/user_group.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/schemas/user_settings.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/schemas/v1/__init__.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/schemas/v1/applyworkflow.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/schemas/v1/dataset.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/schemas/v1/dumps.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/schemas/v1/manifest.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/schemas/v1/project.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/schemas/v1/state.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/schemas/v1/task.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/schemas/v1/task_collection.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/schemas/v1/workflow.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/schemas/v2/__init__.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/schemas/v2/dataset.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/schemas/v2/dumps.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/schemas/v2/job.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/schemas/v2/project.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/schemas/v2/status.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/schemas/v2/task_collection.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/schemas/v2/workflow.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/schemas/v2/workflowtask.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/security/__init__.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/app/user_settings.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/config.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/data_migrations/README.md +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/data_migrations/tools.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/gunicorn_fractal.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/images/__init__.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/images/models.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/images/tools.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/logger.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/main.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/migrations/README +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/migrations/env.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/migrations/naming_convention.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/migrations/script.py.mako +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/migrations/versions/091b01f51f88_add_usergroup_and_linkusergroup_table.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/migrations/versions/4c308bcaea2b_add_task_args_schema_and_task_args_.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/migrations/versions/4cedeb448a53_workflowtask_foreign_keys_not_nullables.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/migrations/versions/501961cfcd85_remove_link_between_v1_and_v2_tasks_.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/migrations/versions/50a13d6138fd_initial_schema.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/migrations/versions/5bf02391cfef_v2.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/migrations/versions/70e77f1c38b0_add_applyworkflow_first_task_index_and_.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/migrations/versions/71eefd1dd202_add_slurm_accounts.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/migrations/versions/7cf1baae8fb4_task_group_v2.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/migrations/versions/84bf0fffde30_add_dumps_to_applyworkflow.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/migrations/versions/8f79bd162e35_add_docs_info_and_docs_link_to_task_.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/migrations/versions/94a47ea2d3ff_remove_cache_dir_slurm_user_and_slurm_.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/migrations/versions/97f444d47249_add_applyworkflow_project_dump.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/migrations/versions/99ea79d9e5d2_add_dataset_history.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/migrations/versions/9c5ae74c9b98_add_user_settings_table.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/migrations/versions/9fd26a2b0de4_add_workflow_timestamp_created.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/migrations/versions/a7f4d6137b53_add_workflow_dump_to_applyworkflow.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/migrations/versions/d4fe3708d309_make_applyworkflow_workflow_dump_non_.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/migrations/versions/da2cb2ac4255_user_group_viewer_paths.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/migrations/versions/df7cc3501bf7_linkusergroup_timestamp_created.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/migrations/versions/e75cac726012_make_applyworkflow_start_timestamp_not_.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/migrations/versions/efa89c30e0a4_add_project_timestamp_created.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/migrations/versions/f384e1c0cf5d_drop_task_default_args_columns.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/py.typed +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/ssh/__init__.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/ssh/_fabric.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/string_tools.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/syringe.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/tasks/__init__.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/tasks/utils.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/tasks/v1/_TaskCollectPip.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/tasks/v1/__init__.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/tasks/v1/background_operations.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/tasks/v1/endpoint_operations.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/tasks/v1/get_collection_data.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/tasks/v1/utils.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/tasks/v2/_TaskCollectPip.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/tasks/v2/__init__.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/tasks/v2/_venv_pip.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/tasks/v2/database_operations.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/tasks/v2/templates/_1_create_venv.sh +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/tasks/v2/templates/_2_upgrade_pip.sh +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/tasks/v2/templates/_3_pip_install.sh +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/tasks/v2/templates/_4_pip_freeze.sh +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/tasks/v2/templates/_5_pip_show.sh +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/tasks/v2/utils.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/urls.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/utils.py +0 -0
- {fractal_server-2.7.0a1 → fractal_server-2.7.0a2}/fractal_server/zip_tools.py +0 -0
@@ -0,0 +1 @@
|
|
1
|
+
__VERSION__ = "2.7.0a2"
|
@@ -57,10 +57,16 @@ set_db_parser.add_argument(
|
|
57
57
|
)
|
58
58
|
|
59
59
|
# fractalctl update-db-data
|
60
|
-
subparsers.add_parser(
|
60
|
+
update_db_data_parser = subparsers.add_parser(
|
61
61
|
"update-db-data",
|
62
62
|
description="Apply data-migration script to an existing database.",
|
63
63
|
)
|
64
|
+
update_db_data_parser.add_argument(
|
65
|
+
"--dry-run",
|
66
|
+
action="store_true",
|
67
|
+
help="If set, perform a dry run of the data migration.",
|
68
|
+
default=False,
|
69
|
+
)
|
64
70
|
|
65
71
|
|
66
72
|
def save_openapi(dest="openapi.json"):
|
@@ -120,7 +126,7 @@ def set_db(skip_init_data: bool = False):
|
|
120
126
|
print()
|
121
127
|
|
122
128
|
|
123
|
-
def update_db_data():
|
129
|
+
def update_db_data(dry_run: bool = False):
|
124
130
|
"""
|
125
131
|
Apply data migrations.
|
126
132
|
"""
|
@@ -185,7 +191,7 @@ def update_db_data():
|
|
185
191
|
sys.exit()
|
186
192
|
|
187
193
|
print("OK, now starting data-migration script\n")
|
188
|
-
current_update_db_data_module.fix_db()
|
194
|
+
current_update_db_data_module.fix_db(dry_run=dry_run)
|
189
195
|
|
190
196
|
|
191
197
|
def run():
|
@@ -196,7 +202,7 @@ def run():
|
|
196
202
|
elif args.cmd == "set-db":
|
197
203
|
set_db(skip_init_data=args.skip_init_data)
|
198
204
|
elif args.cmd == "update-db-data":
|
199
|
-
update_db_data()
|
205
|
+
update_db_data(dry_run=args.dry_run)
|
200
206
|
elif args.cmd == "start":
|
201
207
|
uvicorn.run(
|
202
208
|
"fractal_server.main:app",
|
@@ -47,21 +47,35 @@ class TaskV2(SQLModel, table=True):
|
|
47
47
|
|
48
48
|
taskgroupv2_id: Optional[int] = Field(foreign_key="taskgroupv2.id")
|
49
49
|
|
50
|
+
category: Optional[str] = None
|
51
|
+
modality: Optional[str] = None
|
52
|
+
authors: Optional[str] = None
|
53
|
+
tags: list[str] = Field(
|
54
|
+
sa_column=Column(JSON, server_default="[]", nullable=False)
|
55
|
+
)
|
56
|
+
|
50
57
|
|
51
58
|
class TaskGroupV2(SQLModel, table=True):
|
52
59
|
|
53
60
|
id: Optional[int] = Field(default=None, primary_key=True)
|
54
|
-
|
55
|
-
user_id: int = Field(foreign_key="user_oauth.id")
|
56
|
-
user_group_id: Optional[int] = Field(foreign_key="usergroup.id")
|
57
|
-
|
58
|
-
active: bool = True
|
59
61
|
task_list: list[TaskV2] = Relationship(
|
60
62
|
sa_relationship_kwargs=dict(
|
61
63
|
lazy="selectin", cascade="all, delete-orphan"
|
62
64
|
),
|
63
65
|
)
|
64
66
|
|
67
|
+
user_id: int = Field(foreign_key="user_oauth.id")
|
68
|
+
user_group_id: Optional[int] = Field(foreign_key="usergroup.id")
|
69
|
+
|
70
|
+
origin: str
|
71
|
+
pkg_name: str
|
72
|
+
version: Optional[str] = None
|
73
|
+
python_version: Optional[str] = None
|
74
|
+
path: Optional[str] = None
|
75
|
+
venv_path: Optional[str] = None
|
76
|
+
pip_extras: Optional[str] = None
|
77
|
+
|
78
|
+
active: bool = True
|
65
79
|
timestamp_created: datetime = Field(
|
66
80
|
default_factory=get_timestamp,
|
67
81
|
sa_column=Column(DateTime(timezone=True), nullable=False),
|
@@ -0,0 +1,16 @@
|
|
1
|
+
"""
|
2
|
+
`admin/v2` module
|
3
|
+
"""
|
4
|
+
from fastapi import APIRouter
|
5
|
+
|
6
|
+
from .job import router as job_router
|
7
|
+
from .project import router as project_router
|
8
|
+
from .task import router as task_router
|
9
|
+
from .task_group import router as task_group_router
|
10
|
+
|
11
|
+
router_admin_v2 = APIRouter()
|
12
|
+
|
13
|
+
router_admin_v2.include_router(job_router, prefix="/job")
|
14
|
+
router_admin_v2.include_router(project_router, prefix="/project")
|
15
|
+
router_admin_v2.include_router(task_router, prefix="/task")
|
16
|
+
router_admin_v2.include_router(task_group_router, prefix="/task-group")
|
@@ -1,10 +1,6 @@
|
|
1
|
-
"""
|
2
|
-
Definition of `/admin` routes.
|
3
|
-
"""
|
4
1
|
from datetime import datetime
|
5
2
|
from datetime import timezone
|
6
3
|
from pathlib import Path
|
7
|
-
from typing import Literal
|
8
4
|
from typing import Optional
|
9
5
|
|
10
6
|
from fastapi import APIRouter
|
@@ -13,33 +9,26 @@ from fastapi import HTTPException
|
|
13
9
|
from fastapi import Response
|
14
10
|
from fastapi import status
|
15
11
|
from fastapi.responses import StreamingResponse
|
16
|
-
from pydantic import BaseModel
|
17
|
-
from pydantic import EmailStr
|
18
|
-
from pydantic import Field
|
19
12
|
from sqlmodel import select
|
20
13
|
|
21
|
-
from
|
22
|
-
from
|
23
|
-
from ....utils import get_timestamp
|
24
|
-
from ....zip_tools import _zip_folder_to_byte_stream_iterator
|
25
|
-
from ...db import AsyncSession
|
26
|
-
from ...db import get_async_db
|
27
|
-
from ...models.v2 import JobV2
|
28
|
-
from ...models.v2 import ProjectV2
|
29
|
-
from ...models.v2 import TaskV2
|
30
|
-
from ...models.v2 import WorkflowTaskV2
|
31
|
-
from ...models.v2 import WorkflowV2
|
32
|
-
from ...runner.filenames import WORKFLOW_LOG_FILENAME
|
33
|
-
from ...schemas.v2 import JobReadV2
|
34
|
-
from ...schemas.v2 import JobStatusTypeV2
|
35
|
-
from ...schemas.v2 import JobUpdateV2
|
36
|
-
from ...schemas.v2 import ProjectReadV2
|
37
|
-
from ..aux._job import _write_shutdown_file
|
38
|
-
from ..aux._runner import _check_shutdown_is_supported
|
14
|
+
from fractal_server.app.db import AsyncSession
|
15
|
+
from fractal_server.app.db import get_async_db
|
39
16
|
from fractal_server.app.models import UserOAuth
|
17
|
+
from fractal_server.app.models.v2 import JobV2
|
18
|
+
from fractal_server.app.models.v2 import ProjectV2
|
40
19
|
from fractal_server.app.routes.auth import current_active_superuser
|
20
|
+
from fractal_server.app.routes.aux._job import _write_shutdown_file
|
21
|
+
from fractal_server.app.routes.aux._runner import _check_shutdown_is_supported
|
22
|
+
from fractal_server.app.runner.filenames import WORKFLOW_LOG_FILENAME
|
23
|
+
from fractal_server.app.schemas.v2 import JobReadV2
|
24
|
+
from fractal_server.app.schemas.v2 import JobStatusTypeV2
|
25
|
+
from fractal_server.app.schemas.v2 import JobUpdateV2
|
26
|
+
from fractal_server.config import get_settings
|
27
|
+
from fractal_server.syringe import Inject
|
28
|
+
from fractal_server.utils import get_timestamp
|
29
|
+
from fractal_server.zip_tools import _zip_folder_to_byte_stream_iterator
|
41
30
|
|
42
|
-
|
31
|
+
router = APIRouter()
|
43
32
|
|
44
33
|
|
45
34
|
def _convert_to_db_timestamp(dt: datetime) -> datetime:
|
@@ -59,36 +48,7 @@ def _convert_to_db_timestamp(dt: datetime) -> datetime:
|
|
59
48
|
return _dt
|
60
49
|
|
61
50
|
|
62
|
-
@
|
63
|
-
async def view_project(
|
64
|
-
id: Optional[int] = None,
|
65
|
-
user_id: Optional[int] = None,
|
66
|
-
user: UserOAuth = Depends(current_active_superuser),
|
67
|
-
db: AsyncSession = Depends(get_async_db),
|
68
|
-
) -> list[ProjectReadV2]:
|
69
|
-
"""
|
70
|
-
Query `ProjectV2` table.
|
71
|
-
|
72
|
-
Args:
|
73
|
-
id: If not `None`, select a given `project.id`.
|
74
|
-
user_id: If not `None`, select a given `project.user_id`.
|
75
|
-
"""
|
76
|
-
|
77
|
-
stm = select(ProjectV2)
|
78
|
-
|
79
|
-
if id is not None:
|
80
|
-
stm = stm.where(ProjectV2.id == id)
|
81
|
-
if user_id is not None:
|
82
|
-
stm = stm.where(ProjectV2.user_list.any(UserOAuth.id == user_id))
|
83
|
-
|
84
|
-
res = await db.execute(stm)
|
85
|
-
project_list = res.scalars().all()
|
86
|
-
await db.close()
|
87
|
-
|
88
|
-
return project_list
|
89
|
-
|
90
|
-
|
91
|
-
@router_admin_v2.get("/job/", response_model=list[JobReadV2])
|
51
|
+
@router.get("/", response_model=list[JobReadV2])
|
92
52
|
async def view_job(
|
93
53
|
id: Optional[int] = None,
|
94
54
|
user_id: Optional[int] = None,
|
@@ -164,7 +124,7 @@ async def view_job(
|
|
164
124
|
return job_list
|
165
125
|
|
166
126
|
|
167
|
-
@
|
127
|
+
@router.get("/{job_id}/", response_model=JobReadV2)
|
168
128
|
async def view_single_job(
|
169
129
|
job_id: int = None,
|
170
130
|
show_tmp_logs: bool = False,
|
@@ -190,10 +150,7 @@ async def view_single_job(
|
|
190
150
|
return job
|
191
151
|
|
192
152
|
|
193
|
-
@
|
194
|
-
"/job/{job_id}/",
|
195
|
-
response_model=JobReadV2,
|
196
|
-
)
|
153
|
+
@router.patch("/{job_id}/", response_model=JobReadV2)
|
197
154
|
async def update_job(
|
198
155
|
job_update: JobUpdateV2,
|
199
156
|
job_id: int,
|
@@ -227,7 +184,7 @@ async def update_job(
|
|
227
184
|
return job
|
228
185
|
|
229
186
|
|
230
|
-
@
|
187
|
+
@router.get("/{job_id}/stop/", status_code=202)
|
231
188
|
async def stop_job(
|
232
189
|
job_id: int,
|
233
190
|
user: UserOAuth = Depends(current_active_superuser),
|
@@ -251,10 +208,7 @@ async def stop_job(
|
|
251
208
|
return Response(status_code=status.HTTP_202_ACCEPTED)
|
252
209
|
|
253
210
|
|
254
|
-
@
|
255
|
-
"/job/{job_id}/download/",
|
256
|
-
response_class=StreamingResponse,
|
257
|
-
)
|
211
|
+
@router.get("/{job_id}/download/", response_class=StreamingResponse)
|
258
212
|
async def download_job_logs(
|
259
213
|
job_id: int,
|
260
214
|
user: UserOAuth = Depends(current_active_superuser),
|
@@ -278,128 +232,3 @@ async def download_job_logs(
|
|
278
232
|
media_type="application/x-zip-compressed",
|
279
233
|
headers={"Content-Disposition": f"attachment;filename={zip_filename}"},
|
280
234
|
)
|
281
|
-
|
282
|
-
|
283
|
-
class TaskV2Minimal(BaseModel):
|
284
|
-
|
285
|
-
id: int
|
286
|
-
name: str
|
287
|
-
type: str
|
288
|
-
command_non_parallel: Optional[str]
|
289
|
-
command_parallel: Optional[str]
|
290
|
-
source: str
|
291
|
-
owner: Optional[str]
|
292
|
-
version: Optional[str]
|
293
|
-
|
294
|
-
|
295
|
-
class ProjectUser(BaseModel):
|
296
|
-
|
297
|
-
id: int
|
298
|
-
email: EmailStr
|
299
|
-
|
300
|
-
|
301
|
-
class TaskV2Relationship(BaseModel):
|
302
|
-
|
303
|
-
workflow_id: int
|
304
|
-
workflow_name: str
|
305
|
-
project_id: int
|
306
|
-
project_name: str
|
307
|
-
project_users: list[ProjectUser] = Field(default_factory=list)
|
308
|
-
|
309
|
-
|
310
|
-
class TaskV2Info(BaseModel):
|
311
|
-
|
312
|
-
task: TaskV2Minimal
|
313
|
-
relationships: list[TaskV2Relationship]
|
314
|
-
|
315
|
-
|
316
|
-
@router_admin_v2.get("/task/", response_model=list[TaskV2Info])
|
317
|
-
async def query_tasks(
|
318
|
-
id: Optional[int] = None,
|
319
|
-
source: Optional[str] = None,
|
320
|
-
version: Optional[str] = None,
|
321
|
-
name: Optional[str] = None,
|
322
|
-
owner: Optional[str] = None,
|
323
|
-
kind: Optional[Literal["common", "users"]] = None,
|
324
|
-
max_number_of_results: int = 25,
|
325
|
-
user: UserOAuth = Depends(current_active_superuser),
|
326
|
-
db: AsyncSession = Depends(get_async_db),
|
327
|
-
) -> list[TaskV2Info]:
|
328
|
-
"""
|
329
|
-
Query `TaskV2` table and get informations about related items
|
330
|
-
(WorkflowV2s and ProjectV2s)
|
331
|
-
|
332
|
-
Args:
|
333
|
-
id: If not `None`, query for matching `task.id`.
|
334
|
-
source: If not `None`, query for contained case insensitive
|
335
|
-
`task.source`.
|
336
|
-
version: If not `None`, query for matching `task.version`.
|
337
|
-
name: If not `None`, query for contained case insensitive `task.name`.
|
338
|
-
owner: If not `None`, query for matching `task.owner`.
|
339
|
-
kind: If not `None`, query for TaskV2s that have (`users`) or don't
|
340
|
-
have (`common`) a `task.owner`.
|
341
|
-
max_number_of_results: The maximum length of the response.
|
342
|
-
"""
|
343
|
-
|
344
|
-
stm = select(TaskV2)
|
345
|
-
|
346
|
-
if id is not None:
|
347
|
-
stm = stm.where(TaskV2.id == id)
|
348
|
-
if source is not None:
|
349
|
-
stm = stm.where(TaskV2.source.icontains(source))
|
350
|
-
if version is not None:
|
351
|
-
stm = stm.where(TaskV2.version == version)
|
352
|
-
if name is not None:
|
353
|
-
stm = stm.where(TaskV2.name.icontains(name))
|
354
|
-
if owner is not None:
|
355
|
-
stm = stm.where(TaskV2.owner == owner)
|
356
|
-
|
357
|
-
if kind == "common":
|
358
|
-
stm = stm.where(TaskV2.owner == None) # noqa E711
|
359
|
-
elif kind == "users":
|
360
|
-
stm = stm.where(TaskV2.owner != None) # noqa E711
|
361
|
-
|
362
|
-
res = await db.execute(stm)
|
363
|
-
task_list = res.scalars().all()
|
364
|
-
if len(task_list) > max_number_of_results:
|
365
|
-
await db.close()
|
366
|
-
raise HTTPException(
|
367
|
-
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
368
|
-
detail=(
|
369
|
-
f"Too many Tasks ({len(task_list)} > {max_number_of_results})."
|
370
|
-
" Please add more query filters."
|
371
|
-
),
|
372
|
-
)
|
373
|
-
|
374
|
-
task_info_list = []
|
375
|
-
|
376
|
-
for task in task_list:
|
377
|
-
stm = (
|
378
|
-
select(WorkflowV2)
|
379
|
-
.join(WorkflowTaskV2)
|
380
|
-
.where(WorkflowTaskV2.workflow_id == WorkflowV2.id)
|
381
|
-
.where(WorkflowTaskV2.task_id == task.id)
|
382
|
-
)
|
383
|
-
res = await db.execute(stm)
|
384
|
-
wf_list = res.scalars().all()
|
385
|
-
|
386
|
-
task_info_list.append(
|
387
|
-
dict(
|
388
|
-
task=task.model_dump(),
|
389
|
-
relationships=[
|
390
|
-
dict(
|
391
|
-
workflow_id=workflow.id,
|
392
|
-
workflow_name=workflow.name,
|
393
|
-
project_id=workflow.project.id,
|
394
|
-
project_name=workflow.project.name,
|
395
|
-
project_users=[
|
396
|
-
dict(id=user.id, email=user.email)
|
397
|
-
for user in workflow.project.user_list
|
398
|
-
],
|
399
|
-
)
|
400
|
-
for workflow in wf_list
|
401
|
-
],
|
402
|
-
)
|
403
|
-
)
|
404
|
-
|
405
|
-
return task_info_list
|
@@ -0,0 +1,43 @@
|
|
1
|
+
from typing import Optional
|
2
|
+
|
3
|
+
from fastapi import APIRouter
|
4
|
+
from fastapi import Depends
|
5
|
+
from sqlmodel import select
|
6
|
+
|
7
|
+
from fractal_server.app.db import AsyncSession
|
8
|
+
from fractal_server.app.db import get_async_db
|
9
|
+
from fractal_server.app.models import UserOAuth
|
10
|
+
from fractal_server.app.models.v2 import ProjectV2
|
11
|
+
from fractal_server.app.routes.auth import current_active_superuser
|
12
|
+
from fractal_server.app.schemas.v2 import ProjectReadV2
|
13
|
+
|
14
|
+
router = APIRouter()
|
15
|
+
|
16
|
+
|
17
|
+
@router.get("/", response_model=list[ProjectReadV2])
|
18
|
+
async def view_project(
|
19
|
+
id: Optional[int] = None,
|
20
|
+
user_id: Optional[int] = None,
|
21
|
+
user: UserOAuth = Depends(current_active_superuser),
|
22
|
+
db: AsyncSession = Depends(get_async_db),
|
23
|
+
) -> list[ProjectReadV2]:
|
24
|
+
"""
|
25
|
+
Query `ProjectV2` table.
|
26
|
+
|
27
|
+
Args:
|
28
|
+
id: If not `None`, select a given `project.id`.
|
29
|
+
user_id: If not `None`, select a given `project.user_id`.
|
30
|
+
"""
|
31
|
+
|
32
|
+
stm = select(ProjectV2)
|
33
|
+
|
34
|
+
if id is not None:
|
35
|
+
stm = stm.where(ProjectV2.id == id)
|
36
|
+
if user_id is not None:
|
37
|
+
stm = stm.where(ProjectV2.user_list.any(UserOAuth.id == user_id))
|
38
|
+
|
39
|
+
res = await db.execute(stm)
|
40
|
+
project_list = res.scalars().all()
|
41
|
+
await db.close()
|
42
|
+
|
43
|
+
return project_list
|
@@ -0,0 +1,146 @@
|
|
1
|
+
from typing import Literal
|
2
|
+
from typing import Optional
|
3
|
+
|
4
|
+
from fastapi import APIRouter
|
5
|
+
from fastapi import Depends
|
6
|
+
from fastapi import HTTPException
|
7
|
+
from fastapi import status
|
8
|
+
from pydantic import BaseModel
|
9
|
+
from pydantic import EmailStr
|
10
|
+
from pydantic import Field
|
11
|
+
from sqlmodel import select
|
12
|
+
|
13
|
+
from fractal_server.app.db import AsyncSession
|
14
|
+
from fractal_server.app.db import get_async_db
|
15
|
+
from fractal_server.app.models import UserOAuth
|
16
|
+
from fractal_server.app.models.v2 import TaskV2
|
17
|
+
from fractal_server.app.models.v2 import WorkflowTaskV2
|
18
|
+
from fractal_server.app.models.v2 import WorkflowV2
|
19
|
+
from fractal_server.app.routes.auth import current_active_superuser
|
20
|
+
|
21
|
+
router = APIRouter()
|
22
|
+
|
23
|
+
|
24
|
+
class TaskV2Minimal(BaseModel):
|
25
|
+
|
26
|
+
id: int
|
27
|
+
name: str
|
28
|
+
type: str
|
29
|
+
command_non_parallel: Optional[str]
|
30
|
+
command_parallel: Optional[str]
|
31
|
+
source: str
|
32
|
+
owner: Optional[str]
|
33
|
+
version: Optional[str]
|
34
|
+
|
35
|
+
|
36
|
+
class ProjectUser(BaseModel):
|
37
|
+
|
38
|
+
id: int
|
39
|
+
email: EmailStr
|
40
|
+
|
41
|
+
|
42
|
+
class TaskV2Relationship(BaseModel):
|
43
|
+
|
44
|
+
workflow_id: int
|
45
|
+
workflow_name: str
|
46
|
+
project_id: int
|
47
|
+
project_name: str
|
48
|
+
project_users: list[ProjectUser] = Field(default_factory=list)
|
49
|
+
|
50
|
+
|
51
|
+
class TaskV2Info(BaseModel):
|
52
|
+
|
53
|
+
task: TaskV2Minimal
|
54
|
+
relationships: list[TaskV2Relationship]
|
55
|
+
|
56
|
+
|
57
|
+
@router.get("/", response_model=list[TaskV2Info])
|
58
|
+
async def query_tasks(
|
59
|
+
id: Optional[int] = None,
|
60
|
+
source: Optional[str] = None,
|
61
|
+
version: Optional[str] = None,
|
62
|
+
name: Optional[str] = None,
|
63
|
+
owner: Optional[str] = None,
|
64
|
+
kind: Optional[Literal["common", "users"]] = None,
|
65
|
+
max_number_of_results: int = 25,
|
66
|
+
user: UserOAuth = Depends(current_active_superuser),
|
67
|
+
db: AsyncSession = Depends(get_async_db),
|
68
|
+
) -> list[TaskV2Info]:
|
69
|
+
"""
|
70
|
+
Query `TaskV2` table and get informations about related items
|
71
|
+
(WorkflowV2s and ProjectV2s)
|
72
|
+
|
73
|
+
Args:
|
74
|
+
id: If not `None`, query for matching `task.id`.
|
75
|
+
source: If not `None`, query for contained case insensitive
|
76
|
+
`task.source`.
|
77
|
+
version: If not `None`, query for matching `task.version`.
|
78
|
+
name: If not `None`, query for contained case insensitive `task.name`.
|
79
|
+
owner: If not `None`, query for matching `task.owner`.
|
80
|
+
kind: If not `None`, query for TaskV2s that have (`users`) or don't
|
81
|
+
have (`common`) a `task.owner`.
|
82
|
+
max_number_of_results: The maximum length of the response.
|
83
|
+
"""
|
84
|
+
|
85
|
+
stm = select(TaskV2)
|
86
|
+
|
87
|
+
if id is not None:
|
88
|
+
stm = stm.where(TaskV2.id == id)
|
89
|
+
if source is not None:
|
90
|
+
stm = stm.where(TaskV2.source.icontains(source))
|
91
|
+
if version is not None:
|
92
|
+
stm = stm.where(TaskV2.version == version)
|
93
|
+
if name is not None:
|
94
|
+
stm = stm.where(TaskV2.name.icontains(name))
|
95
|
+
if owner is not None:
|
96
|
+
stm = stm.where(TaskV2.owner == owner)
|
97
|
+
|
98
|
+
if kind == "common":
|
99
|
+
stm = stm.where(TaskV2.owner == None) # noqa E711
|
100
|
+
elif kind == "users":
|
101
|
+
stm = stm.where(TaskV2.owner != None) # noqa E711
|
102
|
+
|
103
|
+
res = await db.execute(stm)
|
104
|
+
task_list = res.scalars().all()
|
105
|
+
if len(task_list) > max_number_of_results:
|
106
|
+
await db.close()
|
107
|
+
raise HTTPException(
|
108
|
+
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
109
|
+
detail=(
|
110
|
+
f"Too many Tasks ({len(task_list)} > {max_number_of_results})."
|
111
|
+
" Please add more query filters."
|
112
|
+
),
|
113
|
+
)
|
114
|
+
|
115
|
+
task_info_list = []
|
116
|
+
|
117
|
+
for task in task_list:
|
118
|
+
stm = (
|
119
|
+
select(WorkflowV2)
|
120
|
+
.join(WorkflowTaskV2)
|
121
|
+
.where(WorkflowTaskV2.workflow_id == WorkflowV2.id)
|
122
|
+
.where(WorkflowTaskV2.task_id == task.id)
|
123
|
+
)
|
124
|
+
res = await db.execute(stm)
|
125
|
+
wf_list = res.scalars().all()
|
126
|
+
|
127
|
+
task_info_list.append(
|
128
|
+
dict(
|
129
|
+
task=task.model_dump(),
|
130
|
+
relationships=[
|
131
|
+
dict(
|
132
|
+
workflow_id=workflow.id,
|
133
|
+
workflow_name=workflow.name,
|
134
|
+
project_id=workflow.project.id,
|
135
|
+
project_name=workflow.project.name,
|
136
|
+
project_users=[
|
137
|
+
dict(id=user.id, email=user.email)
|
138
|
+
for user in workflow.project.user_list
|
139
|
+
],
|
140
|
+
)
|
141
|
+
for workflow in wf_list
|
142
|
+
],
|
143
|
+
)
|
144
|
+
)
|
145
|
+
|
146
|
+
return task_info_list
|