fractal-server 2.17.0a8__tar.gz → 2.17.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.17.0a8 → fractal_server-2.17.0a10}/PKG-INFO +1 -1
- fractal_server-2.17.0a10/fractal_server/__init__.py +1 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/admin/v2/resource.py +1 -1
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/admin/v2/task.py +1 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/admin/v2/task_group.py +1 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/api/v2/_aux_functions_tasks.py +13 -5
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/api/v2/_aux_task_group_disambiguation.py +21 -17
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/api/v2/task.py +1 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/api/v2/task_collection.py +3 -2
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/api/v2/task_collection_pixi.py +1 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/api/v2/task_group.py +13 -3
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/api/v2/workflow_import.py +23 -11
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/auth/_aux_auth.py +36 -17
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/auth/current_user.py +2 -1
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/auth/group.py +21 -11
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/auth/users.py +11 -5
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/schemas/user_group.py +2 -1
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/security/__init__.py +40 -22
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/config/_main.py +10 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/v2/utils_pixi.py +3 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/pyproject.toml +3 -2
- fractal_server-2.17.0a8/fractal_server/__init__.py +0 -1
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/LICENSE +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/README.md +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/__main__.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/alembic.ini +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/__init__.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/db/__init__.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/models/__init__.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/models/linkusergroup.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/models/linkuserproject.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/models/security.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/models/user_settings.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/models/v2/__init__.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/models/v2/accounting.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/models/v2/dataset.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/models/v2/history.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/models/v2/job.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/models/v2/profile.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/models/v2/project.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/models/v2/resource.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/models/v2/task.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/models/v2/task_group.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/models/v2/workflow.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/models/v2/workflowtask.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/__init__.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/admin/__init__.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/admin/v2/__init__.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/admin/v2/_aux_functions.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/admin/v2/accounting.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/admin/v2/impersonate.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/admin/v2/job.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/admin/v2/profile.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/admin/v2/project.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/admin/v2/task_group_lifecycle.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/api/__init__.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/api/v2/__init__.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/api/v2/_aux_functions.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/api/v2/_aux_functions_history.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/api/v2/_aux_functions_task_lifecycle.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/api/v2/_aux_functions_task_version_update.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/api/v2/dataset.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/api/v2/history.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/api/v2/images.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/api/v2/job.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/api/v2/pre_submission_checks.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/api/v2/project.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/api/v2/status_legacy.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/api/v2/submit.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/api/v2/task_collection_custom.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/api/v2/task_group_lifecycle.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/api/v2/task_version_update.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/api/v2/workflow.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/api/v2/workflowtask.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/auth/__init__.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/auth/login.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/auth/oauth.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/auth/register.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/auth/router.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/aux/__init__.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/aux/_job.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/aux/_runner.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/aux/validate_user_profile.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/pagination.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/schemas/__init__.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/schemas/user.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/schemas/v2/__init__.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/schemas/v2/accounting.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/schemas/v2/dataset.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/schemas/v2/dumps.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/schemas/v2/history.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/schemas/v2/job.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/schemas/v2/manifest.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/schemas/v2/profile.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/schemas/v2/project.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/schemas/v2/resource.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/schemas/v2/status_legacy.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/schemas/v2/task.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/schemas/v2/task_collection.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/schemas/v2/task_group.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/schemas/v2/workflow.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/schemas/v2/workflowtask.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/security/signup_email.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/shutdown.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/config/__init__.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/config/_data.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/config/_database.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/config/_email.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/config/_oauth.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/config/_settings_config.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/data_migrations/README.md +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/data_migrations/tools.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/exceptions.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/gunicorn_fractal.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/images/__init__.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/images/models.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/images/status_tools.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/images/tools.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/logger.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/main.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/env.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/naming_convention.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/034a469ec2eb_task_groups.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/091b01f51f88_add_usergroup_and_linkusergroup_table.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/0f5f85bb2ae7_add_pre_pinned_packages.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/19eca0dd47a9_user_settings_project_dir.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/1a83a5260664_rename.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/1eac13a26c83_drop_v1_tables.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/316140ff7ee1_remove_usersettings_cache_dir.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/47351f8c7ebc_drop_dataset_filters.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/4c308bcaea2b_add_task_args_schema_and_task_args_.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/4cedeb448a53_workflowtask_foreign_keys_not_nullables.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/501961cfcd85_remove_link_between_v1_and_v2_tasks_.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/50a13d6138fd_initial_schema.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/5bf02391cfef_v2.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/70e77f1c38b0_add_applyworkflow_first_task_index_and_.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/71eefd1dd202_add_slurm_accounts.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/791ce783d3d8_add_indices.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/83bc2ad3ffcc_2_17_0.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/84bf0fffde30_add_dumps_to_applyworkflow.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/8e8f227a3e36_update_taskv2_post_2_7_0.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/8f79bd162e35_add_docs_info_and_docs_link_to_task_.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/94a47ea2d3ff_remove_cache_dir_slurm_user_and_slurm_.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/969d84257cac_add_historyrun_task_id.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/97f444d47249_add_applyworkflow_project_dump.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/981d588fe248_add_executor_error_log.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/99ea79d9e5d2_add_dataset_history.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/9c5ae74c9b98_add_user_settings_table.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/9db60297b8b2_set_ondelete.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/9fd26a2b0de4_add_workflow_timestamp_created.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/a7f4d6137b53_add_workflow_dump_to_applyworkflow.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/af1ef1c83c9b_add_accounting_tables.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/af8673379a5c_drop_old_filter_columns.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/b1e7f7a1ff71_task_group_for_pixi.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/b3ffb095f973_json_to_jsonb.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/c90a7c76e996_job_id_in_history_run.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/d256a7379ab8_taskgroup_activity_and_venv_info_to_.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/d4fe3708d309_make_applyworkflow_workflow_dump_non_.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/da2cb2ac4255_user_group_viewer_paths.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/db09233ad13a_split_filters_and_keep_old_columns.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/e75cac726012_make_applyworkflow_start_timestamp_not_.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/e81103413827_add_job_type_filters.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/efa89c30e0a4_add_project_timestamp_created.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/f37aceb45062_make_historyunit_logfile_required.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/f384e1c0cf5d_drop_task_default_args_columns.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/migrations/versions/fbce16ff4e47_new_history_items.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/py.typed +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/__init__.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/components.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/config/__init__.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/config/_local.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/config/_slurm.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/config/slurm_mem_to_MB.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/exceptions.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/executors/__init__.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/executors/base_runner.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/executors/call_command_wrapper.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/executors/local/__init__.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/executors/local/get_local_config.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/executors/local/runner.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/executors/slurm_common/__init__.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/executors/slurm_common/_batching.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/executors/slurm_common/_job_states.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/executors/slurm_common/base_slurm_runner.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/executors/slurm_common/get_slurm_config.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/executors/slurm_common/remote.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/executors/slurm_common/slurm_config.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/executors/slurm_common/slurm_job_task_models.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/executors/slurm_ssh/__init__.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/executors/slurm_ssh/run_subprocess.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/executors/slurm_ssh/runner.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/executors/slurm_ssh/tar_commands.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/executors/slurm_sudo/__init__.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/executors/slurm_sudo/_subprocess_run_as_user.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/executors/slurm_sudo/runner.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/filenames.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/set_start_and_last_task_index.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/task_files.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/v2/__init__.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/v2/_local.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/v2/_slurm_ssh.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/v2/_slurm_sudo.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/v2/db_tools.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/v2/deduplicate_list.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/v2/merge_outputs.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/v2/runner.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/v2/runner_functions.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/v2/submit_workflow.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/v2/task_interface.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/runner/versions.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/ssh/__init__.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/ssh/_fabric.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/string_tools.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/syringe.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/__init__.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/config/__init__.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/config/_pixi.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/config/_python.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/utils.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/v2/__init__.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/v2/local/__init__.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/v2/local/_utils.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/v2/local/collect.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/v2/local/collect_pixi.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/v2/local/deactivate.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/v2/local/deactivate_pixi.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/v2/local/delete.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/v2/local/reactivate.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/v2/local/reactivate_pixi.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/v2/ssh/__init__.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/v2/ssh/_pixi_slurm_ssh.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/v2/ssh/_utils.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/v2/ssh/collect.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/v2/ssh/collect_pixi.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/v2/ssh/deactivate.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/v2/ssh/deactivate_pixi.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/v2/ssh/delete.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/v2/ssh/reactivate.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/v2/ssh/reactivate_pixi.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/v2/templates/1_create_venv.sh +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/v2/templates/2_pip_install.sh +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/v2/templates/3_pip_freeze.sh +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/v2/templates/4_pip_show.sh +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/v2/templates/5_get_venv_size_and_file_number.sh +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/v2/templates/6_pip_install_from_freeze.sh +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/v2/templates/pixi_1_extract.sh +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/v2/templates/pixi_2_install.sh +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/v2/templates/pixi_3_post_install.sh +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/v2/utils_background.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/v2/utils_database.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/v2/utils_package_names.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/v2/utils_python_interpreter.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/tasks/v2/utils_templates.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/types/__init__.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/types/validators/__init__.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/types/validators/_common_validators.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/types/validators/_filter_validators.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/types/validators/_workflow_task_arguments_validators.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/urls.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/utils.py +0 -0
- {fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/zip_tools.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__VERSION__ = "2.17.0a10"
|
|
@@ -133,6 +133,7 @@ async def query_task_group_list(
|
|
|
133
133
|
if resource_id is not None:
|
|
134
134
|
stm = stm.where(TaskGroupV2.resource_id == resource_id)
|
|
135
135
|
|
|
136
|
+
stm = stm.order_by(TaskGroupV2.id)
|
|
136
137
|
res = await db.execute(stm)
|
|
137
138
|
task_groups_list = res.scalars().all()
|
|
138
139
|
return task_groups_list
|
|
@@ -20,7 +20,9 @@ from fractal_server.app.models.v2 import WorkflowTaskV2
|
|
|
20
20
|
from fractal_server.app.routes.api.v2._aux_functions import (
|
|
21
21
|
_get_user_resource_id,
|
|
22
22
|
)
|
|
23
|
-
from fractal_server.app.routes.auth._aux_auth import
|
|
23
|
+
from fractal_server.app.routes.auth._aux_auth import (
|
|
24
|
+
_get_default_usergroup_id_or_none,
|
|
25
|
+
)
|
|
24
26
|
from fractal_server.app.routes.auth._aux_auth import (
|
|
25
27
|
_verify_user_belongs_to_group,
|
|
26
28
|
)
|
|
@@ -73,7 +75,7 @@ async def _get_task_group_read_access(
|
|
|
73
75
|
status_code=status.HTTP_403_FORBIDDEN,
|
|
74
76
|
detail=(
|
|
75
77
|
"Current user has no read access to TaskGroupV2 "
|
|
76
|
-
f"{task_group_id}."
|
|
78
|
+
f"{task_group_id}."
|
|
77
79
|
),
|
|
78
80
|
)
|
|
79
81
|
|
|
@@ -90,7 +92,7 @@ async def _get_task_group_read_access(
|
|
|
90
92
|
.where(LinkUserGroup.user_id == user_id)
|
|
91
93
|
.where(UserOAuth.id == user_id)
|
|
92
94
|
.where(Profile.id == UserOAuth.profile_id)
|
|
93
|
-
.where(
|
|
95
|
+
.where(task_group.resource_id == Profile.resource_id)
|
|
94
96
|
)
|
|
95
97
|
res = await db.execute(stm)
|
|
96
98
|
link = res.unique().scalars().one_or_none()
|
|
@@ -237,7 +239,7 @@ async def _get_valid_user_group_id(
|
|
|
237
239
|
elif private is True:
|
|
238
240
|
user_group_id = None
|
|
239
241
|
elif user_group_id is None:
|
|
240
|
-
user_group_id = await
|
|
242
|
+
user_group_id = await _get_default_usergroup_id_or_none(db=db)
|
|
241
243
|
else:
|
|
242
244
|
await _verify_user_belongs_to_group(
|
|
243
245
|
user_id=user_id, user_group_id=user_group_id, db=db
|
|
@@ -370,7 +372,9 @@ async def _verify_non_duplication_group_constraint(
|
|
|
370
372
|
|
|
371
373
|
|
|
372
374
|
async def _verify_non_duplication_group_path(
|
|
375
|
+
*,
|
|
373
376
|
path: str | None,
|
|
377
|
+
resource_id: int,
|
|
374
378
|
db: AsyncSession,
|
|
375
379
|
) -> None:
|
|
376
380
|
"""
|
|
@@ -378,7 +382,11 @@ async def _verify_non_duplication_group_path(
|
|
|
378
382
|
"""
|
|
379
383
|
if path is None:
|
|
380
384
|
return
|
|
381
|
-
stm =
|
|
385
|
+
stm = (
|
|
386
|
+
select(TaskGroupV2.id)
|
|
387
|
+
.where(TaskGroupV2.path == path)
|
|
388
|
+
.where(TaskGroupV2.resource_id == resource_id)
|
|
389
|
+
)
|
|
382
390
|
res = await db.execute(stm)
|
|
383
391
|
duplicate_ids = res.scalars().all()
|
|
384
392
|
if duplicate_ids:
|
|
@@ -5,8 +5,10 @@ from sqlmodel import select
|
|
|
5
5
|
from fractal_server.app.db import AsyncSession
|
|
6
6
|
from fractal_server.app.models import LinkUserGroup
|
|
7
7
|
from fractal_server.app.models.v2 import TaskGroupV2
|
|
8
|
+
from fractal_server.config import get_settings
|
|
8
9
|
from fractal_server.exceptions import UnreachableBranchError
|
|
9
10
|
from fractal_server.logger import set_logger
|
|
11
|
+
from fractal_server.syringe import Inject
|
|
10
12
|
|
|
11
13
|
|
|
12
14
|
logger = set_logger(__name__)
|
|
@@ -16,7 +18,7 @@ async def _disambiguate_task_groups(
|
|
|
16
18
|
*,
|
|
17
19
|
matching_task_groups: list[TaskGroupV2],
|
|
18
20
|
user_id: int,
|
|
19
|
-
default_group_id: int,
|
|
21
|
+
default_group_id: int | None,
|
|
20
22
|
db: AsyncSession,
|
|
21
23
|
) -> TaskGroupV2 | None:
|
|
22
24
|
"""
|
|
@@ -49,21 +51,23 @@ async def _disambiguate_task_groups(
|
|
|
49
51
|
)
|
|
50
52
|
|
|
51
53
|
# Medium priority: task groups owned by default user group
|
|
54
|
+
settings = Inject(get_settings)
|
|
52
55
|
list_user_group_ids = [tg.user_group_id for tg in matching_task_groups]
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
56
|
+
if settings.FRACTAL_DEFAULT_GROUP_NAME is not None:
|
|
57
|
+
try:
|
|
58
|
+
ind_user_group_id = list_user_group_ids.index(default_group_id)
|
|
59
|
+
task_group = matching_task_groups[ind_user_group_id]
|
|
60
|
+
logger.debug(
|
|
61
|
+
"[_disambiguate_task_groups] "
|
|
62
|
+
f"Found task group {task_group.id} with {user_id=}, return."
|
|
63
|
+
)
|
|
64
|
+
return task_group
|
|
65
|
+
except ValueError:
|
|
66
|
+
logger.debug(
|
|
67
|
+
"[_disambiguate_task_groups] "
|
|
68
|
+
"No task group with user_group_id="
|
|
69
|
+
f"{default_group_id}, continue."
|
|
70
|
+
)
|
|
67
71
|
|
|
68
72
|
# Lowest priority: task groups owned by other groups, sorted
|
|
69
73
|
# according to age of the user/usergroup link
|
|
@@ -97,7 +101,7 @@ async def _disambiguate_task_groups_not_none(
|
|
|
97
101
|
*,
|
|
98
102
|
matching_task_groups: list[TaskGroupV2],
|
|
99
103
|
user_id: int,
|
|
100
|
-
default_group_id: int,
|
|
104
|
+
default_group_id: int | None,
|
|
101
105
|
db: AsyncSession,
|
|
102
106
|
) -> TaskGroupV2:
|
|
103
107
|
"""
|
|
@@ -133,7 +137,7 @@ async def remove_duplicate_task_groups(
|
|
|
133
137
|
*,
|
|
134
138
|
task_groups: list[TaskGroupV2],
|
|
135
139
|
user_id: int,
|
|
136
|
-
default_group_id: int,
|
|
140
|
+
default_group_id: int | None,
|
|
137
141
|
db: AsyncSession,
|
|
138
142
|
) -> list[TaskGroupV2]:
|
|
139
143
|
"""
|
|
@@ -200,8 +200,8 @@ async def collect_tasks_pip(
|
|
|
200
200
|
raise HTTPException(
|
|
201
201
|
status_code=status.HTTP_422_UNPROCESSABLE_CONTENT,
|
|
202
202
|
detail=(
|
|
203
|
-
f"Python version {task_group_attrs['python_version']}
|
|
204
|
-
"not available
|
|
203
|
+
f"Python version {task_group_attrs['python_version']} "
|
|
204
|
+
"is not available on this Fractal instance."
|
|
205
205
|
),
|
|
206
206
|
)
|
|
207
207
|
|
|
@@ -305,6 +305,7 @@ async def collect_tasks_pip(
|
|
|
305
305
|
)
|
|
306
306
|
await _verify_non_duplication_group_path(
|
|
307
307
|
path=task_group_attrs["path"],
|
|
308
|
+
resource_id=resource_id,
|
|
308
309
|
db=db,
|
|
309
310
|
)
|
|
310
311
|
|
{fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/api/v2/task_group.py
RENAMED
|
@@ -11,6 +11,7 @@ from pydantic.types import AwareDatetime
|
|
|
11
11
|
from sqlmodel import or_
|
|
12
12
|
from sqlmodel import select
|
|
13
13
|
|
|
14
|
+
from ._aux_functions import _get_user_resource_id
|
|
14
15
|
from ._aux_functions_tasks import _get_task_group_full_access
|
|
15
16
|
from ._aux_functions_tasks import _get_task_group_read_access
|
|
16
17
|
from ._aux_functions_tasks import _verify_non_duplication_group_constraint
|
|
@@ -22,7 +23,9 @@ from fractal_server.app.models import UserOAuth
|
|
|
22
23
|
from fractal_server.app.models.v2 import TaskGroupActivityV2
|
|
23
24
|
from fractal_server.app.models.v2 import TaskGroupV2
|
|
24
25
|
from fractal_server.app.routes.auth import current_user_act_ver_prof
|
|
25
|
-
from fractal_server.app.routes.auth._aux_auth import
|
|
26
|
+
from fractal_server.app.routes.auth._aux_auth import (
|
|
27
|
+
_get_default_usergroup_id_or_none,
|
|
28
|
+
)
|
|
26
29
|
from fractal_server.app.routes.auth._aux_auth import (
|
|
27
30
|
_verify_user_belongs_to_group,
|
|
28
31
|
)
|
|
@@ -142,7 +145,14 @@ async def get_task_group_list(
|
|
|
142
145
|
)
|
|
143
146
|
),
|
|
144
147
|
)
|
|
145
|
-
|
|
148
|
+
|
|
149
|
+
user_resource_id = await _get_user_resource_id(user_id=user.id, db=db)
|
|
150
|
+
stm = (
|
|
151
|
+
select(TaskGroupV2)
|
|
152
|
+
.where(TaskGroupV2.resource_id == user_resource_id)
|
|
153
|
+
.where(condition)
|
|
154
|
+
.order_by(TaskGroupV2.pkg_name)
|
|
155
|
+
)
|
|
146
156
|
if only_active:
|
|
147
157
|
stm = stm.where(TaskGroupV2.active)
|
|
148
158
|
|
|
@@ -155,7 +165,7 @@ async def get_task_group_list(
|
|
|
155
165
|
setattr(task, "args_schema_non_parallel", None)
|
|
156
166
|
setattr(task, "args_schema_parallel", None)
|
|
157
167
|
|
|
158
|
-
default_group_id = await
|
|
168
|
+
default_group_id = await _get_default_usergroup_id_or_none(db)
|
|
159
169
|
grouped_result = [
|
|
160
170
|
(
|
|
161
171
|
pkg_name,
|
|
@@ -15,6 +15,7 @@ from ....schemas.v2 import WorkflowReadV2WithWarnings
|
|
|
15
15
|
from ....schemas.v2 import WorkflowTaskCreateV2
|
|
16
16
|
from ._aux_functions import _check_workflow_exists
|
|
17
17
|
from ._aux_functions import _get_project_check_owner
|
|
18
|
+
from ._aux_functions import _get_user_resource_id
|
|
18
19
|
from ._aux_functions import _workflow_insert_task
|
|
19
20
|
from ._aux_functions_tasks import _add_warnings_to_workflow_tasks
|
|
20
21
|
from ._aux_functions_tasks import _check_type_filters_compatibility
|
|
@@ -25,7 +26,9 @@ from fractal_server.app.routes.api.v2._aux_task_group_disambiguation import (
|
|
|
25
26
|
_disambiguate_task_groups,
|
|
26
27
|
)
|
|
27
28
|
from fractal_server.app.routes.auth import current_user_act_ver_prof
|
|
28
|
-
from fractal_server.app.routes.auth._aux_auth import
|
|
29
|
+
from fractal_server.app.routes.auth._aux_auth import (
|
|
30
|
+
_get_default_usergroup_id_or_none,
|
|
31
|
+
)
|
|
29
32
|
from fractal_server.app.schemas.v2 import TaskImportV2
|
|
30
33
|
from fractal_server.logger import set_logger
|
|
31
34
|
|
|
@@ -38,20 +41,26 @@ logger = set_logger(__name__)
|
|
|
38
41
|
async def _get_user_accessible_taskgroups(
|
|
39
42
|
*,
|
|
40
43
|
user_id: int,
|
|
44
|
+
user_resource_id: int,
|
|
41
45
|
db: AsyncSession,
|
|
42
46
|
) -> list[TaskGroupV2]:
|
|
43
47
|
"""
|
|
44
48
|
Retrieve list of task groups that the user has access to.
|
|
45
49
|
"""
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
50
|
+
|
|
51
|
+
stm = (
|
|
52
|
+
select(TaskGroupV2)
|
|
53
|
+
.where(
|
|
54
|
+
or_(
|
|
55
|
+
TaskGroupV2.user_id == user_id,
|
|
56
|
+
TaskGroupV2.user_group_id.in_(
|
|
57
|
+
select(LinkUserGroup.group_id).where(
|
|
58
|
+
LinkUserGroup.user_id == user_id
|
|
59
|
+
)
|
|
60
|
+
),
|
|
61
|
+
)
|
|
54
62
|
)
|
|
63
|
+
.where(TaskGroupV2.resource_id == user_resource_id)
|
|
55
64
|
)
|
|
56
65
|
res = await db.execute(stm)
|
|
57
66
|
accessible_task_groups = res.scalars().all()
|
|
@@ -93,7 +102,7 @@ async def _get_task_by_taskimport(
|
|
|
93
102
|
task_import: TaskImportV2,
|
|
94
103
|
task_groups_list: list[TaskGroupV2],
|
|
95
104
|
user_id: int,
|
|
96
|
-
default_group_id: int,
|
|
105
|
+
default_group_id: int | None,
|
|
97
106
|
db: AsyncSession,
|
|
98
107
|
) -> int | None:
|
|
99
108
|
"""
|
|
@@ -212,6 +221,8 @@ async def import_workflow(
|
|
|
212
221
|
Import an existing workflow into a project and create required objects.
|
|
213
222
|
"""
|
|
214
223
|
|
|
224
|
+
user_resource_id = await _get_user_resource_id(user_id=user.id, db=db)
|
|
225
|
+
|
|
215
226
|
# Preliminary checks
|
|
216
227
|
await _get_project_check_owner(
|
|
217
228
|
project_id=project_id,
|
|
@@ -227,8 +238,9 @@ async def import_workflow(
|
|
|
227
238
|
task_group_list = await _get_user_accessible_taskgroups(
|
|
228
239
|
user_id=user.id,
|
|
229
240
|
db=db,
|
|
241
|
+
user_resource_id=user_resource_id,
|
|
230
242
|
)
|
|
231
|
-
default_group_id = await
|
|
243
|
+
default_group_id = await _get_default_usergroup_id_or_none(db)
|
|
232
244
|
|
|
233
245
|
list_wf_tasks = []
|
|
234
246
|
list_task_ids = []
|
{fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/auth/_aux_auth.py
RENAMED
|
@@ -9,8 +9,10 @@ from fractal_server.app.models.security import UserGroup
|
|
|
9
9
|
from fractal_server.app.models.security import UserOAuth
|
|
10
10
|
from fractal_server.app.schemas.user import UserRead
|
|
11
11
|
from fractal_server.app.schemas.user_group import UserGroupRead
|
|
12
|
-
from fractal_server.
|
|
12
|
+
from fractal_server.config import get_settings
|
|
13
13
|
from fractal_server.logger import set_logger
|
|
14
|
+
from fractal_server.syringe import Inject
|
|
15
|
+
|
|
14
16
|
|
|
15
17
|
logger = set_logger(__name__)
|
|
16
18
|
|
|
@@ -29,6 +31,9 @@ async def _get_single_user_with_groups(
|
|
|
29
31
|
Returns:
|
|
30
32
|
A `UserRead` object with `group_ids_names` dict
|
|
31
33
|
"""
|
|
34
|
+
|
|
35
|
+
settings = Inject(get_settings)
|
|
36
|
+
|
|
32
37
|
stm_groups = (
|
|
33
38
|
select(UserGroup)
|
|
34
39
|
.join(LinkUserGroup)
|
|
@@ -39,25 +44,25 @@ async def _get_single_user_with_groups(
|
|
|
39
44
|
groups = res.scalars().unique().all()
|
|
40
45
|
group_ids_names = [(group.id, group.name) for group in groups]
|
|
41
46
|
|
|
42
|
-
#
|
|
47
|
+
# Identify the default-group position in the list of groups
|
|
43
48
|
index = next(
|
|
44
49
|
(
|
|
45
|
-
|
|
46
|
-
for
|
|
47
|
-
if group_tuple[1] == FRACTAL_DEFAULT_GROUP_NAME
|
|
50
|
+
ind
|
|
51
|
+
for ind, group_tuple in enumerate(group_ids_names)
|
|
52
|
+
if group_tuple[1] == settings.FRACTAL_DEFAULT_GROUP_NAME
|
|
48
53
|
),
|
|
49
54
|
None,
|
|
50
55
|
)
|
|
51
|
-
if index is None:
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
56
|
+
if (index is None) or (index == 0):
|
|
57
|
+
# Either the default group does not exist, or it is already the first
|
|
58
|
+
# one. No action needed.
|
|
59
|
+
pass
|
|
60
|
+
else:
|
|
61
|
+
# Move the default group to the first position
|
|
57
62
|
default_group = group_ids_names.pop(index)
|
|
58
63
|
group_ids_names.insert(0, default_group)
|
|
59
|
-
|
|
60
|
-
|
|
64
|
+
|
|
65
|
+
# Create dump of `user.oauth_accounts` relationship
|
|
61
66
|
oauth_accounts = [
|
|
62
67
|
oauth_account.model_dump() for oauth_account in user.oauth_accounts
|
|
63
68
|
]
|
|
@@ -121,17 +126,31 @@ async def _usergroup_or_404(usergroup_id: int, db: AsyncSession) -> UserGroup:
|
|
|
121
126
|
return user
|
|
122
127
|
|
|
123
128
|
|
|
124
|
-
async def
|
|
129
|
+
async def _get_default_usergroup_id_or_none(db: AsyncSession) -> int | None:
|
|
130
|
+
"""
|
|
131
|
+
Return the ID of the group named `"All"`, if `FRACTAL_DEFAULT_GROUP_NAME`
|
|
132
|
+
is set and such group exists. Return `None`, if
|
|
133
|
+
`FRACTAL_DEFAULT_GROUP_NAME=None` or if the `"All"` group does not exist.
|
|
134
|
+
"""
|
|
135
|
+
settings = Inject(get_settings)
|
|
125
136
|
stm = select(UserGroup.id).where(
|
|
126
|
-
UserGroup.name == FRACTAL_DEFAULT_GROUP_NAME
|
|
137
|
+
UserGroup.name == settings.FRACTAL_DEFAULT_GROUP_NAME
|
|
127
138
|
)
|
|
128
139
|
res = await db.execute(stm)
|
|
129
140
|
user_group_id = res.scalars().one_or_none()
|
|
130
|
-
|
|
141
|
+
|
|
142
|
+
if (
|
|
143
|
+
settings.FRACTAL_DEFAULT_GROUP_NAME is not None
|
|
144
|
+
and user_group_id is None
|
|
145
|
+
):
|
|
131
146
|
raise HTTPException(
|
|
132
147
|
status_code=status.HTTP_404_NOT_FOUND,
|
|
133
|
-
detail=
|
|
148
|
+
detail=(
|
|
149
|
+
f"User group '{settings.FRACTAL_DEFAULT_GROUP_NAME}'"
|
|
150
|
+
" not found.",
|
|
151
|
+
),
|
|
134
152
|
)
|
|
153
|
+
|
|
135
154
|
return user_group_id
|
|
136
155
|
|
|
137
156
|
|
{fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/auth/current_user.py
RENAMED
|
@@ -15,6 +15,7 @@ from fractal_server.app.models import Resource
|
|
|
15
15
|
from fractal_server.app.models import UserGroup
|
|
16
16
|
from fractal_server.app.models import UserOAuth
|
|
17
17
|
from fractal_server.app.routes.auth import current_user_act
|
|
18
|
+
from fractal_server.app.routes.auth import current_user_act_ver
|
|
18
19
|
from fractal_server.app.routes.auth._aux_auth import (
|
|
19
20
|
_get_single_user_with_groups,
|
|
20
21
|
)
|
|
@@ -111,7 +112,7 @@ async def get_current_user_profile_info(
|
|
|
111
112
|
"/current-user/allowed-viewer-paths/", response_model=list[str]
|
|
112
113
|
)
|
|
113
114
|
async def get_current_user_allowed_viewer_paths(
|
|
114
|
-
current_user: UserOAuth = Depends(
|
|
115
|
+
current_user: UserOAuth = Depends(current_user_act_ver),
|
|
115
116
|
db: AsyncSession = Depends(get_async_db),
|
|
116
117
|
) -> list[str]:
|
|
117
118
|
"""
|
{fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/auth/group.py
RENAMED
|
@@ -10,7 +10,7 @@ from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
10
10
|
from sqlmodel import select
|
|
11
11
|
|
|
12
12
|
from . import current_superuser_act
|
|
13
|
-
from ._aux_auth import
|
|
13
|
+
from ._aux_auth import _get_default_usergroup_id_or_none
|
|
14
14
|
from ._aux_auth import _get_single_usergroup_with_user_ids
|
|
15
15
|
from ._aux_auth import _user_or_404
|
|
16
16
|
from ._aux_auth import _usergroup_or_404
|
|
@@ -21,11 +21,13 @@ from fractal_server.app.models import UserOAuth
|
|
|
21
21
|
from fractal_server.app.schemas.user_group import UserGroupCreate
|
|
22
22
|
from fractal_server.app.schemas.user_group import UserGroupRead
|
|
23
23
|
from fractal_server.app.schemas.user_group import UserGroupUpdate
|
|
24
|
-
from fractal_server.
|
|
24
|
+
from fractal_server.config import get_settings
|
|
25
25
|
from fractal_server.logger import set_logger
|
|
26
|
+
from fractal_server.syringe import Inject
|
|
26
27
|
|
|
27
28
|
logger = set_logger(__name__)
|
|
28
29
|
|
|
30
|
+
|
|
29
31
|
router_group = APIRouter()
|
|
30
32
|
|
|
31
33
|
|
|
@@ -38,7 +40,7 @@ async def get_list_user_groups(
|
|
|
38
40
|
db: AsyncSession = Depends(get_async_db),
|
|
39
41
|
) -> list[UserGroupRead]:
|
|
40
42
|
# Get all groups
|
|
41
|
-
stm_all_groups = select(UserGroup)
|
|
43
|
+
stm_all_groups = select(UserGroup).order_by(UserGroup.id)
|
|
42
44
|
res = await db.execute(stm_all_groups)
|
|
43
45
|
groups = res.scalars().all()
|
|
44
46
|
|
|
@@ -138,19 +140,24 @@ async def delete_single_group(
|
|
|
138
140
|
user: UserOAuth = Depends(current_superuser_act),
|
|
139
141
|
db: AsyncSession = Depends(get_async_db),
|
|
140
142
|
) -> Response:
|
|
143
|
+
"""
|
|
144
|
+
Delete a user group.
|
|
145
|
+
|
|
146
|
+
If `FRACTAL_DEFAULT_GROUP_NAME="All"`, a group named `"All"` cannot be
|
|
147
|
+
deleted. If `FRACTAL_DEFAULT_GROUP_NAME=None`, any group can be deleted.
|
|
148
|
+
"""
|
|
149
|
+
settings = Inject(get_settings)
|
|
141
150
|
group = await _usergroup_or_404(group_id, db)
|
|
142
151
|
|
|
143
|
-
if group.name == FRACTAL_DEFAULT_GROUP_NAME:
|
|
152
|
+
if group.name == settings.FRACTAL_DEFAULT_GROUP_NAME:
|
|
144
153
|
raise HTTPException(
|
|
145
154
|
status_code=status.HTTP_422_UNPROCESSABLE_CONTENT,
|
|
146
155
|
detail=(
|
|
147
156
|
"Cannot delete default UserGroup "
|
|
148
|
-
f"'{FRACTAL_DEFAULT_GROUP_NAME}'."
|
|
157
|
+
f"'{settings.FRACTAL_DEFAULT_GROUP_NAME}'."
|
|
149
158
|
),
|
|
150
159
|
)
|
|
151
160
|
|
|
152
|
-
# Delete
|
|
153
|
-
|
|
154
161
|
await db.delete(group)
|
|
155
162
|
await db.commit()
|
|
156
163
|
|
|
@@ -188,18 +195,21 @@ async def remove_user_from_group(
|
|
|
188
195
|
superuser: UserOAuth = Depends(current_superuser_act),
|
|
189
196
|
db: AsyncSession = Depends(get_async_db),
|
|
190
197
|
) -> UserGroupRead:
|
|
198
|
+
settings = Inject(get_settings)
|
|
191
199
|
# Check that user and group exist
|
|
192
200
|
await _usergroup_or_404(group_id, db)
|
|
193
201
|
user = await _user_or_404(user_id, db)
|
|
194
202
|
|
|
195
203
|
# Check that group is not the default one
|
|
196
|
-
|
|
197
|
-
|
|
204
|
+
default_user_group_id_or_none = await _get_default_usergroup_id_or_none(
|
|
205
|
+
db=db
|
|
206
|
+
)
|
|
207
|
+
if default_user_group_id_or_none == group_id:
|
|
198
208
|
raise HTTPException(
|
|
199
209
|
status_code=status.HTTP_422_UNPROCESSABLE_CONTENT,
|
|
200
210
|
detail=(
|
|
201
|
-
f"Cannot remove user from
|
|
202
|
-
"group.",
|
|
211
|
+
f"Cannot remove user from "
|
|
212
|
+
f"'{settings.FRACTAL_DEFAULT_GROUP_NAME}' group.",
|
|
203
213
|
),
|
|
204
214
|
)
|
|
205
215
|
|
{fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/routes/auth/users.py
RENAMED
|
@@ -15,9 +15,8 @@ from . import current_superuser_act
|
|
|
15
15
|
from ...db import get_async_db
|
|
16
16
|
from ...schemas.user import UserRead
|
|
17
17
|
from ...schemas.user import UserUpdate
|
|
18
|
-
from ._aux_auth import
|
|
18
|
+
from ._aux_auth import _get_default_usergroup_id_or_none
|
|
19
19
|
from ._aux_auth import _get_single_user_with_groups
|
|
20
|
-
from ._aux_auth import FRACTAL_DEFAULT_GROUP_NAME
|
|
21
20
|
from fractal_server.app.models import LinkUserGroup
|
|
22
21
|
from fractal_server.app.models import UserGroup
|
|
23
22
|
from fractal_server.app.models import UserOAuth
|
|
@@ -26,7 +25,10 @@ from fractal_server.app.routes.auth._aux_auth import _user_or_404
|
|
|
26
25
|
from fractal_server.app.schemas.user import UserUpdateGroups
|
|
27
26
|
from fractal_server.app.security import get_user_manager
|
|
28
27
|
from fractal_server.app.security import UserManager
|
|
28
|
+
from fractal_server.config import get_settings
|
|
29
29
|
from fractal_server.logger import set_logger
|
|
30
|
+
from fractal_server.syringe import Inject
|
|
31
|
+
|
|
30
32
|
|
|
31
33
|
router_users = APIRouter()
|
|
32
34
|
|
|
@@ -146,6 +148,7 @@ async def set_user_groups(
|
|
|
146
148
|
superuser: UserOAuth = Depends(current_superuser_act),
|
|
147
149
|
db: AsyncSession = Depends(get_async_db),
|
|
148
150
|
) -> UserRead:
|
|
151
|
+
settings = Inject(get_settings)
|
|
149
152
|
# Preliminary check that all objects exist in the db
|
|
150
153
|
user = await _user_or_404(user_id=user_id, db=db)
|
|
151
154
|
target_group_ids = user_update.group_ids
|
|
@@ -161,13 +164,16 @@ async def set_user_groups(
|
|
|
161
164
|
)
|
|
162
165
|
|
|
163
166
|
# Check that default group is not being removed
|
|
164
|
-
|
|
165
|
-
if
|
|
167
|
+
default_group_id_or_none = await _get_default_usergroup_id_or_none(db=db)
|
|
168
|
+
if (
|
|
169
|
+
default_group_id_or_none is not None
|
|
170
|
+
and default_group_id_or_none not in target_group_ids
|
|
171
|
+
):
|
|
166
172
|
raise HTTPException(
|
|
167
173
|
status_code=status.HTTP_422_UNPROCESSABLE_CONTENT,
|
|
168
174
|
detail=(
|
|
169
175
|
f"Cannot remove user from "
|
|
170
|
-
f"'{FRACTAL_DEFAULT_GROUP_NAME}' group.",
|
|
176
|
+
f"'{settings.FRACTAL_DEFAULT_GROUP_NAME}' group.",
|
|
171
177
|
),
|
|
172
178
|
)
|
|
173
179
|
|
{fractal_server-2.17.0a8 → fractal_server-2.17.0a10}/fractal_server/app/schemas/user_group.py
RENAMED
|
@@ -7,6 +7,7 @@ from pydantic import field_serializer
|
|
|
7
7
|
from pydantic.types import AwareDatetime
|
|
8
8
|
|
|
9
9
|
from fractal_server.types import ListUniqueAbsolutePathStr
|
|
10
|
+
from fractal_server.types import NonEmptyStr
|
|
10
11
|
|
|
11
12
|
__all__ = (
|
|
12
13
|
"UserGroupRead",
|
|
@@ -50,7 +51,7 @@ class UserGroupCreate(BaseModel):
|
|
|
50
51
|
|
|
51
52
|
model_config = ConfigDict(extra="forbid")
|
|
52
53
|
|
|
53
|
-
name:
|
|
54
|
+
name: NonEmptyStr
|
|
54
55
|
viewer_paths: ListUniqueAbsolutePathStr = Field(default_factory=list)
|
|
55
56
|
|
|
56
57
|
|