fractal-server 2.9.0a8__tar.gz → 2.9.0a10__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.9.0a8 → fractal_server-2.9.0a10}/PKG-INFO +1 -1
- fractal_server-2.9.0a10/fractal_server/__init__.py +1 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/admin/v2/task.py +13 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/auth/current_user.py +60 -17
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/auth/group.py +47 -39
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/schemas/user_group.py +0 -11
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/config.py +50 -3
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/pyproject.toml +2 -2
- fractal_server-2.9.0a8/fractal_server/__init__.py +0 -1
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/LICENSE +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/README.md +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/__main__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/alembic.ini +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/db/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/models/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/models/linkusergroup.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/models/linkuserproject.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/models/security.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/models/user_settings.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/models/v1/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/models/v1/dataset.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/models/v1/job.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/models/v1/project.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/models/v1/state.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/models/v1/task.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/models/v1/workflow.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/models/v2/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/models/v2/dataset.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/models/v2/job.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/models/v2/project.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/models/v2/task.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/models/v2/task_group.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/models/v2/workflow.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/models/v2/workflowtask.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/admin/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/admin/v1.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/admin/v2/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/admin/v2/job.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/admin/v2/project.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/admin/v2/task_group.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/admin/v2/task_group_lifecycle.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v1/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v1/_aux_functions.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v1/dataset.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v1/job.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v1/project.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v1/task.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v1/task_collection.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v1/workflow.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v1/workflowtask.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v2/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v2/_aux_functions.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v2/_aux_functions_task_lifecycle.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v2/_aux_functions_tasks.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v2/dataset.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v2/images.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v2/job.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v2/project.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v2/status.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v2/submit.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v2/task.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v2/task_collection.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v2/task_collection_custom.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v2/task_group.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v2/task_group_lifecycle.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v2/workflow.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v2/workflow_import.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v2/workflowtask.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/auth/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/auth/_aux_auth.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/auth/login.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/auth/oauth.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/auth/register.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/auth/router.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/auth/users.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/aux/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/aux/_job.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/aux/_runner.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/aux/validate_user_settings.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/.gitignore +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/async_wrap.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/components.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/compress_folder.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/exceptions.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/executors/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/executors/slurm/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/executors/slurm/_batching.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/executors/slurm/_slurm_config.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/executors/slurm/remote.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/executors/slurm/ssh/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/executors/slurm/ssh/_executor_wait_thread.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/executors/slurm/ssh/_slurm_job.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/executors/slurm/ssh/executor.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/executors/slurm/sudo/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/executors/slurm/sudo/_check_jobs_status.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/executors/slurm/sudo/_executor_wait_thread.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/executors/slurm/sudo/_subprocess_run_as_user.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/executors/slurm/sudo/executor.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/extract_archive.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/filenames.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/run_subprocess.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/set_start_and_last_task_index.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/shutdown.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/task_files.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/v1/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/v1/_common.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/v1/_local/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/v1/_local/_local_config.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/v1/_local/_submit_setup.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/v1/_local/executor.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/v1/_slurm/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/v1/_slurm/_submit_setup.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/v1/_slurm/get_slurm_config.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/v1/common.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/v1/handle_failed_job.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/v2/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/v2/_local/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/v2/_local/_local_config.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/v2/_local/_submit_setup.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/v2/_local/executor.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/v2/_local_experimental/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/v2/_local_experimental/_local_config.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/v2/_local_experimental/_submit_setup.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/v2/_local_experimental/executor.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/v2/_slurm_common/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/v2/_slurm_common/get_slurm_config.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/v2/_slurm_ssh/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/v2/_slurm_ssh/_submit_setup.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/v2/_slurm_sudo/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/v2/_slurm_sudo/_submit_setup.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/v2/deduplicate_list.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/v2/handle_failed_job.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/v2/merge_outputs.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/v2/runner.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/v2/runner_functions.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/v2/runner_functions_low_level.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/v2/task_interface.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/versions.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/schemas/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/schemas/_validators.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/schemas/user.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/schemas/user_settings.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/schemas/v1/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/schemas/v1/applyworkflow.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/schemas/v1/dataset.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/schemas/v1/dumps.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/schemas/v1/manifest.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/schemas/v1/project.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/schemas/v1/state.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/schemas/v1/task.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/schemas/v1/task_collection.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/schemas/v1/workflow.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/schemas/v2/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/schemas/v2/dataset.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/schemas/v2/dumps.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/schemas/v2/job.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/schemas/v2/manifest.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/schemas/v2/project.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/schemas/v2/status.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/schemas/v2/task.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/schemas/v2/task_collection.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/schemas/v2/task_group.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/schemas/v2/workflow.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/schemas/v2/workflowtask.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/security/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/user_settings.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/data_migrations/README.md +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/data_migrations/tools.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/gunicorn_fractal.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/images/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/images/models.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/images/tools.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/logger.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/main.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/migrations/README +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/migrations/env.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/migrations/naming_convention.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/migrations/script.py.mako +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/migrations/versions/034a469ec2eb_task_groups.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/migrations/versions/091b01f51f88_add_usergroup_and_linkusergroup_table.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/migrations/versions/19eca0dd47a9_user_settings_project_dir.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/migrations/versions/4c308bcaea2b_add_task_args_schema_and_task_args_.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/migrations/versions/4cedeb448a53_workflowtask_foreign_keys_not_nullables.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/migrations/versions/501961cfcd85_remove_link_between_v1_and_v2_tasks_.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/migrations/versions/50a13d6138fd_initial_schema.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/migrations/versions/5bf02391cfef_v2.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/migrations/versions/70e77f1c38b0_add_applyworkflow_first_task_index_and_.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/migrations/versions/71eefd1dd202_add_slurm_accounts.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/migrations/versions/84bf0fffde30_add_dumps_to_applyworkflow.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/migrations/versions/8e8f227a3e36_update_taskv2_post_2_7_0.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/migrations/versions/8f79bd162e35_add_docs_info_and_docs_link_to_task_.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/migrations/versions/94a47ea2d3ff_remove_cache_dir_slurm_user_and_slurm_.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/migrations/versions/97f444d47249_add_applyworkflow_project_dump.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/migrations/versions/99ea79d9e5d2_add_dataset_history.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/migrations/versions/9c5ae74c9b98_add_user_settings_table.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/migrations/versions/9fd26a2b0de4_add_workflow_timestamp_created.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/migrations/versions/a7f4d6137b53_add_workflow_dump_to_applyworkflow.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/migrations/versions/d256a7379ab8_taskgroup_activity_and_venv_info_to_.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/migrations/versions/d4fe3708d309_make_applyworkflow_workflow_dump_non_.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/migrations/versions/da2cb2ac4255_user_group_viewer_paths.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/migrations/versions/e75cac726012_make_applyworkflow_start_timestamp_not_.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/migrations/versions/efa89c30e0a4_add_project_timestamp_created.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/migrations/versions/f384e1c0cf5d_drop_task_default_args_columns.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/py.typed +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/ssh/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/ssh/_fabric.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/string_tools.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/syringe.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/tasks/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/tasks/utils.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/tasks/v1/_TaskCollectPip.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/tasks/v1/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/tasks/v1/background_operations.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/tasks/v1/endpoint_operations.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/tasks/v1/get_collection_data.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/tasks/v1/utils.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/tasks/v2/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/tasks/v2/local/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/tasks/v2/local/_utils.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/tasks/v2/local/collect.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/tasks/v2/local/deactivate.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/tasks/v2/local/reactivate.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/tasks/v2/ssh/__init__.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/tasks/v2/ssh/_utils.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/tasks/v2/ssh/collect.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/tasks/v2/ssh/deactivate.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/tasks/v2/ssh/reactivate.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/tasks/v2/templates/1_create_venv.sh +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/tasks/v2/templates/2_pip_install.sh +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/tasks/v2/templates/3_pip_freeze.sh +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/tasks/v2/templates/4_pip_show.sh +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/tasks/v2/templates/5_get_venv_size_and_file_number.sh +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/tasks/v2/templates/6_pip_install_from_freeze.sh +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/tasks/v2/utils_background.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/tasks/v2/utils_database.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/tasks/v2/utils_package_names.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/tasks/v2/utils_python_interpreter.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/tasks/v2/utils_templates.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/urls.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/utils.py +0 -0
- {fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/zip_tools.py +0 -0
@@ -0,0 +1 @@
|
|
1
|
+
__VERSION__ = "2.9.0a10"
|
{fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/admin/v2/task.py
RENAMED
@@ -7,6 +7,7 @@ from fastapi import status
|
|
7
7
|
from pydantic import BaseModel
|
8
8
|
from pydantic import EmailStr
|
9
9
|
from pydantic import Field
|
10
|
+
from sqlmodel import func
|
10
11
|
from sqlmodel import select
|
11
12
|
|
12
13
|
from fractal_server.app.db import AsyncSession
|
@@ -60,6 +61,9 @@ async def query_tasks(
|
|
60
61
|
version: Optional[str] = None,
|
61
62
|
name: Optional[str] = None,
|
62
63
|
max_number_of_results: int = 25,
|
64
|
+
category: Optional[str] = None,
|
65
|
+
modality: Optional[str] = None,
|
66
|
+
author: Optional[str] = None,
|
63
67
|
user: UserOAuth = Depends(current_active_superuser),
|
64
68
|
db: AsyncSession = Depends(get_async_db),
|
65
69
|
) -> list[TaskV2Info]:
|
@@ -74,6 +78,9 @@ async def query_tasks(
|
|
74
78
|
version: If not `None`, query for matching `task.version`.
|
75
79
|
name: If not `None`, query for contained case insensitive `task.name`.
|
76
80
|
max_number_of_results: The maximum length of the response.
|
81
|
+
category:
|
82
|
+
modality:
|
83
|
+
author:
|
77
84
|
"""
|
78
85
|
|
79
86
|
stm = select(TaskV2)
|
@@ -86,6 +93,12 @@ async def query_tasks(
|
|
86
93
|
stm = stm.where(TaskV2.version == version)
|
87
94
|
if name is not None:
|
88
95
|
stm = stm.where(TaskV2.name.icontains(name))
|
96
|
+
if category is not None:
|
97
|
+
stm = stm.where(func.lower(TaskV2.category) == category.lower())
|
98
|
+
if modality is not None:
|
99
|
+
stm = stm.where(func.lower(TaskV2.modality) == modality.lower())
|
100
|
+
if author is not None:
|
101
|
+
stm = stm.where(TaskV2.authors.icontains(author))
|
89
102
|
|
90
103
|
res = await db.execute(stm)
|
91
104
|
task_list = res.scalars().all()
|
{fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/auth/current_user.py
RENAMED
@@ -1,6 +1,8 @@
|
|
1
1
|
"""
|
2
2
|
Definition of `/auth/current-user/` endpoints
|
3
3
|
"""
|
4
|
+
import os
|
5
|
+
|
4
6
|
from fastapi import APIRouter
|
5
7
|
from fastapi import Depends
|
6
8
|
from fastapi_users import schemas
|
@@ -22,6 +24,8 @@ from fractal_server.app.schemas import UserSettingsReadStrict
|
|
22
24
|
from fractal_server.app.schemas import UserSettingsUpdateStrict
|
23
25
|
from fractal_server.app.security import get_user_manager
|
24
26
|
from fractal_server.app.security import UserManager
|
27
|
+
from fractal_server.config import get_settings
|
28
|
+
from fractal_server.syringe import Inject
|
25
29
|
|
26
30
|
router_current_user = APIRouter()
|
27
31
|
|
@@ -109,26 +113,65 @@ async def patch_current_user_settings(
|
|
109
113
|
|
110
114
|
|
111
115
|
@router_current_user.get(
|
112
|
-
"/current-user/viewer-paths/", response_model=list[str]
|
116
|
+
"/current-user/allowed-viewer-paths/", response_model=list[str]
|
113
117
|
)
|
114
|
-
async def
|
118
|
+
async def get_current_user_allowed_viewer_paths(
|
115
119
|
current_user: UserOAuth = Depends(current_active_user),
|
116
120
|
db: AsyncSession = Depends(get_async_db),
|
117
121
|
) -> list[str]:
|
118
|
-
"""
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
.where(LinkUserGroup.group_id == UserGroup.id)
|
123
|
-
.where(LinkUserGroup.user_id == current_user.id)
|
124
|
-
)
|
125
|
-
res = await db.execute(cmd)
|
126
|
-
viewer_paths_nested = res.scalars().all()
|
122
|
+
"""
|
123
|
+
Returns the allowed viewer paths for current user, according to the
|
124
|
+
selected FRACTAL_VIEWER_AUTHORIZATION_SCHEME
|
125
|
+
"""
|
127
126
|
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
all_viewer_paths = list(all_viewer_paths_set)
|
127
|
+
settings = Inject(get_settings)
|
128
|
+
|
129
|
+
if settings.FRACTAL_VIEWER_AUTHORIZATION_SCHEME == "none":
|
130
|
+
return []
|
133
131
|
|
134
|
-
|
132
|
+
authorized_paths = []
|
133
|
+
|
134
|
+
# Respond with 422 error if user has no settings
|
135
|
+
verify_user_has_settings(current_user)
|
136
|
+
|
137
|
+
# Load current user settings
|
138
|
+
current_user_settings = await db.get(
|
139
|
+
UserSettings, current_user.user_settings_id
|
140
|
+
)
|
141
|
+
# If project_dir is set, append it to the list of authorized paths
|
142
|
+
if current_user_settings.project_dir is not None:
|
143
|
+
authorized_paths.append(current_user_settings.project_dir)
|
144
|
+
|
145
|
+
# If auth scheme is "users-folders" and `slurm_user` is set,
|
146
|
+
# build and append the user folder
|
147
|
+
if (
|
148
|
+
settings.FRACTAL_VIEWER_AUTHORIZATION_SCHEME == "users-folders"
|
149
|
+
and current_user_settings.slurm_user is not None
|
150
|
+
):
|
151
|
+
base_folder = settings.FRACTAL_VIEWER_BASE_FOLDER
|
152
|
+
user_folder = os.path.join(
|
153
|
+
base_folder, current_user_settings.slurm_user
|
154
|
+
)
|
155
|
+
authorized_paths.append(user_folder)
|
156
|
+
|
157
|
+
if settings.FRACTAL_VIEWER_AUTHORIZATION_SCHEME == "viewer-paths":
|
158
|
+
# Returns the union of `viewer_paths` for all user's groups
|
159
|
+
cmd = (
|
160
|
+
select(UserGroup.viewer_paths)
|
161
|
+
.join(LinkUserGroup)
|
162
|
+
.where(LinkUserGroup.group_id == UserGroup.id)
|
163
|
+
.where(LinkUserGroup.user_id == current_user.id)
|
164
|
+
)
|
165
|
+
res = await db.execute(cmd)
|
166
|
+
viewer_paths_nested = res.scalars().all()
|
167
|
+
|
168
|
+
# Flatten a nested object and make its elements unique
|
169
|
+
all_viewer_paths_set = set(
|
170
|
+
path
|
171
|
+
for _viewer_paths in viewer_paths_nested
|
172
|
+
for path in _viewer_paths
|
173
|
+
)
|
174
|
+
|
175
|
+
authorized_paths.extend(all_viewer_paths_set)
|
176
|
+
|
177
|
+
return authorized_paths
|
@@ -6,14 +6,12 @@ from fastapi import Depends
|
|
6
6
|
from fastapi import HTTPException
|
7
7
|
from fastapi import Response
|
8
8
|
from fastapi import status
|
9
|
-
from sqlalchemy.exc import IntegrityError
|
10
9
|
from sqlalchemy.ext.asyncio import AsyncSession
|
11
|
-
from sqlmodel import col
|
12
|
-
from sqlmodel import func
|
13
10
|
from sqlmodel import select
|
14
11
|
|
15
12
|
from . import current_active_superuser
|
16
13
|
from ._aux_auth import _get_single_usergroup_with_user_ids
|
14
|
+
from ._aux_auth import _user_or_404
|
17
15
|
from ._aux_auth import _usergroup_or_404
|
18
16
|
from fractal_server.app.db import get_async_db
|
19
17
|
from fractal_server.app.models import LinkUserGroup
|
@@ -126,42 +124,6 @@ async def update_single_group(
|
|
126
124
|
|
127
125
|
group = await _usergroup_or_404(group_id, db)
|
128
126
|
|
129
|
-
# Check that all required users exist
|
130
|
-
# Note: The reason for introducing `col` is as in
|
131
|
-
# https://sqlmodel.tiangolo.com/tutorial/where/#type-annotations-and-errors,
|
132
|
-
stm = select(func.count()).where(
|
133
|
-
col(UserOAuth.id).in_(group_update.new_user_ids)
|
134
|
-
)
|
135
|
-
res = await db.execute(stm)
|
136
|
-
number_matching_users = res.scalar()
|
137
|
-
if number_matching_users != len(group_update.new_user_ids):
|
138
|
-
raise HTTPException(
|
139
|
-
status_code=status.HTTP_404_NOT_FOUND,
|
140
|
-
detail=(
|
141
|
-
f"Not all requested users (IDs {group_update.new_user_ids}) "
|
142
|
-
"exist."
|
143
|
-
),
|
144
|
-
)
|
145
|
-
|
146
|
-
# Add new users to existing group
|
147
|
-
for user_id in group_update.new_user_ids:
|
148
|
-
link = LinkUserGroup(user_id=user_id, group_id=group_id)
|
149
|
-
db.add(link)
|
150
|
-
try:
|
151
|
-
await db.commit()
|
152
|
-
except IntegrityError as e:
|
153
|
-
error_msg = (
|
154
|
-
f"Cannot link users with IDs {group_update.new_user_ids} "
|
155
|
-
f"to group {group_id}. "
|
156
|
-
"Likely reason: one of these links already exists.\n"
|
157
|
-
f"Original error: {str(e)}"
|
158
|
-
)
|
159
|
-
logger.info(error_msg)
|
160
|
-
raise HTTPException(
|
161
|
-
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
162
|
-
detail=error_msg,
|
163
|
-
)
|
164
|
-
|
165
127
|
# Patch `viewer_paths`
|
166
128
|
if group_update.viewer_paths is not None:
|
167
129
|
group.viewer_paths = group_update.viewer_paths
|
@@ -239,3 +201,49 @@ async def patch_user_settings_bulk(
|
|
239
201
|
await db.commit()
|
240
202
|
|
241
203
|
return Response(status_code=status.HTTP_200_OK)
|
204
|
+
|
205
|
+
|
206
|
+
@router_group.post("/group/{group_id}/add-user/{user_id}/", status_code=200)
|
207
|
+
async def add_user_to_group(
|
208
|
+
group_id: int,
|
209
|
+
user_id: int,
|
210
|
+
superuser: UserOAuth = Depends(current_active_superuser),
|
211
|
+
db: AsyncSession = Depends(get_async_db),
|
212
|
+
) -> UserGroupRead:
|
213
|
+
await _usergroup_or_404(group_id, db)
|
214
|
+
user = await _user_or_404(user_id, db)
|
215
|
+
link = await db.get(LinkUserGroup, (group_id, user_id))
|
216
|
+
if link is None:
|
217
|
+
db.add(LinkUserGroup(group_id=group_id, user_id=user_id))
|
218
|
+
await db.commit()
|
219
|
+
else:
|
220
|
+
raise HTTPException(
|
221
|
+
status_code=422,
|
222
|
+
detail=(
|
223
|
+
f"User '{user.email}' is already a member of group {group_id}."
|
224
|
+
),
|
225
|
+
)
|
226
|
+
group = await _get_single_usergroup_with_user_ids(group_id=group_id, db=db)
|
227
|
+
return group
|
228
|
+
|
229
|
+
|
230
|
+
@router_group.post("/group/{group_id}/remove-user/{user_id}/", status_code=200)
|
231
|
+
async def remove_user_from_group(
|
232
|
+
group_id: int,
|
233
|
+
user_id: int,
|
234
|
+
superuser: UserOAuth = Depends(current_active_superuser),
|
235
|
+
db: AsyncSession = Depends(get_async_db),
|
236
|
+
) -> UserGroupRead:
|
237
|
+
await _usergroup_or_404(group_id, db)
|
238
|
+
user = await _user_or_404(user_id, db)
|
239
|
+
link = await db.get(LinkUserGroup, (group_id, user_id))
|
240
|
+
if link is None:
|
241
|
+
raise HTTPException(
|
242
|
+
status_code=422,
|
243
|
+
detail=f"User '{user.email}' is not a member of group {group_id}.",
|
244
|
+
)
|
245
|
+
else:
|
246
|
+
await db.delete(link)
|
247
|
+
await db.commit()
|
248
|
+
group = await _get_single_usergroup_with_user_ids(group_id=group_id, db=db)
|
249
|
+
return group
|
@@ -59,21 +59,10 @@ class UserGroupCreate(BaseModel, extra=Extra.forbid):
|
|
59
59
|
class UserGroupUpdate(BaseModel, extra=Extra.forbid):
|
60
60
|
"""
|
61
61
|
Schema for `UserGroup` update
|
62
|
-
|
63
|
-
NOTE: `new_user_ids` does not correspond to a column of the `UserGroup`
|
64
|
-
table, but it is rather used to create new `LinkUserGroup` rows.
|
65
|
-
|
66
|
-
Attributes:
|
67
|
-
new_user_ids: IDs of groups to be associated to user.
|
68
62
|
"""
|
69
63
|
|
70
|
-
new_user_ids: list[int] = Field(default_factory=list)
|
71
64
|
viewer_paths: Optional[list[str]] = None
|
72
65
|
|
73
|
-
_val_unique = validator("new_user_ids", allow_reuse=True)(
|
74
|
-
val_unique_list("new_user_ids")
|
75
|
-
)
|
76
|
-
|
77
66
|
@validator("viewer_paths")
|
78
67
|
def viewer_paths_validator(cls, value):
|
79
68
|
for i, path in enumerate(value):
|
@@ -87,7 +87,7 @@ class Settings(BaseSettings):
|
|
87
87
|
"""
|
88
88
|
Contains all the configuration variables for Fractal Server
|
89
89
|
|
90
|
-
The attributes of this class are set from the
|
90
|
+
The attributes of this class are set from the environment.
|
91
91
|
"""
|
92
92
|
|
93
93
|
class Config:
|
@@ -383,7 +383,7 @@ class Settings(BaseSettings):
|
|
383
383
|
@root_validator(pre=True)
|
384
384
|
def check_tasks_python(cls, values) -> None:
|
385
385
|
"""
|
386
|
-
Perform multiple checks of the Python-
|
386
|
+
Perform multiple checks of the Python-interpreter variables.
|
387
387
|
|
388
388
|
1. Each `FRACTAL_TASKS_PYTHON_X_Y` variable must be an absolute path,
|
389
389
|
if set.
|
@@ -432,7 +432,7 @@ class Settings(BaseSettings):
|
|
432
432
|
f"{current_version_dot}"
|
433
433
|
)
|
434
434
|
|
435
|
-
# Unset all existing
|
435
|
+
# Unset all existing interpreters variable
|
436
436
|
for _version in ["3_9", "3_10", "3_11", "3_12"]:
|
437
437
|
key = f"FRACTAL_TASKS_PYTHON_{_version}"
|
438
438
|
if _version == current_version:
|
@@ -498,6 +498,36 @@ class Settings(BaseSettings):
|
|
498
498
|
Maximum value at which to update `pip` before performing task collection.
|
499
499
|
"""
|
500
500
|
|
501
|
+
FRACTAL_VIEWER_AUTHORIZATION_SCHEME: Literal[
|
502
|
+
"viewer-paths", "users-folders", "none"
|
503
|
+
] = "none"
|
504
|
+
"""
|
505
|
+
Defines how the list of allowed viewer paths is built.
|
506
|
+
|
507
|
+
This variable affects the `GET /auth/current-user/allowed-viewer-paths/`
|
508
|
+
response, which is then consumed by
|
509
|
+
[fractal-vizarr-viewer](https://github.com/fractal-analytics-platform/fractal-vizarr-viewer).
|
510
|
+
|
511
|
+
Options:
|
512
|
+
|
513
|
+
- "viewer-paths": The list of allowed viewer paths will include the user's
|
514
|
+
`project_dir` along with any path defined in user groups' `viewer_paths`
|
515
|
+
attributes.
|
516
|
+
- "users-folders": The list will consist of the user's `project_dir` and a
|
517
|
+
user-specific folder. The user folder is constructed by concatenating
|
518
|
+
the base folder `FRACTAL_VIEWER_BASE_FOLDER` with the user's
|
519
|
+
`slurm_user`.
|
520
|
+
- "none": An empty list will be returned, indicating no access to
|
521
|
+
viewer paths. Useful when vizarr viewer is not used.
|
522
|
+
"""
|
523
|
+
|
524
|
+
FRACTAL_VIEWER_BASE_FOLDER: Optional[str] = None
|
525
|
+
"""
|
526
|
+
Base path to Zarr files that will be served by fractal-vizarr-viewer;
|
527
|
+
This variable is required and used only when
|
528
|
+
FRACTAL_VIEWER_AUTHORIZATION_SCHEME is set to "users-folders".
|
529
|
+
"""
|
530
|
+
|
501
531
|
###########################################################################
|
502
532
|
# BUSINESS LOGIC
|
503
533
|
###########################################################################
|
@@ -589,6 +619,23 @@ class Settings(BaseSettings):
|
|
589
619
|
if not self.FRACTAL_TASKS_DIR:
|
590
620
|
raise FractalConfigurationError("FRACTAL_TASKS_DIR cannot be None")
|
591
621
|
|
622
|
+
# FRACTAL_VIEWER_BASE_FOLDER is required when
|
623
|
+
# FRACTAL_VIEWER_AUTHORIZATION_SCHEME is set to "users-folders"
|
624
|
+
# and it must be an absolute path
|
625
|
+
if self.FRACTAL_VIEWER_AUTHORIZATION_SCHEME == "users-folders":
|
626
|
+
viewer_base_folder = self.FRACTAL_VIEWER_BASE_FOLDER
|
627
|
+
if viewer_base_folder is None:
|
628
|
+
raise FractalConfigurationError(
|
629
|
+
"FRACTAL_VIEWER_BASE_FOLDER is required when "
|
630
|
+
"FRACTAL_VIEWER_AUTHORIZATION_SCHEME is set to "
|
631
|
+
"users-folders"
|
632
|
+
)
|
633
|
+
if not Path(viewer_base_folder).is_absolute():
|
634
|
+
raise FractalConfigurationError(
|
635
|
+
f"Non-absolute value for "
|
636
|
+
f"FRACTAL_VIEWER_BASE_FOLDER={viewer_base_folder}"
|
637
|
+
)
|
638
|
+
|
592
639
|
self.check_db()
|
593
640
|
self.check_runner()
|
594
641
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
[tool.poetry]
|
2
2
|
name = "fractal-server"
|
3
|
-
version = "2.9.
|
3
|
+
version = "2.9.0a10"
|
4
4
|
description = "Server component of the Fractal analytics platform"
|
5
5
|
authors = [
|
6
6
|
"Tommaso Comparin <tommaso.comparin@exact-lab.it>",
|
@@ -86,7 +86,7 @@ filterwarnings = [
|
|
86
86
|
]
|
87
87
|
|
88
88
|
[tool.bumpver]
|
89
|
-
current_version = "2.9.
|
89
|
+
current_version = "2.9.0a10"
|
90
90
|
version_pattern = "MAJOR.MINOR.PATCH[PYTAGNUM]"
|
91
91
|
commit_message = "bump version {old_version} -> {new_version}"
|
92
92
|
commit = true
|
@@ -1 +0,0 @@
|
|
1
|
-
__VERSION__ = "2.9.0a8"
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/models/linkusergroup.py
RENAMED
File without changes
|
{fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/models/linkuserproject.py
RENAMED
File without changes
|
File without changes
|
{fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/models/user_settings.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/models/v2/task_group.py
RENAMED
File without changes
|
File without changes
|
{fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/models/v2/workflowtask.py
RENAMED
File without changes
|
File without changes
|
{fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/admin/__init__.py
RENAMED
File without changes
|
File without changes
|
{fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/admin/v2/__init__.py
RENAMED
File without changes
|
{fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/admin/v2/job.py
RENAMED
File without changes
|
{fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/admin/v2/project.py
RENAMED
File without changes
|
{fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/admin/v2/task_group.py
RENAMED
File without changes
|
File without changes
|
{fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/__init__.py
RENAMED
File without changes
|
{fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v1/__init__.py
RENAMED
File without changes
|
File without changes
|
{fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v1/dataset.py
RENAMED
File without changes
|
File without changes
|
{fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v1/project.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v1/workflow.py
RENAMED
File without changes
|
{fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v1/workflowtask.py
RENAMED
File without changes
|
{fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v2/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v2/dataset.py
RENAMED
File without changes
|
{fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v2/images.py
RENAMED
File without changes
|
File without changes
|
{fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v2/project.py
RENAMED
File without changes
|
{fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v2/status.py
RENAMED
File without changes
|
{fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v2/submit.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v2/task_group.py
RENAMED
File without changes
|
File without changes
|
{fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v2/workflow.py
RENAMED
File without changes
|
File without changes
|
{fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/api/v2/workflowtask.py
RENAMED
File without changes
|
{fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/auth/__init__.py
RENAMED
File without changes
|
{fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/auth/_aux_auth.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/auth/register.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/routes/aux/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/compress_folder.py
RENAMED
File without changes
|
File without changes
|
{fractal_server-2.9.0a8 → fractal_server-2.9.0a10}/fractal_server/app/runner/executors/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|