fractal-server 2.17.0a5__tar.gz → 2.17.0a6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/PKG-INFO +4 -5
- fractal_server-2.17.0a6/fractal_server/__init__.py +1 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/profile.py +14 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/task.py +9 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/task_group.py +11 -7
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/__init__.py +9 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/submit.py +1 -3
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/auth/current_user.py +9 -14
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/auth/oauth.py +1 -1
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/auth/users.py +1 -2
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/user.py +3 -3
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/__init__.py +1 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/task_group.py +4 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/config/__init__.py +6 -1
- fractal_server-2.17.0a6/fractal_server/config/_data.py +68 -0
- fractal_server-2.17.0a6/fractal_server/config/_main.py +68 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/config/_oauth.py +2 -2
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/main.py +3 -2
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/pyproject.toml +5 -6
- fractal_server-2.17.0a5/fractal_server/__init__.py +0 -1
- fractal_server-2.17.0a5/fractal_server/config/_main.py +0 -132
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/LICENSE +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/README.md +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/__main__.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/alembic.ini +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/__init__.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/db/__init__.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/models/__init__.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/models/linkusergroup.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/models/linkuserproject.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/models/security.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/models/user_settings.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/__init__.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/accounting.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/dataset.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/history.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/job.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/profile.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/project.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/resource.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/task.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/task_group.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/workflow.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/workflowtask.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/__init__.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/__init__.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/__init__.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/_aux_functions.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/accounting.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/impersonate.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/job.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/project.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/resource.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/task_group_lifecycle.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/__init__.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/_aux_functions.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/_aux_functions_history.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/_aux_functions_task_lifecycle.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/_aux_functions_task_version_update.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/_aux_functions_tasks.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/_aux_task_group_disambiguation.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/dataset.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/history.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/images.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/job.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/pre_submission_checks.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/project.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/status_legacy.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/task.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/task_collection.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/task_collection_custom.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/task_collection_pixi.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/task_group.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/task_group_lifecycle.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/task_version_update.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/workflow.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/workflow_import.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/workflowtask.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/auth/__init__.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/auth/_aux_auth.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/auth/group.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/auth/login.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/auth/register.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/auth/router.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/aux/__init__.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/aux/_job.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/aux/_runner.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/aux/validate_user_profile.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/pagination.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/__init__.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/user_group.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/accounting.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/dataset.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/dumps.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/history.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/job.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/manifest.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/profile.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/project.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/resource.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/status_legacy.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/task.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/task_collection.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/workflow.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/workflowtask.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/security/__init__.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/security/signup_email.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/shutdown.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/config/_database.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/config/_email.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/config/_settings_config.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/data_migrations/2_14_10.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/data_migrations/README.md +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/data_migrations/tools.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/exceptions.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/gunicorn_fractal.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/images/__init__.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/images/models.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/images/status_tools.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/images/tools.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/logger.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/env.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/naming_convention.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/034a469ec2eb_task_groups.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/091b01f51f88_add_usergroup_and_linkusergroup_table.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/0f5f85bb2ae7_add_pre_pinned_packages.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/19eca0dd47a9_user_settings_project_dir.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/1a83a5260664_rename.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/1eac13a26c83_drop_v1_tables.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/316140ff7ee1_remove_usersettings_cache_dir.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/47351f8c7ebc_drop_dataset_filters.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/4c308bcaea2b_add_task_args_schema_and_task_args_.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/4cedeb448a53_workflowtask_foreign_keys_not_nullables.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/501961cfcd85_remove_link_between_v1_and_v2_tasks_.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/50a13d6138fd_initial_schema.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/5bf02391cfef_v2.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/70e77f1c38b0_add_applyworkflow_first_task_index_and_.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/71eefd1dd202_add_slurm_accounts.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/791ce783d3d8_add_indices.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/84bf0fffde30_add_dumps_to_applyworkflow.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/8e8f227a3e36_update_taskv2_post_2_7_0.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/8f79bd162e35_add_docs_info_and_docs_link_to_task_.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/90f6508c6379_drop_useroauth_username.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/94a47ea2d3ff_remove_cache_dir_slurm_user_and_slurm_.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/969d84257cac_add_historyrun_task_id.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/97f444d47249_add_applyworkflow_project_dump.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/981d588fe248_add_executor_error_log.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/99ea79d9e5d2_add_dataset_history.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/9c5ae74c9b98_add_user_settings_table.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/9db60297b8b2_set_ondelete.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/9fd26a2b0de4_add_workflow_timestamp_created.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/a7f4d6137b53_add_workflow_dump_to_applyworkflow.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/a80ac5a352bf_resource_profile.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/af1ef1c83c9b_add_accounting_tables.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/af8673379a5c_drop_old_filter_columns.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/b1e7f7a1ff71_task_group_for_pixi.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/b3ffb095f973_json_to_jsonb.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/c90a7c76e996_job_id_in_history_run.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/d256a7379ab8_taskgroup_activity_and_venv_info_to_.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/d4fe3708d309_make_applyworkflow_workflow_dump_non_.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/da2cb2ac4255_user_group_viewer_paths.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/db09233ad13a_split_filters_and_keep_old_columns.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/e75cac726012_make_applyworkflow_start_timestamp_not_.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/e81103413827_add_job_type_filters.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/efa89c30e0a4_add_project_timestamp_created.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/f37aceb45062_make_historyunit_logfile_required.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/f384e1c0cf5d_drop_task_default_args_columns.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/f65ee53991e3_user_settings_related.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/fbce16ff4e47_new_history_items.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/py.typed +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/__init__.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/components.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/config/__init__.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/config/_local.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/config/_slurm.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/config/slurm_mem_to_MB.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/exceptions.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/__init__.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/base_runner.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/call_command_wrapper.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/local/__init__.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/local/get_local_config.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/local/runner.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_common/__init__.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_common/_batching.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_common/_job_states.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_common/base_slurm_runner.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_common/get_slurm_config.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_common/remote.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_common/slurm_config.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_common/slurm_job_task_models.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_ssh/__init__.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_ssh/run_subprocess.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_ssh/runner.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_ssh/tar_commands.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_sudo/__init__.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_sudo/_subprocess_run_as_user.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_sudo/runner.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/filenames.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/set_start_and_last_task_index.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/task_files.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/v2/__init__.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/v2/_local.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/v2/_slurm_ssh.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/v2/_slurm_sudo.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/v2/db_tools.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/v2/deduplicate_list.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/v2/merge_outputs.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/v2/runner.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/v2/runner_functions.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/v2/submit_workflow.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/v2/task_interface.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/runner/versions.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/ssh/__init__.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/ssh/_fabric.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/string_tools.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/syringe.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/__init__.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/config/__init__.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/config/_pixi.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/config/_python.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/utils.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/__init__.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/local/__init__.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/local/_utils.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/local/collect.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/local/collect_pixi.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/local/deactivate.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/local/deactivate_pixi.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/local/delete.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/local/reactivate.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/local/reactivate_pixi.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/ssh/__init__.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/ssh/_pixi_slurm_ssh.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/ssh/_utils.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/ssh/collect.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/ssh/collect_pixi.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/ssh/deactivate.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/ssh/deactivate_pixi.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/ssh/delete.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/ssh/reactivate.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/ssh/reactivate_pixi.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/templates/1_create_venv.sh +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/templates/2_pip_install.sh +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/templates/3_pip_freeze.sh +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/templates/4_pip_show.sh +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/templates/5_get_venv_size_and_file_number.sh +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/templates/6_pip_install_from_freeze.sh +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/templates/pixi_1_extract.sh +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/templates/pixi_2_install.sh +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/templates/pixi_3_post_install.sh +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/utils_background.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/utils_database.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/utils_package_names.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/utils_pixi.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/utils_python_interpreter.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/utils_templates.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/types/__init__.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/types/validators/__init__.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/types/validators/_common_validators.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/types/validators/_filter_validators.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/types/validators/_workflow_task_arguments_validators.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/urls.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/utils.py +0 -0
- {fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/zip_tools.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: fractal-server
|
|
3
|
-
Version: 2.17.
|
|
3
|
+
Version: 2.17.0a6
|
|
4
4
|
Summary: Backend component of the Fractal analytics platform
|
|
5
5
|
License-Expression: BSD-3-Clause
|
|
6
6
|
License-File: LICENSE
|
|
@@ -13,18 +13,17 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
13
13
|
Classifier: Programming Language :: Python :: 3.13
|
|
14
14
|
Requires-Dist: alembic (>=1.13.1,<2.0.0)
|
|
15
15
|
Requires-Dist: fabric (>=3.2.2,<3.3.0)
|
|
16
|
-
Requires-Dist: fastapi (>=0.
|
|
17
|
-
Requires-Dist: fastapi-users[oauth] (>=
|
|
16
|
+
Requires-Dist: fastapi (>=0.120.0,<0.121.0)
|
|
17
|
+
Requires-Dist: fastapi-users[oauth] (>=15,<16)
|
|
18
18
|
Requires-Dist: gunicorn (>=23.0,<24.0)
|
|
19
19
|
Requires-Dist: packaging (>=25.0.0,<26.0.0)
|
|
20
20
|
Requires-Dist: psycopg[binary] (>=3.1.0,<4.0.0)
|
|
21
21
|
Requires-Dist: pydantic (>=2.12.0,<2.13.0)
|
|
22
22
|
Requires-Dist: pydantic-settings (==2.11.0)
|
|
23
|
-
Requires-Dist: python-dotenv (>=1.1.0,<1.2.0)
|
|
24
23
|
Requires-Dist: sqlalchemy[asyncio] (>=2.0.23,<2.1)
|
|
25
24
|
Requires-Dist: sqlmodel (==0.0.27)
|
|
26
25
|
Requires-Dist: tomli_w (>=1.2.0,<1.3.0)
|
|
27
|
-
Requires-Dist: uvicorn (>=0.
|
|
26
|
+
Requires-Dist: uvicorn (>=0.38.0,<0.39.0)
|
|
28
27
|
Requires-Dist: uvicorn-worker (==0.4.0)
|
|
29
28
|
Project-URL: Documentation, https://fractal-analytics-platform.github.io/fractal-server
|
|
30
29
|
Project-URL: Homepage, https://github.com/fractal-analytics-platform/fractal-server
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__VERSION__ = "2.17.0a6"
|
{fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/profile.py
RENAMED
|
@@ -10,6 +10,7 @@ from ._aux_functions import _check_profile_name
|
|
|
10
10
|
from ._aux_functions import _get_profile_or_404
|
|
11
11
|
from fractal_server.app.db import AsyncSession
|
|
12
12
|
from fractal_server.app.db import get_async_db
|
|
13
|
+
from fractal_server.app.models import Profile
|
|
13
14
|
from fractal_server.app.models import UserOAuth
|
|
14
15
|
from fractal_server.app.routes.auth import current_superuser_act
|
|
15
16
|
from fractal_server.app.schemas.v2 import ProfileCreate
|
|
@@ -31,6 +32,19 @@ async def get_single_profile(
|
|
|
31
32
|
return profile
|
|
32
33
|
|
|
33
34
|
|
|
35
|
+
@router.get("/", response_model=list[ProfileRead], status_code=200)
|
|
36
|
+
async def get_profile_list(
|
|
37
|
+
superuser: UserOAuth = Depends(current_superuser_act),
|
|
38
|
+
db: AsyncSession = Depends(get_async_db),
|
|
39
|
+
) -> ProfileRead:
|
|
40
|
+
"""
|
|
41
|
+
Query single `Profile`.
|
|
42
|
+
"""
|
|
43
|
+
res = await db.execute(select(Profile).order_by(Profile.id))
|
|
44
|
+
profiles = res.scalars().all()
|
|
45
|
+
return profiles
|
|
46
|
+
|
|
47
|
+
|
|
34
48
|
@router.put("/{profile_id}/", response_model=ProfileRead, status_code=200)
|
|
35
49
|
async def put_profile(
|
|
36
50
|
profile_id: int,
|
{fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/task.py
RENAMED
|
@@ -10,6 +10,7 @@ from sqlmodel import select
|
|
|
10
10
|
|
|
11
11
|
from fractal_server.app.db import AsyncSession
|
|
12
12
|
from fractal_server.app.db import get_async_db
|
|
13
|
+
from fractal_server.app.models import TaskGroupV2
|
|
13
14
|
from fractal_server.app.models import UserOAuth
|
|
14
15
|
from fractal_server.app.models.v2 import TaskV2
|
|
15
16
|
from fractal_server.app.models.v2 import WorkflowTaskV2
|
|
@@ -58,6 +59,7 @@ async def query_tasks(
|
|
|
58
59
|
category: str | None = None,
|
|
59
60
|
modality: str | None = None,
|
|
60
61
|
author: str | None = None,
|
|
62
|
+
resource_id: int | None = None,
|
|
61
63
|
user: UserOAuth = Depends(current_superuser_act),
|
|
62
64
|
db: AsyncSession = Depends(get_async_db),
|
|
63
65
|
) -> list[TaskV2Info]:
|
|
@@ -75,6 +77,7 @@ async def query_tasks(
|
|
|
75
77
|
category:
|
|
76
78
|
modality:
|
|
77
79
|
author:
|
|
80
|
+
resource_id:
|
|
78
81
|
"""
|
|
79
82
|
|
|
80
83
|
stm = select(TaskV2)
|
|
@@ -93,6 +96,12 @@ async def query_tasks(
|
|
|
93
96
|
stm = stm.where(func.lower(TaskV2.modality) == modality.lower())
|
|
94
97
|
if author is not None:
|
|
95
98
|
stm = stm.where(TaskV2.authors.icontains(author))
|
|
99
|
+
if resource_id is not None:
|
|
100
|
+
stm = (
|
|
101
|
+
stm.join(TaskGroupV2)
|
|
102
|
+
.where(TaskGroupV2.id == TaskV2.taskgroupv2_id)
|
|
103
|
+
.where(TaskGroupV2.resource_id == resource_id)
|
|
104
|
+
)
|
|
96
105
|
|
|
97
106
|
res = await db.execute(stm)
|
|
98
107
|
task_list = res.scalars().all()
|
{fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/task_group.py
RENAMED
|
@@ -19,11 +19,12 @@ from fractal_server.app.routes.auth._aux_auth import (
|
|
|
19
19
|
from fractal_server.app.schemas.v2 import TaskGroupActivityActionV2
|
|
20
20
|
from fractal_server.app.schemas.v2 import TaskGroupActivityStatusV2
|
|
21
21
|
from fractal_server.app.schemas.v2 import TaskGroupActivityV2Read
|
|
22
|
-
from fractal_server.app.schemas.v2 import
|
|
22
|
+
from fractal_server.app.schemas.v2 import TaskGroupReadSuperuser
|
|
23
23
|
from fractal_server.app.schemas.v2 import TaskGroupUpdateV2
|
|
24
24
|
from fractal_server.app.schemas.v2 import TaskGroupV2OriginEnum
|
|
25
25
|
from fractal_server.logger import set_logger
|
|
26
26
|
|
|
27
|
+
|
|
27
28
|
router = APIRouter()
|
|
28
29
|
|
|
29
30
|
logger = set_logger(__name__)
|
|
@@ -64,12 +65,12 @@ async def get_task_group_activity_list(
|
|
|
64
65
|
return activities
|
|
65
66
|
|
|
66
67
|
|
|
67
|
-
@router.get("/{task_group_id}/", response_model=
|
|
68
|
+
@router.get("/{task_group_id}/", response_model=TaskGroupReadSuperuser)
|
|
68
69
|
async def query_task_group(
|
|
69
70
|
task_group_id: int,
|
|
70
71
|
user: UserOAuth = Depends(current_superuser_act),
|
|
71
72
|
db: AsyncSession = Depends(get_async_db),
|
|
72
|
-
) ->
|
|
73
|
+
) -> TaskGroupReadSuperuser:
|
|
73
74
|
task_group = await db.get(TaskGroupV2, task_group_id)
|
|
74
75
|
if task_group is None:
|
|
75
76
|
raise HTTPException(
|
|
@@ -79,7 +80,7 @@ async def query_task_group(
|
|
|
79
80
|
return task_group
|
|
80
81
|
|
|
81
82
|
|
|
82
|
-
@router.get("/", response_model=list[
|
|
83
|
+
@router.get("/", response_model=list[TaskGroupReadSuperuser])
|
|
83
84
|
async def query_task_group_list(
|
|
84
85
|
user_id: int | None = None,
|
|
85
86
|
user_group_id: int | None = None,
|
|
@@ -89,9 +90,10 @@ async def query_task_group_list(
|
|
|
89
90
|
origin: TaskGroupV2OriginEnum | None = None,
|
|
90
91
|
timestamp_last_used_min: AwareDatetime | None = None,
|
|
91
92
|
timestamp_last_used_max: AwareDatetime | None = None,
|
|
93
|
+
resource_id: int | None = None,
|
|
92
94
|
user: UserOAuth = Depends(current_superuser_act),
|
|
93
95
|
db: AsyncSession = Depends(get_async_db),
|
|
94
|
-
) -> list[
|
|
96
|
+
) -> list[TaskGroupReadSuperuser]:
|
|
95
97
|
stm = select(TaskGroupV2)
|
|
96
98
|
|
|
97
99
|
if user_group_id is not None and private is True:
|
|
@@ -128,19 +130,21 @@ async def query_task_group_list(
|
|
|
128
130
|
stm = stm.where(
|
|
129
131
|
TaskGroupV2.timestamp_last_used <= timestamp_last_used_max
|
|
130
132
|
)
|
|
133
|
+
if resource_id is not None:
|
|
134
|
+
stm = stm.where(TaskGroupV2.resource_id == resource_id)
|
|
131
135
|
|
|
132
136
|
res = await db.execute(stm)
|
|
133
137
|
task_groups_list = res.scalars().all()
|
|
134
138
|
return task_groups_list
|
|
135
139
|
|
|
136
140
|
|
|
137
|
-
@router.patch("/{task_group_id}/", response_model=
|
|
141
|
+
@router.patch("/{task_group_id}/", response_model=TaskGroupReadSuperuser)
|
|
138
142
|
async def patch_task_group(
|
|
139
143
|
task_group_id: int,
|
|
140
144
|
task_group_update: TaskGroupUpdateV2,
|
|
141
145
|
user: UserOAuth = Depends(current_superuser_act),
|
|
142
146
|
db: AsyncSession = Depends(get_async_db),
|
|
143
|
-
) -> list[
|
|
147
|
+
) -> list[TaskGroupReadSuperuser]:
|
|
144
148
|
task_group = await db.get(TaskGroupV2, task_group_id)
|
|
145
149
|
if task_group is None:
|
|
146
150
|
raise HTTPException(
|
{fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/__init__.py
RENAMED
|
@@ -7,6 +7,7 @@ from fastapi import Depends
|
|
|
7
7
|
import fractal_server
|
|
8
8
|
from fractal_server.app.models import UserOAuth
|
|
9
9
|
from fractal_server.app.routes.auth import current_superuser_act
|
|
10
|
+
from fractal_server.config import get_data_settings
|
|
10
11
|
from fractal_server.config import get_db_settings
|
|
11
12
|
from fractal_server.config import get_email_settings
|
|
12
13
|
from fractal_server.config import get_oauth_settings
|
|
@@ -48,6 +49,14 @@ async def view_email_settings(
|
|
|
48
49
|
return settings.model_dump()
|
|
49
50
|
|
|
50
51
|
|
|
52
|
+
@router_api.get("/settings/data/")
|
|
53
|
+
async def view_data_settings(
|
|
54
|
+
user: UserOAuth = Depends(current_superuser_act),
|
|
55
|
+
):
|
|
56
|
+
settings = Inject(get_data_settings)
|
|
57
|
+
return settings.model_dump()
|
|
58
|
+
|
|
59
|
+
|
|
51
60
|
@router_api.get("/settings/oauth/")
|
|
52
61
|
async def view_oauth_settings(
|
|
53
62
|
user: UserOAuth = Depends(current_superuser_act),
|
{fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/submit.py
RENAMED
|
@@ -196,10 +196,8 @@ async def apply_workflow(
|
|
|
196
196
|
dataset_id=dataset_id,
|
|
197
197
|
workflow_id=workflow_id,
|
|
198
198
|
user_email=user.email,
|
|
199
|
-
# The 'filters' field is not supported any more but still exists as a
|
|
200
|
-
# database column, therefore we manually exclude it from dumps.
|
|
201
199
|
dataset_dump=json.loads(
|
|
202
|
-
dataset.model_dump_json(exclude={"images", "history"
|
|
200
|
+
dataset.model_dump_json(exclude={"images", "history"})
|
|
203
201
|
),
|
|
204
202
|
workflow_dump=json.loads(
|
|
205
203
|
workflow.model_dump_json(exclude={"task_list"})
|
{fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/routes/auth/current_user.py
RENAMED
|
@@ -5,7 +5,6 @@ import os
|
|
|
5
5
|
|
|
6
6
|
from fastapi import APIRouter
|
|
7
7
|
from fastapi import Depends
|
|
8
|
-
from fastapi_users import schemas
|
|
9
8
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
10
9
|
from sqlmodel import select
|
|
11
10
|
|
|
@@ -25,8 +24,8 @@ from fractal_server.app.schemas.user import UserUpdate
|
|
|
25
24
|
from fractal_server.app.schemas.user import UserUpdateStrict
|
|
26
25
|
from fractal_server.app.security import get_user_manager
|
|
27
26
|
from fractal_server.app.security import UserManager
|
|
28
|
-
from fractal_server.config import
|
|
29
|
-
from fractal_server.config import
|
|
27
|
+
from fractal_server.config import DataAuthScheme
|
|
28
|
+
from fractal_server.config import get_data_settings
|
|
30
29
|
from fractal_server.syringe import Inject
|
|
31
30
|
|
|
32
31
|
router_current_user = APIRouter()
|
|
@@ -66,7 +65,7 @@ async def patch_current_user(
|
|
|
66
65
|
# their own password
|
|
67
66
|
|
|
68
67
|
user = await user_manager.update(update, current_user, safe=True)
|
|
69
|
-
validated_user =
|
|
68
|
+
validated_user = UserOAuth.model_validate(user.model_dump())
|
|
70
69
|
|
|
71
70
|
patched_user = await db.get(
|
|
72
71
|
UserOAuth, validated_user.id, populate_existing=True
|
|
@@ -117,14 +116,14 @@ async def get_current_user_allowed_viewer_paths(
|
|
|
117
116
|
) -> list[str]:
|
|
118
117
|
"""
|
|
119
118
|
Returns the allowed viewer paths for current user, according to the
|
|
120
|
-
selected
|
|
119
|
+
selected FRACTAL_DATA_AUTH_SCHEME
|
|
121
120
|
"""
|
|
122
121
|
|
|
123
|
-
|
|
122
|
+
data_settings = Inject(get_data_settings)
|
|
124
123
|
|
|
125
124
|
authorized_paths = []
|
|
126
125
|
|
|
127
|
-
if
|
|
126
|
+
if data_settings.FRACTAL_DATA_AUTH_SCHEME == DataAuthScheme.NONE:
|
|
128
127
|
return authorized_paths
|
|
129
128
|
|
|
130
129
|
# Append `project_dir` to the list of authorized paths
|
|
@@ -133,20 +132,16 @@ async def get_current_user_allowed_viewer_paths(
|
|
|
133
132
|
# If auth scheme is "users-folders" and `slurm_user` is set,
|
|
134
133
|
# build and append the user folder
|
|
135
134
|
if (
|
|
136
|
-
|
|
137
|
-
== ViewerAuthScheme.USERS_FOLDERS
|
|
135
|
+
data_settings.FRACTAL_DATA_AUTH_SCHEME == DataAuthScheme.USERS_FOLDERS
|
|
138
136
|
and current_user.profile_id is not None
|
|
139
137
|
):
|
|
140
138
|
profile = await db.get(Profile, current_user.profile_id)
|
|
141
139
|
if profile is not None and profile.username is not None:
|
|
142
|
-
base_folder =
|
|
140
|
+
base_folder = data_settings.FRACTAL_DATA_BASE_FOLDER
|
|
143
141
|
user_folder = os.path.join(base_folder, profile.username)
|
|
144
142
|
authorized_paths.append(user_folder)
|
|
145
143
|
|
|
146
|
-
if
|
|
147
|
-
settings.FRACTAL_VIEWER_AUTHORIZATION_SCHEME
|
|
148
|
-
== ViewerAuthScheme.VIEWER_PATHS
|
|
149
|
-
):
|
|
144
|
+
if data_settings.FRACTAL_DATA_AUTH_SCHEME == DataAuthScheme.VIEWER_PATHS:
|
|
150
145
|
# Returns the union of `viewer_paths` for all user's groups
|
|
151
146
|
cmd = (
|
|
152
147
|
select(UserGroup.viewer_paths)
|
|
@@ -29,7 +29,7 @@ def _create_client_oidc(cfg: OAuthSettings) -> OpenID:
|
|
|
29
29
|
return OpenID(
|
|
30
30
|
client_id=cfg.OAUTH_CLIENT_ID.get_secret_value(),
|
|
31
31
|
client_secret=cfg.OAUTH_CLIENT_SECRET.get_secret_value(),
|
|
32
|
-
openid_configuration_endpoint=cfg.OAUTH_OIDC_CONFIG_ENDPOINT,
|
|
32
|
+
openid_configuration_endpoint=cfg.OAUTH_OIDC_CONFIG_ENDPOINT.get_secret_value(), # noqa
|
|
33
33
|
)
|
|
34
34
|
|
|
35
35
|
|
|
@@ -6,7 +6,6 @@ from fastapi import Depends
|
|
|
6
6
|
from fastapi import HTTPException
|
|
7
7
|
from fastapi import status
|
|
8
8
|
from fastapi_users import exceptions
|
|
9
|
-
from fastapi_users import schemas
|
|
10
9
|
from fastapi_users.router.common import ErrorCode
|
|
11
10
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
12
11
|
from sqlmodel import func
|
|
@@ -80,7 +79,7 @@ async def patch_user(
|
|
|
80
79
|
safe=False,
|
|
81
80
|
request=None,
|
|
82
81
|
)
|
|
83
|
-
validated_user =
|
|
82
|
+
validated_user = UserOAuth.model_validate(user.model_dump())
|
|
84
83
|
patched_user = await db.get(
|
|
85
84
|
UserOAuth, validated_user.id, populate_existing=True
|
|
86
85
|
)
|
|
@@ -76,8 +76,8 @@ class UserUpdate(schemas.BaseUserUpdate):
|
|
|
76
76
|
profile_id: int | None = None
|
|
77
77
|
project_dir: Annotated[
|
|
78
78
|
AbsolutePathStr, AfterValidator(_validate_cmd)
|
|
79
|
-
]
|
|
80
|
-
slurm_accounts: ListUniqueNonEmptyString
|
|
79
|
+
] = None
|
|
80
|
+
slurm_accounts: ListUniqueNonEmptyString = None
|
|
81
81
|
|
|
82
82
|
|
|
83
83
|
class UserUpdateStrict(BaseModel):
|
|
@@ -89,7 +89,7 @@ class UserUpdateStrict(BaseModel):
|
|
|
89
89
|
"""
|
|
90
90
|
|
|
91
91
|
model_config = ConfigDict(extra="forbid")
|
|
92
|
-
slurm_accounts: ListUniqueNonEmptyString
|
|
92
|
+
slurm_accounts: ListUniqueNonEmptyString = None
|
|
93
93
|
|
|
94
94
|
|
|
95
95
|
class UserCreate(schemas.BaseUserCreate):
|
{fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/__init__.py
RENAMED
|
@@ -52,6 +52,7 @@ from .task_group import TaskGroupActivityStatusV2 # noqa F401
|
|
|
52
52
|
from .task_group import TaskGroupActivityV2Read # noqa F401
|
|
53
53
|
from .task_group import TaskGroupCreateV2 # noqa F401
|
|
54
54
|
from .task_group import TaskGroupCreateV2Strict # noqa F401
|
|
55
|
+
from .task_group import TaskGroupReadSuperuser # noqa F401
|
|
55
56
|
from .task_group import TaskGroupReadV2 # noqa F401
|
|
56
57
|
from .task_group import TaskGroupUpdateV2 # noqa F401
|
|
57
58
|
from .task_group import TaskGroupV2OriginEnum # noqa F401
|
{fractal_server-2.17.0a5 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/task_group.py
RENAMED
|
@@ -96,6 +96,10 @@ class TaskGroupReadV2(BaseModel):
|
|
|
96
96
|
return v.isoformat()
|
|
97
97
|
|
|
98
98
|
|
|
99
|
+
class TaskGroupReadSuperuser(TaskGroupReadV2):
|
|
100
|
+
resource_id: int
|
|
101
|
+
|
|
102
|
+
|
|
99
103
|
class TaskGroupUpdateV2(BaseModel):
|
|
100
104
|
model_config = ConfigDict(extra="forbid")
|
|
101
105
|
user_group_id: int | None = None
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
from ._data import DataAuthScheme # noqa F401
|
|
2
|
+
from ._data import DataSettings
|
|
1
3
|
from ._database import DatabaseSettings
|
|
2
4
|
from ._email import EmailSettings
|
|
3
5
|
from ._email import PublicEmailSettings # noqa F401
|
|
4
6
|
from ._main import Settings
|
|
5
|
-
from ._main import ViewerAuthScheme # noqa F401
|
|
6
7
|
from ._oauth import OAuthSettings
|
|
7
8
|
|
|
8
9
|
|
|
@@ -20,3 +21,7 @@ def get_email_settings(email_settings=EmailSettings()) -> EmailSettings:
|
|
|
20
21
|
|
|
21
22
|
def get_oauth_settings(oauth_settings=OAuthSettings()) -> OAuthSettings:
|
|
22
23
|
return oauth_settings
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def get_data_settings(data_settings=DataSettings()) -> DataSettings:
|
|
27
|
+
return data_settings
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
from enum import StrEnum
|
|
2
|
+
from typing import Self
|
|
3
|
+
|
|
4
|
+
from pydantic import model_validator
|
|
5
|
+
from pydantic_settings import BaseSettings
|
|
6
|
+
from pydantic_settings import SettingsConfigDict
|
|
7
|
+
|
|
8
|
+
from ._settings_config import SETTINGS_CONFIG_DICT
|
|
9
|
+
from fractal_server.types import AbsolutePathStr
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class DataAuthScheme(StrEnum):
|
|
13
|
+
VIEWER_PATHS = "viewer-paths"
|
|
14
|
+
USERS_FOLDERS = "users-folders"
|
|
15
|
+
NONE = "none"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class DataSettings(BaseSettings):
|
|
19
|
+
"""
|
|
20
|
+
Settings for the `fractal-data` integration.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
model_config = SettingsConfigDict(**SETTINGS_CONFIG_DICT)
|
|
24
|
+
|
|
25
|
+
FRACTAL_DATA_AUTH_SCHEME: DataAuthScheme = "none"
|
|
26
|
+
"""
|
|
27
|
+
Defines how the list of allowed viewer paths is built.
|
|
28
|
+
|
|
29
|
+
This variable affects the `GET /auth/current-user/allowed-viewer-paths/`
|
|
30
|
+
response, which is then consumed by
|
|
31
|
+
[fractal-data](https://github.com/fractal-analytics-platform/fractal-data).
|
|
32
|
+
|
|
33
|
+
Options:
|
|
34
|
+
|
|
35
|
+
- "viewer-paths": The list of allowed viewer paths will include the user's
|
|
36
|
+
`project_dir` along with any path defined in user groups' `viewer_paths`
|
|
37
|
+
attributes.
|
|
38
|
+
- "users-folders": The list will consist of the user's `project_dir` and a
|
|
39
|
+
user-specific folder. The user folder is constructed by concatenating
|
|
40
|
+
the base folder `FRACTAL_DATA_BASE_FOLDER` with the user's profile
|
|
41
|
+
`username`.
|
|
42
|
+
- "none": An empty list will be returned, indicating no access to
|
|
43
|
+
viewer paths. Useful when vizarr viewer is not used.
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
FRACTAL_DATA_BASE_FOLDER: AbsolutePathStr | None = None
|
|
47
|
+
"""
|
|
48
|
+
Base path to Zarr files that will be served by fractal-vizarr-viewer;
|
|
49
|
+
This variable is required and used only when
|
|
50
|
+
FRACTAL_DATA_AUTHORIZATION_SCHEME is set to "users-folders".
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
@model_validator(mode="after")
|
|
54
|
+
def check(self: Self) -> Self:
|
|
55
|
+
"""
|
|
56
|
+
`FRACTAL_DATA_BASE_FOLDER` is required when
|
|
57
|
+
`FRACTAL_DATA_AUTHORIZATION_SCHEME` is set to `"users-folders"`.
|
|
58
|
+
"""
|
|
59
|
+
if (
|
|
60
|
+
self.FRACTAL_DATA_AUTH_SCHEME == DataAuthScheme.USERS_FOLDERS
|
|
61
|
+
and self.FRACTAL_DATA_BASE_FOLDER is None
|
|
62
|
+
):
|
|
63
|
+
raise ValueError(
|
|
64
|
+
"FRACTAL_DATA_BASE_FOLDER is required when "
|
|
65
|
+
"FRACTAL_DATA_AUTH_SCHEME is set to "
|
|
66
|
+
"users-folders"
|
|
67
|
+
)
|
|
68
|
+
return self
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Literal
|
|
3
|
+
|
|
4
|
+
from pydantic import HttpUrl
|
|
5
|
+
from pydantic import SecretStr
|
|
6
|
+
from pydantic_settings import BaseSettings
|
|
7
|
+
from pydantic_settings import SettingsConfigDict
|
|
8
|
+
|
|
9
|
+
from ._settings_config import SETTINGS_CONFIG_DICT
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class Settings(BaseSettings):
|
|
13
|
+
"""
|
|
14
|
+
Contains all the configuration variables for Fractal Server
|
|
15
|
+
|
|
16
|
+
The attributes of this class are set from the environment.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
model_config = SettingsConfigDict(**SETTINGS_CONFIG_DICT)
|
|
20
|
+
|
|
21
|
+
JWT_EXPIRE_SECONDS: int = 180
|
|
22
|
+
"""
|
|
23
|
+
JWT token lifetime, in seconds.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
JWT_SECRET_KEY: SecretStr
|
|
27
|
+
"""
|
|
28
|
+
JWT secret
|
|
29
|
+
|
|
30
|
+
⚠️ **IMPORTANT**: set this variable to a secure string, and do not disclose
|
|
31
|
+
it.
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
COOKIE_EXPIRE_SECONDS: int = 86400
|
|
35
|
+
"""
|
|
36
|
+
Cookie token lifetime, in seconds.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
# Note: we do not use ResourceType here to avoid circular imports
|
|
40
|
+
FRACTAL_RUNNER_BACKEND: Literal[
|
|
41
|
+
"local", "slurm_ssh", "slurm_sudo"
|
|
42
|
+
] = "local"
|
|
43
|
+
"""
|
|
44
|
+
Select which runner backend to use.
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
FRACTAL_LOGGING_LEVEL: int = logging.INFO
|
|
48
|
+
"""
|
|
49
|
+
Logging-level threshold for logging
|
|
50
|
+
|
|
51
|
+
Only logs of with this level (or higher) will appear in the console logs.
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
FRACTAL_API_MAX_JOB_LIST_LENGTH: int = 50
|
|
55
|
+
"""
|
|
56
|
+
Number of ids that can be stored in the `jobsV2` attribute of
|
|
57
|
+
`app.state`.
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
FRACTAL_GRACEFUL_SHUTDOWN_TIME: int = 30
|
|
61
|
+
"""
|
|
62
|
+
Waiting time for the shutdown phase of executors
|
|
63
|
+
"""
|
|
64
|
+
|
|
65
|
+
FRACTAL_HELP_URL: HttpUrl | None = None
|
|
66
|
+
"""
|
|
67
|
+
The URL of an instance-specific Fractal help page.
|
|
68
|
+
"""
|
|
@@ -37,7 +37,7 @@ class OAuthSettings(BaseSettings):
|
|
|
37
37
|
"""
|
|
38
38
|
Secret to authorise against the identity provider.
|
|
39
39
|
"""
|
|
40
|
-
OAUTH_OIDC_CONFIG_ENDPOINT:
|
|
40
|
+
OAUTH_OIDC_CONFIG_ENDPOINT: SecretStr | None = None
|
|
41
41
|
"""
|
|
42
42
|
OpenID configuration endpoint, for autodiscovery of relevant endpoints.
|
|
43
43
|
"""
|
|
@@ -55,7 +55,7 @@ class OAuthSettings(BaseSettings):
|
|
|
55
55
|
and self.OAUTH_OIDC_CONFIG_ENDPOINT is None
|
|
56
56
|
):
|
|
57
57
|
raise ValueError(
|
|
58
|
-
f"
|
|
58
|
+
f"self.OAUTH_OIDC_CONFIG_ENDPOINT=None but "
|
|
59
59
|
f"{self.OAUTH_CLIENT_NAME=}"
|
|
60
60
|
)
|
|
61
61
|
return self
|
|
@@ -6,6 +6,7 @@ from fastapi import FastAPI
|
|
|
6
6
|
|
|
7
7
|
from .app.routes.aux._runner import _backend_supports_shutdown
|
|
8
8
|
from .app.shutdown import cleanup_after_shutdown
|
|
9
|
+
from .config import get_data_settings
|
|
9
10
|
from .config import get_db_settings
|
|
10
11
|
from .config import get_email_settings
|
|
11
12
|
from .config import get_settings
|
|
@@ -50,16 +51,16 @@ def check_settings() -> None:
|
|
|
50
51
|
ValidationError: If the configuration is invalid.
|
|
51
52
|
"""
|
|
52
53
|
settings = Inject(get_settings)
|
|
53
|
-
settings.check()
|
|
54
54
|
db_settings = Inject(get_db_settings)
|
|
55
55
|
email_settings = Inject(get_email_settings)
|
|
56
|
-
|
|
56
|
+
data_settings = Inject(get_data_settings)
|
|
57
57
|
logger = set_logger("fractal_server_settings")
|
|
58
58
|
logger.debug("Fractal Settings:")
|
|
59
59
|
for key, value in chain(
|
|
60
60
|
db_settings.model_dump().items(),
|
|
61
61
|
settings.model_dump().items(),
|
|
62
62
|
email_settings.model_dump().items(),
|
|
63
|
+
data_settings.model_dump().items(),
|
|
63
64
|
):
|
|
64
65
|
if any(s in key.upper() for s in ["PASSWORD", "SECRET", "KEY"]):
|
|
65
66
|
value = "*****"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "fractal-server"
|
|
3
|
-
version = "2.17.
|
|
3
|
+
version = "2.17.0a6"
|
|
4
4
|
description = "Backend component of the Fractal analytics platform"
|
|
5
5
|
authors = [
|
|
6
6
|
{ name="Tommaso Comparin", email="tommaso.comparin@exact-lab.it" },
|
|
@@ -12,13 +12,12 @@ readme = "README.md"
|
|
|
12
12
|
license = "BSD-3-Clause"
|
|
13
13
|
requires-python = ">=3.11,<3.14"
|
|
14
14
|
dependencies = [
|
|
15
|
-
"
|
|
16
|
-
"fastapi >= 0.118.0, <0.119.0",
|
|
15
|
+
"fastapi >= 0.120.0, <0.121.0",
|
|
17
16
|
"sqlmodel == 0.0.27",
|
|
18
17
|
"sqlalchemy[asyncio] >=2.0.23,<2.1",
|
|
19
|
-
"fastapi-users[oauth] >=
|
|
18
|
+
"fastapi-users[oauth] >=15,<16",
|
|
20
19
|
"alembic >=1.13.1, <2.0.0",
|
|
21
|
-
"uvicorn >= 0.
|
|
20
|
+
"uvicorn >= 0.38.0, <0.39.0",
|
|
22
21
|
"uvicorn-worker == 0.4.0",
|
|
23
22
|
"pydantic >=2.12.0,<2.13.0",
|
|
24
23
|
"pydantic-settings ==2.11.0",
|
|
@@ -95,7 +94,7 @@ filterwarnings = [
|
|
|
95
94
|
markers = ["container", "ssh", "fails_on_macos"]
|
|
96
95
|
|
|
97
96
|
[tool.bumpver]
|
|
98
|
-
current_version = "2.17.
|
|
97
|
+
current_version = "2.17.0a6"
|
|
99
98
|
version_pattern = "MAJOR.MINOR.PATCH[PYTAGNUM]"
|
|
100
99
|
commit_message = "bump version {old_version} -> {new_version}"
|
|
101
100
|
commit = true
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__VERSION__ = "2.17.0a5"
|