fractal-server 2.17.0a4__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.0a4 → fractal_server-2.17.0a6}/PKG-INFO +4 -6
- fractal_server-2.17.0a6/fractal_server/__init__.py +1 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/__main__.py +22 -26
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/models/security.py +19 -21
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/models/user_settings.py +1 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/task_group.py +1 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/accounting.py +3 -3
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/impersonate.py +2 -2
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/job.py +6 -6
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/profile.py +18 -4
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/project.py +2 -2
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/resource.py +8 -8
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/task.py +11 -2
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/task_group.py +16 -12
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/task_group_lifecycle.py +4 -4
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/__init__.py +14 -5
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/dataset.py +10 -19
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/history.py +8 -8
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/images.py +5 -5
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/job.py +8 -8
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/pre_submission_checks.py +3 -3
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/project.py +6 -6
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/status_legacy.py +2 -2
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/submit.py +25 -29
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/task.py +6 -7
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/task_collection.py +4 -3
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/task_collection_custom.py +4 -3
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/task_collection_pixi.py +2 -2
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/task_group.py +6 -6
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/task_group_lifecycle.py +4 -4
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/task_version_update.py +3 -3
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/workflow.py +9 -9
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/workflow_import.py +2 -2
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/workflowtask.py +5 -5
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/auth/__init__.py +34 -5
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/auth/current_user.py +22 -72
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/auth/group.py +8 -35
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/auth/oauth.py +1 -1
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/auth/register.py +2 -2
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/auth/users.py +6 -48
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/schemas/__init__.py +0 -1
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/schemas/user.py +23 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/__init__.py +1 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/task_group.py +5 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/security/__init__.py +134 -46
- fractal_server-2.17.0a6/fractal_server/app/security/signup_email.py +66 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/config/__init__.py +6 -0
- fractal_server-2.17.0a6/fractal_server/config/_data.py +68 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/config/_email.py +10 -47
- fractal_server-2.17.0a6/fractal_server/config/_main.py +68 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/config/_oauth.py +2 -2
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/main.py +3 -2
- fractal_server-2.17.0a6/fractal_server/migrations/versions/f65ee53991e3_user_settings_related.py +67 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_common/base_slurm_runner.py +1 -1
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_common/slurm_config.py +5 -8
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_ssh/runner.py +1 -1
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_sudo/runner.py +1 -1
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/v2/_slurm_ssh.py +2 -1
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/v2/_slurm_sudo.py +1 -1
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/v2/submit_workflow.py +12 -12
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/pyproject.toml +5 -7
- fractal_server-2.17.0a4/fractal_server/__init__.py +0 -1
- fractal_server-2.17.0a4/fractal_server/app/routes/aux/validate_user_settings.py +0 -76
- fractal_server-2.17.0a4/fractal_server/app/schemas/user_settings.py +0 -63
- fractal_server-2.17.0a4/fractal_server/app/security/signup_email.py +0 -48
- fractal_server-2.17.0a4/fractal_server/app/user_settings.py +0 -32
- fractal_server-2.17.0a4/fractal_server/config/_main.py +0 -121
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/LICENSE +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/README.md +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/alembic.ini +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/__init__.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/db/__init__.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/models/__init__.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/models/linkusergroup.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/models/linkuserproject.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/__init__.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/accounting.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/dataset.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/history.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/job.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/profile.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/project.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/resource.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/task.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/workflow.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/workflowtask.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/__init__.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/__init__.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/__init__.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/_aux_functions.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/__init__.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/_aux_functions.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/_aux_functions_history.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/_aux_functions_task_lifecycle.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/_aux_functions_task_version_update.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/_aux_functions_tasks.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/api/v2/_aux_task_group_disambiguation.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/auth/_aux_auth.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/auth/login.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/auth/router.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/aux/__init__.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/aux/_job.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/aux/_runner.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/aux/validate_user_profile.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/pagination.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/schemas/user_group.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/accounting.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/dataset.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/dumps.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/history.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/job.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/manifest.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/profile.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/project.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/resource.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/status_legacy.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/task.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/task_collection.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/workflow.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/schemas/v2/workflowtask.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/shutdown.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/config/_database.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/config/_settings_config.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/data_migrations/2_14_10.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/data_migrations/README.md +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/data_migrations/tools.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/exceptions.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/gunicorn_fractal.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/images/__init__.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/images/models.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/images/status_tools.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/images/tools.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/logger.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/env.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/naming_convention.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/034a469ec2eb_task_groups.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/091b01f51f88_add_usergroup_and_linkusergroup_table.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/0f5f85bb2ae7_add_pre_pinned_packages.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/19eca0dd47a9_user_settings_project_dir.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/1a83a5260664_rename.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/1eac13a26c83_drop_v1_tables.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/316140ff7ee1_remove_usersettings_cache_dir.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/47351f8c7ebc_drop_dataset_filters.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/4c308bcaea2b_add_task_args_schema_and_task_args_.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/4cedeb448a53_workflowtask_foreign_keys_not_nullables.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/501961cfcd85_remove_link_between_v1_and_v2_tasks_.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/50a13d6138fd_initial_schema.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/5bf02391cfef_v2.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/70e77f1c38b0_add_applyworkflow_first_task_index_and_.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/71eefd1dd202_add_slurm_accounts.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/791ce783d3d8_add_indices.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/84bf0fffde30_add_dumps_to_applyworkflow.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/8e8f227a3e36_update_taskv2_post_2_7_0.py +0 -0
- {fractal_server-2.17.0a4 → 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.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/90f6508c6379_drop_useroauth_username.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/94a47ea2d3ff_remove_cache_dir_slurm_user_and_slurm_.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/969d84257cac_add_historyrun_task_id.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/97f444d47249_add_applyworkflow_project_dump.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/981d588fe248_add_executor_error_log.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/99ea79d9e5d2_add_dataset_history.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/9c5ae74c9b98_add_user_settings_table.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/9db60297b8b2_set_ondelete.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/9fd26a2b0de4_add_workflow_timestamp_created.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/a7f4d6137b53_add_workflow_dump_to_applyworkflow.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/a80ac5a352bf_resource_profile.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/af1ef1c83c9b_add_accounting_tables.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/af8673379a5c_drop_old_filter_columns.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/b1e7f7a1ff71_task_group_for_pixi.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/b3ffb095f973_json_to_jsonb.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/c90a7c76e996_job_id_in_history_run.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/d256a7379ab8_taskgroup_activity_and_venv_info_to_.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/d4fe3708d309_make_applyworkflow_workflow_dump_non_.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/da2cb2ac4255_user_group_viewer_paths.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/db09233ad13a_split_filters_and_keep_old_columns.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/e75cac726012_make_applyworkflow_start_timestamp_not_.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/e81103413827_add_job_type_filters.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/efa89c30e0a4_add_project_timestamp_created.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/f37aceb45062_make_historyunit_logfile_required.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/f384e1c0cf5d_drop_task_default_args_columns.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/migrations/versions/fbce16ff4e47_new_history_items.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/py.typed +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/__init__.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/components.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/config/__init__.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/config/_local.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/config/_slurm.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/config/slurm_mem_to_MB.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/exceptions.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/executors/__init__.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/executors/base_runner.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/executors/call_command_wrapper.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/executors/local/__init__.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/executors/local/get_local_config.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/executors/local/runner.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_common/__init__.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_common/_batching.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_common/_job_states.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_common/get_slurm_config.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_common/remote.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_common/slurm_job_task_models.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_ssh/__init__.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_ssh/run_subprocess.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_ssh/tar_commands.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_sudo/__init__.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/executors/slurm_sudo/_subprocess_run_as_user.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/filenames.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/set_start_and_last_task_index.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/task_files.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/v2/__init__.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/v2/_local.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/v2/db_tools.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/v2/deduplicate_list.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/v2/merge_outputs.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/v2/runner.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/v2/runner_functions.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/v2/task_interface.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/runner/versions.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/ssh/__init__.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/ssh/_fabric.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/string_tools.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/syringe.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/__init__.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/config/__init__.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/config/_pixi.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/config/_python.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/utils.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/__init__.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/local/__init__.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/local/_utils.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/local/collect.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/local/collect_pixi.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/local/deactivate.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/local/deactivate_pixi.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/local/delete.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/local/reactivate.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/local/reactivate_pixi.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/ssh/__init__.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/ssh/_pixi_slurm_ssh.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/ssh/_utils.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/ssh/collect.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/ssh/collect_pixi.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/ssh/deactivate.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/ssh/deactivate_pixi.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/ssh/delete.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/ssh/reactivate.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/ssh/reactivate_pixi.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/templates/1_create_venv.sh +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/templates/2_pip_install.sh +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/templates/3_pip_freeze.sh +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/templates/4_pip_show.sh +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/templates/5_get_venv_size_and_file_number.sh +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/templates/6_pip_install_from_freeze.sh +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/templates/pixi_1_extract.sh +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/templates/pixi_2_install.sh +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/templates/pixi_3_post_install.sh +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/utils_background.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/utils_database.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/utils_package_names.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/utils_pixi.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/utils_python_interpreter.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/tasks/v2/utils_templates.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/types/__init__.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/types/validators/__init__.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/types/validators/_common_validators.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/types/validators/_filter_validators.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/types/validators/_workflow_task_arguments_validators.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/urls.py +0 -0
- {fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/utils.py +0 -0
- {fractal_server-2.17.0a4 → 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
|
|
@@ -12,20 +12,18 @@ Classifier: Programming Language :: Python :: 3.11
|
|
|
12
12
|
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
|
-
Requires-Dist: cryptography (>=46.0.0,<47.0.0)
|
|
16
15
|
Requires-Dist: fabric (>=3.2.2,<3.3.0)
|
|
17
|
-
Requires-Dist: fastapi (>=0.
|
|
18
|
-
Requires-Dist: fastapi-users[oauth] (>=
|
|
16
|
+
Requires-Dist: fastapi (>=0.120.0,<0.121.0)
|
|
17
|
+
Requires-Dist: fastapi-users[oauth] (>=15,<16)
|
|
19
18
|
Requires-Dist: gunicorn (>=23.0,<24.0)
|
|
20
19
|
Requires-Dist: packaging (>=25.0.0,<26.0.0)
|
|
21
20
|
Requires-Dist: psycopg[binary] (>=3.1.0,<4.0.0)
|
|
22
21
|
Requires-Dist: pydantic (>=2.12.0,<2.13.0)
|
|
23
22
|
Requires-Dist: pydantic-settings (==2.11.0)
|
|
24
|
-
Requires-Dist: python-dotenv (>=1.1.0,<1.2.0)
|
|
25
23
|
Requires-Dist: sqlalchemy[asyncio] (>=2.0.23,<2.1)
|
|
26
24
|
Requires-Dist: sqlmodel (==0.0.27)
|
|
27
25
|
Requires-Dist: tomli_w (>=1.2.0,<1.3.0)
|
|
28
|
-
Requires-Dist: uvicorn (>=0.
|
|
26
|
+
Requires-Dist: uvicorn (>=0.38.0,<0.39.0)
|
|
29
27
|
Requires-Dist: uvicorn-worker (==0.4.0)
|
|
30
28
|
Project-URL: Documentation, https://fractal-analytics-platform.github.io/fractal-server
|
|
31
29
|
Project-URL: Homepage, https://github.com/fractal-analytics-platform/fractal-server
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__VERSION__ = "2.17.0a6"
|
|
@@ -74,13 +74,20 @@ init_db_data_parser.add_argument(
|
|
|
74
74
|
init_db_data_parser.add_argument(
|
|
75
75
|
"--admin-email",
|
|
76
76
|
type=str,
|
|
77
|
-
help="Email of the first admin user
|
|
77
|
+
help="Email of the first admin user.",
|
|
78
78
|
required=False,
|
|
79
79
|
)
|
|
80
80
|
init_db_data_parser.add_argument(
|
|
81
81
|
"--admin-pwd",
|
|
82
82
|
type=str,
|
|
83
|
-
help="Password
|
|
83
|
+
help="Password for the first admin user.",
|
|
84
|
+
required=False,
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
init_db_data_parser.add_argument(
|
|
88
|
+
"--admin-project-dir",
|
|
89
|
+
type=str,
|
|
90
|
+
help="Project_dir for the first admin user.",
|
|
84
91
|
required=False,
|
|
85
92
|
)
|
|
86
93
|
|
|
@@ -90,15 +97,6 @@ update_db_data_parser = subparsers.add_parser(
|
|
|
90
97
|
description="Apply data-migration script to an existing database.",
|
|
91
98
|
)
|
|
92
99
|
|
|
93
|
-
# fractalctl encrypt-email-password
|
|
94
|
-
encrypt_email_password_parser = subparsers.add_parser(
|
|
95
|
-
"encrypt-email-password",
|
|
96
|
-
description=(
|
|
97
|
-
"Generate valid values for environment variables "
|
|
98
|
-
"FRACTAL_EMAIL_PASSWORD and FRACTAL_EMAIL_PASSWORD_KEY."
|
|
99
|
-
),
|
|
100
|
-
)
|
|
101
|
-
|
|
102
100
|
|
|
103
101
|
def save_openapi(dest="openapi.json"):
|
|
104
102
|
from fractal_server.main import start_application
|
|
@@ -136,10 +134,12 @@ def set_db():
|
|
|
136
134
|
|
|
137
135
|
|
|
138
136
|
def init_db_data(
|
|
137
|
+
*,
|
|
139
138
|
resource: str | None = None,
|
|
140
139
|
profile: str | None = None,
|
|
141
140
|
admin_email: str | None = None,
|
|
142
141
|
admin_password: str | None = None,
|
|
142
|
+
admin_project_dir: str | None = None,
|
|
143
143
|
) -> None:
|
|
144
144
|
from fractal_server.app.security import _create_first_user
|
|
145
145
|
from fractal_server.app.security import _create_first_group
|
|
@@ -156,14 +156,22 @@ def init_db_data(
|
|
|
156
156
|
print()
|
|
157
157
|
|
|
158
158
|
# Create admin user if requested
|
|
159
|
-
if
|
|
160
|
-
|
|
159
|
+
if not (
|
|
160
|
+
(admin_email is None)
|
|
161
|
+
== (admin_password is None)
|
|
162
|
+
== (admin_project_dir is None)
|
|
163
|
+
):
|
|
164
|
+
print(
|
|
165
|
+
"You must provide either or or none of `--admin-email`, "
|
|
166
|
+
"`--admin-pwd` and `--admin-project-dir`. Exit."
|
|
167
|
+
)
|
|
161
168
|
sys.exit(1)
|
|
162
169
|
if admin_password and admin_email:
|
|
163
170
|
asyncio.run(
|
|
164
171
|
_create_first_user(
|
|
165
172
|
email=admin_email,
|
|
166
173
|
password=admin_password,
|
|
174
|
+
project_dir=admin_project_dir,
|
|
167
175
|
is_superuser=True,
|
|
168
176
|
is_verified=True,
|
|
169
177
|
)
|
|
@@ -325,17 +333,6 @@ def update_db_data():
|
|
|
325
333
|
current_update_db_data_module.fix_db()
|
|
326
334
|
|
|
327
335
|
|
|
328
|
-
def print_encrypted_password():
|
|
329
|
-
from cryptography.fernet import Fernet
|
|
330
|
-
|
|
331
|
-
password = input("Insert email password: ").encode("utf-8")
|
|
332
|
-
key = Fernet.generate_key().decode("utf-8")
|
|
333
|
-
encrypted_password = Fernet(key).encrypt(password).decode("utf-8")
|
|
334
|
-
|
|
335
|
-
print(f"\nFRACTAL_EMAIL_PASSWORD={encrypted_password}")
|
|
336
|
-
print(f"FRACTAL_EMAIL_PASSWORD_KEY={key}")
|
|
337
|
-
|
|
338
|
-
|
|
339
336
|
def run():
|
|
340
337
|
args = parser.parse_args(sys.argv[1:])
|
|
341
338
|
|
|
@@ -349,6 +346,7 @@ def run():
|
|
|
349
346
|
profile=args.profile,
|
|
350
347
|
admin_email=args.admin_email,
|
|
351
348
|
admin_password=args.admin_pwd,
|
|
349
|
+
admin_project_dir=args.admin_project_dir,
|
|
352
350
|
)
|
|
353
351
|
elif args.cmd == "update-db-data":
|
|
354
352
|
update_db_data()
|
|
@@ -359,8 +357,6 @@ def run():
|
|
|
359
357
|
port=args.port,
|
|
360
358
|
reload=args.reload,
|
|
361
359
|
)
|
|
362
|
-
elif args.cmd == "encrypt-email-password":
|
|
363
|
-
print_encrypted_password()
|
|
364
360
|
else:
|
|
365
361
|
sys.exit(f"Error: invalid command '{args.cmd}'.")
|
|
366
362
|
|
|
@@ -1,27 +1,17 @@
|
|
|
1
|
-
# This is based on fastapi_users_db_sqlmodel
|
|
2
|
-
# <https://github.com/fastapi-users/fastapi-users-db-sqlmodel>
|
|
3
|
-
# Original Copyright
|
|
4
|
-
# Copyright 2022 François Voron
|
|
5
|
-
# License: MIT
|
|
6
|
-
#
|
|
7
|
-
# Modified by:
|
|
8
|
-
# Tommaso Comparin <tommaso.comparin@exact-lab.it>
|
|
9
|
-
#
|
|
10
|
-
# Copyright 2022 (C) Friedrich Miescher Institute for Biomedical Research and
|
|
11
|
-
# University of Zurich
|
|
12
1
|
from datetime import datetime
|
|
13
2
|
from typing import Optional
|
|
14
3
|
|
|
15
4
|
from pydantic import ConfigDict
|
|
16
5
|
from pydantic import EmailStr
|
|
17
6
|
from sqlalchemy import Column
|
|
7
|
+
from sqlalchemy import String
|
|
8
|
+
from sqlalchemy.dialects.postgresql import ARRAY
|
|
18
9
|
from sqlalchemy.dialects.postgresql import JSONB
|
|
19
10
|
from sqlalchemy.types import DateTime
|
|
20
11
|
from sqlmodel import Field
|
|
21
12
|
from sqlmodel import Relationship
|
|
22
13
|
from sqlmodel import SQLModel
|
|
23
14
|
|
|
24
|
-
from .user_settings import UserSettings
|
|
25
15
|
from fractal_server.utils import get_timestamp
|
|
26
16
|
|
|
27
17
|
|
|
@@ -74,17 +64,20 @@ class UserOAuth(SQLModel, table=True):
|
|
|
74
64
|
is_superuser:
|
|
75
65
|
is_verified:
|
|
76
66
|
oauth_accounts:
|
|
77
|
-
user_settings_id:
|
|
78
67
|
profile_id:
|
|
79
|
-
|
|
68
|
+
project_dir:
|
|
69
|
+
slurm_accounts:
|
|
80
70
|
"""
|
|
81
71
|
|
|
72
|
+
model_config = ConfigDict(from_attributes=True)
|
|
73
|
+
|
|
82
74
|
__tablename__ = "user_oauth"
|
|
83
75
|
|
|
84
76
|
id: int | None = Field(default=None, primary_key=True)
|
|
85
77
|
|
|
86
78
|
email: EmailStr = Field(
|
|
87
|
-
sa_column_kwargs={"unique": True, "index": True},
|
|
79
|
+
sa_column_kwargs={"unique": True, "index": True},
|
|
80
|
+
nullable=False,
|
|
88
81
|
)
|
|
89
82
|
hashed_password: str
|
|
90
83
|
is_active: bool = Field(default=True, nullable=False)
|
|
@@ -96,18 +89,23 @@ class UserOAuth(SQLModel, table=True):
|
|
|
96
89
|
sa_relationship_kwargs={"lazy": "joined", "cascade": "all, delete"},
|
|
97
90
|
)
|
|
98
91
|
|
|
99
|
-
user_settings_id: int | None = Field(
|
|
100
|
-
foreign_key="user_settings.id", default=None
|
|
101
|
-
)
|
|
102
92
|
profile_id: int | None = Field(
|
|
103
93
|
foreign_key="profile.id",
|
|
104
94
|
default=None,
|
|
105
95
|
ondelete="SET NULL",
|
|
106
96
|
)
|
|
107
|
-
|
|
108
|
-
|
|
97
|
+
|
|
98
|
+
# TODO-2.17.1: update to `project_dir: str`
|
|
99
|
+
project_dir: str = Field(
|
|
100
|
+
sa_column=Column(
|
|
101
|
+
String,
|
|
102
|
+
server_default="/PLACEHOLDER",
|
|
103
|
+
nullable=False,
|
|
104
|
+
)
|
|
105
|
+
)
|
|
106
|
+
slurm_accounts: list[str] = Field(
|
|
107
|
+
sa_column=Column(ARRAY(String), server_default="{}"),
|
|
109
108
|
)
|
|
110
|
-
model_config = ConfigDict(from_attributes=True)
|
|
111
109
|
|
|
112
110
|
|
|
113
111
|
class UserGroup(SQLModel, table=True):
|
{fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/models/v2/task_group.py
RENAMED
|
@@ -42,6 +42,7 @@ class TaskGroupV2(SQLModel, table=True):
|
|
|
42
42
|
user_group_id: int | None = Field(
|
|
43
43
|
foreign_key="usergroup.id", default=None, ondelete="SET NULL"
|
|
44
44
|
)
|
|
45
|
+
# TODO-2.17.1: make `resource_id` not nullable
|
|
45
46
|
resource_id: int | None = Field(
|
|
46
47
|
foreign_key="resource.id", default=None, ondelete="SET NULL"
|
|
47
48
|
)
|
{fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/accounting.py
RENAMED
|
@@ -13,7 +13,7 @@ from fractal_server.app.db import get_async_db
|
|
|
13
13
|
from fractal_server.app.models import UserOAuth
|
|
14
14
|
from fractal_server.app.models.v2 import AccountingRecord
|
|
15
15
|
from fractal_server.app.models.v2 import AccountingRecordSlurm
|
|
16
|
-
from fractal_server.app.routes.auth import
|
|
16
|
+
from fractal_server.app.routes.auth import current_superuser_act
|
|
17
17
|
from fractal_server.app.routes.pagination import get_pagination_params
|
|
18
18
|
from fractal_server.app.routes.pagination import PaginationRequest
|
|
19
19
|
from fractal_server.app.routes.pagination import PaginationResponse
|
|
@@ -34,7 +34,7 @@ async def query_accounting(
|
|
|
34
34
|
query: AccountingQuery,
|
|
35
35
|
# Dependencies
|
|
36
36
|
pagination: PaginationRequest = Depends(get_pagination_params),
|
|
37
|
-
superuser: UserOAuth = Depends(
|
|
37
|
+
superuser: UserOAuth = Depends(current_superuser_act),
|
|
38
38
|
db: AsyncSession = Depends(get_async_db),
|
|
39
39
|
) -> PaginationResponse[AccountingRecordRead]:
|
|
40
40
|
page = pagination.page
|
|
@@ -79,7 +79,7 @@ async def query_accounting(
|
|
|
79
79
|
async def query_accounting_slurm(
|
|
80
80
|
query: AccountingQuery,
|
|
81
81
|
# dependencies
|
|
82
|
-
superuser: UserOAuth = Depends(
|
|
82
|
+
superuser: UserOAuth = Depends(current_superuser_act),
|
|
83
83
|
db: AsyncSession = Depends(get_async_db),
|
|
84
84
|
) -> JSONResponse:
|
|
85
85
|
stm = select(AccountingRecordSlurm.slurm_job_ids)
|
|
@@ -6,7 +6,7 @@ from fastapi_users.authentication import JWTStrategy
|
|
|
6
6
|
from fractal_server.app.db import AsyncSession
|
|
7
7
|
from fractal_server.app.db import get_async_db
|
|
8
8
|
from fractal_server.app.models import UserOAuth
|
|
9
|
-
from fractal_server.app.routes.auth import
|
|
9
|
+
from fractal_server.app.routes.auth import current_superuser_act
|
|
10
10
|
from fractal_server.app.routes.auth._aux_auth import _user_or_404
|
|
11
11
|
from fractal_server.config import get_settings
|
|
12
12
|
from fractal_server.syringe import Inject
|
|
@@ -17,7 +17,7 @@ router = APIRouter()
|
|
|
17
17
|
@router.get("/{user_id}/")
|
|
18
18
|
async def impersonate_user(
|
|
19
19
|
user_id: int,
|
|
20
|
-
superuser: UserOAuth = Depends(
|
|
20
|
+
superuser: UserOAuth = Depends(current_superuser_act),
|
|
21
21
|
db: AsyncSession = Depends(get_async_db),
|
|
22
22
|
) -> JSONResponse:
|
|
23
23
|
user = await _user_or_404(user_id, db)
|
{fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/job.py
RENAMED
|
@@ -16,7 +16,7 @@ from fractal_server.app.models.v2 import HistoryRun
|
|
|
16
16
|
from fractal_server.app.models.v2 import HistoryUnit
|
|
17
17
|
from fractal_server.app.models.v2 import JobV2
|
|
18
18
|
from fractal_server.app.models.v2 import ProjectV2
|
|
19
|
-
from fractal_server.app.routes.auth import
|
|
19
|
+
from fractal_server.app.routes.auth import current_superuser_act
|
|
20
20
|
from fractal_server.app.routes.aux._job import _write_shutdown_file
|
|
21
21
|
from fractal_server.app.routes.aux._runner import _check_shutdown_is_supported
|
|
22
22
|
from fractal_server.app.schemas.v2 import HistoryUnitStatus
|
|
@@ -43,7 +43,7 @@ async def view_job(
|
|
|
43
43
|
end_timestamp_min: AwareDatetime | None = None,
|
|
44
44
|
end_timestamp_max: AwareDatetime | None = None,
|
|
45
45
|
log: bool = True,
|
|
46
|
-
user: UserOAuth = Depends(
|
|
46
|
+
user: UserOAuth = Depends(current_superuser_act),
|
|
47
47
|
db: AsyncSession = Depends(get_async_db),
|
|
48
48
|
) -> list[JobReadV2]:
|
|
49
49
|
"""
|
|
@@ -111,7 +111,7 @@ async def view_job(
|
|
|
111
111
|
async def view_single_job(
|
|
112
112
|
job_id: int,
|
|
113
113
|
show_tmp_logs: bool = False,
|
|
114
|
-
user: UserOAuth = Depends(
|
|
114
|
+
user: UserOAuth = Depends(current_superuser_act),
|
|
115
115
|
db: AsyncSession = Depends(get_async_db),
|
|
116
116
|
) -> JobReadV2:
|
|
117
117
|
job = await db.get(JobV2, job_id)
|
|
@@ -136,7 +136,7 @@ async def view_single_job(
|
|
|
136
136
|
async def update_job(
|
|
137
137
|
job_update: JobUpdateV2,
|
|
138
138
|
job_id: int,
|
|
139
|
-
user: UserOAuth = Depends(
|
|
139
|
+
user: UserOAuth = Depends(current_superuser_act),
|
|
140
140
|
db: AsyncSession = Depends(get_async_db),
|
|
141
141
|
) -> JobReadV2 | None:
|
|
142
142
|
"""
|
|
@@ -200,7 +200,7 @@ async def update_job(
|
|
|
200
200
|
@router.get("/{job_id}/stop/", status_code=202)
|
|
201
201
|
async def stop_job(
|
|
202
202
|
job_id: int,
|
|
203
|
-
user: UserOAuth = Depends(
|
|
203
|
+
user: UserOAuth = Depends(current_superuser_act),
|
|
204
204
|
db: AsyncSession = Depends(get_async_db),
|
|
205
205
|
) -> Response:
|
|
206
206
|
"""
|
|
@@ -224,7 +224,7 @@ async def stop_job(
|
|
|
224
224
|
@router.get("/{job_id}/download/", response_class=StreamingResponse)
|
|
225
225
|
async def download_job_logs(
|
|
226
226
|
job_id: int,
|
|
227
|
-
user: UserOAuth = Depends(
|
|
227
|
+
user: UserOAuth = Depends(current_superuser_act),
|
|
228
228
|
db: AsyncSession = Depends(get_async_db),
|
|
229
229
|
) -> StreamingResponse:
|
|
230
230
|
"""
|
{fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/profile.py
RENAMED
|
@@ -10,8 +10,9 @@ 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
|
-
from fractal_server.app.routes.auth import
|
|
15
|
+
from fractal_server.app.routes.auth import current_superuser_act
|
|
15
16
|
from fractal_server.app.schemas.v2 import ProfileCreate
|
|
16
17
|
from fractal_server.app.schemas.v2 import ProfileRead
|
|
17
18
|
|
|
@@ -21,7 +22,7 @@ router = APIRouter()
|
|
|
21
22
|
@router.get("/{profile_id}/", response_model=ProfileRead, status_code=200)
|
|
22
23
|
async def get_single_profile(
|
|
23
24
|
profile_id: int,
|
|
24
|
-
superuser: UserOAuth = Depends(
|
|
25
|
+
superuser: UserOAuth = Depends(current_superuser_act),
|
|
25
26
|
db: AsyncSession = Depends(get_async_db),
|
|
26
27
|
) -> ProfileRead:
|
|
27
28
|
"""
|
|
@@ -31,11 +32,24 @@ 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,
|
|
37
51
|
profile_update: ProfileCreate,
|
|
38
|
-
superuser: UserOAuth = Depends(
|
|
52
|
+
superuser: UserOAuth = Depends(current_superuser_act),
|
|
39
53
|
db: AsyncSession = Depends(get_async_db),
|
|
40
54
|
) -> ProfileRead:
|
|
41
55
|
"""
|
|
@@ -56,7 +70,7 @@ async def put_profile(
|
|
|
56
70
|
@router.delete("/{profile_id}/", status_code=204)
|
|
57
71
|
async def delete_profile(
|
|
58
72
|
profile_id: int,
|
|
59
|
-
superuser: UserOAuth = Depends(
|
|
73
|
+
superuser: UserOAuth = Depends(current_superuser_act),
|
|
60
74
|
db: AsyncSession = Depends(get_async_db),
|
|
61
75
|
):
|
|
62
76
|
"""
|
{fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/project.py
RENAMED
|
@@ -6,7 +6,7 @@ from fractal_server.app.db import AsyncSession
|
|
|
6
6
|
from fractal_server.app.db import get_async_db
|
|
7
7
|
from fractal_server.app.models import UserOAuth
|
|
8
8
|
from fractal_server.app.models.v2 import ProjectV2
|
|
9
|
-
from fractal_server.app.routes.auth import
|
|
9
|
+
from fractal_server.app.routes.auth import current_superuser_act
|
|
10
10
|
from fractal_server.app.schemas.v2 import ProjectReadV2
|
|
11
11
|
|
|
12
12
|
router = APIRouter()
|
|
@@ -16,7 +16,7 @@ router = APIRouter()
|
|
|
16
16
|
async def view_project(
|
|
17
17
|
id: int | None = None,
|
|
18
18
|
user_id: int | None = None,
|
|
19
|
-
user: UserOAuth = Depends(
|
|
19
|
+
user: UserOAuth = Depends(current_superuser_act),
|
|
20
20
|
db: AsyncSession = Depends(get_async_db),
|
|
21
21
|
) -> list[ProjectReadV2]:
|
|
22
22
|
"""
|
{fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/resource.py
RENAMED
|
@@ -16,7 +16,7 @@ from fractal_server.app.models.v2 import Profile
|
|
|
16
16
|
from fractal_server.app.models.v2 import ProjectV2
|
|
17
17
|
from fractal_server.app.models.v2 import Resource
|
|
18
18
|
from fractal_server.app.models.v2 import TaskGroupV2
|
|
19
|
-
from fractal_server.app.routes.auth import
|
|
19
|
+
from fractal_server.app.routes.auth import current_superuser_act
|
|
20
20
|
from fractal_server.app.schemas.v2 import ProfileCreate
|
|
21
21
|
from fractal_server.app.schemas.v2 import ProfileRead
|
|
22
22
|
from fractal_server.app.schemas.v2 import ResourceCreate
|
|
@@ -57,7 +57,7 @@ def _check_type_match_or_422(new_resource: ResourceCreate) -> None:
|
|
|
57
57
|
|
|
58
58
|
@router.get("/", response_model=list[ResourceRead], status_code=200)
|
|
59
59
|
async def get_resource_list(
|
|
60
|
-
superuser: UserOAuth = Depends(
|
|
60
|
+
superuser: UserOAuth = Depends(current_superuser_act),
|
|
61
61
|
db: AsyncSession = Depends(get_async_db),
|
|
62
62
|
) -> list[ResourceRead]:
|
|
63
63
|
"""
|
|
@@ -74,7 +74,7 @@ async def get_resource_list(
|
|
|
74
74
|
@router.get("/{resource_id}/", response_model=ResourceRead, status_code=200)
|
|
75
75
|
async def get_resource(
|
|
76
76
|
resource_id: int,
|
|
77
|
-
superuser: UserOAuth = Depends(
|
|
77
|
+
superuser: UserOAuth = Depends(current_superuser_act),
|
|
78
78
|
db: AsyncSession = Depends(get_async_db),
|
|
79
79
|
) -> ResourceRead:
|
|
80
80
|
"""
|
|
@@ -88,7 +88,7 @@ async def get_resource(
|
|
|
88
88
|
@router.post("/", response_model=ResourceRead, status_code=201)
|
|
89
89
|
async def post_resource(
|
|
90
90
|
resource_create: ResourceCreate,
|
|
91
|
-
superuser: UserOAuth = Depends(
|
|
91
|
+
superuser: UserOAuth = Depends(current_superuser_act),
|
|
92
92
|
db: AsyncSession = Depends(get_async_db),
|
|
93
93
|
) -> ResourceRead:
|
|
94
94
|
"""
|
|
@@ -116,7 +116,7 @@ async def post_resource(
|
|
|
116
116
|
async def put_resource(
|
|
117
117
|
resource_id: int,
|
|
118
118
|
resource_update: ResourceCreate,
|
|
119
|
-
superuser: UserOAuth = Depends(
|
|
119
|
+
superuser: UserOAuth = Depends(current_superuser_act),
|
|
120
120
|
db: AsyncSession = Depends(get_async_db),
|
|
121
121
|
) -> ResourceRead:
|
|
122
122
|
"""
|
|
@@ -144,7 +144,7 @@ async def put_resource(
|
|
|
144
144
|
@router.delete("/{resource_id}/", status_code=204)
|
|
145
145
|
async def delete_resource(
|
|
146
146
|
resource_id: int,
|
|
147
|
-
superuser: UserOAuth = Depends(
|
|
147
|
+
superuser: UserOAuth = Depends(current_superuser_act),
|
|
148
148
|
db: AsyncSession = Depends(get_async_db),
|
|
149
149
|
):
|
|
150
150
|
"""
|
|
@@ -214,7 +214,7 @@ async def delete_resource(
|
|
|
214
214
|
)
|
|
215
215
|
async def get_resource_profiles(
|
|
216
216
|
resource_id: int,
|
|
217
|
-
superuser: UserOAuth = Depends(
|
|
217
|
+
superuser: UserOAuth = Depends(current_superuser_act),
|
|
218
218
|
db: AsyncSession = Depends(get_async_db),
|
|
219
219
|
) -> list[ProfileRead]:
|
|
220
220
|
"""
|
|
@@ -238,7 +238,7 @@ async def get_resource_profiles(
|
|
|
238
238
|
async def post_profile(
|
|
239
239
|
resource_id: int,
|
|
240
240
|
profile_create: ProfileCreate,
|
|
241
|
-
superuser: UserOAuth = Depends(
|
|
241
|
+
superuser: UserOAuth = Depends(current_superuser_act),
|
|
242
242
|
db: AsyncSession = Depends(get_async_db),
|
|
243
243
|
) -> ProfileRead:
|
|
244
244
|
"""
|
{fractal_server-2.17.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/task.py
RENAMED
|
@@ -10,11 +10,12 @@ 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
|
|
16
17
|
from fractal_server.app.models.v2 import WorkflowV2
|
|
17
|
-
from fractal_server.app.routes.auth import
|
|
18
|
+
from fractal_server.app.routes.auth import current_superuser_act
|
|
18
19
|
|
|
19
20
|
router = APIRouter()
|
|
20
21
|
|
|
@@ -58,7 +59,8 @@ async def query_tasks(
|
|
|
58
59
|
category: str | None = None,
|
|
59
60
|
modality: str | None = None,
|
|
60
61
|
author: str | None = None,
|
|
61
|
-
|
|
62
|
+
resource_id: int | None = None,
|
|
63
|
+
user: UserOAuth = Depends(current_superuser_act),
|
|
62
64
|
db: AsyncSession = Depends(get_async_db),
|
|
63
65
|
) -> list[TaskV2Info]:
|
|
64
66
|
"""
|
|
@@ -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.0a4 → fractal_server-2.17.0a6}/fractal_server/app/routes/admin/v2/task_group.py
RENAMED
|
@@ -12,18 +12,19 @@ from fractal_server.app.db import get_async_db
|
|
|
12
12
|
from fractal_server.app.models import UserOAuth
|
|
13
13
|
from fractal_server.app.models.v2 import TaskGroupActivityV2
|
|
14
14
|
from fractal_server.app.models.v2 import TaskGroupV2
|
|
15
|
-
from fractal_server.app.routes.auth import
|
|
15
|
+
from fractal_server.app.routes.auth import current_superuser_act
|
|
16
16
|
from fractal_server.app.routes.auth._aux_auth import (
|
|
17
17
|
_verify_user_belongs_to_group,
|
|
18
18
|
)
|
|
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__)
|
|
@@ -38,7 +39,7 @@ async def get_task_group_activity_list(
|
|
|
38
39
|
status: TaskGroupActivityStatusV2 | None = None,
|
|
39
40
|
action: TaskGroupActivityActionV2 | None = None,
|
|
40
41
|
timestamp_started_min: AwareDatetime | None = None,
|
|
41
|
-
superuser: UserOAuth = Depends(
|
|
42
|
+
superuser: UserOAuth = Depends(current_superuser_act),
|
|
42
43
|
db: AsyncSession = Depends(get_async_db),
|
|
43
44
|
) -> list[TaskGroupActivityV2Read]:
|
|
44
45
|
stm = select(TaskGroupActivityV2)
|
|
@@ -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
|
-
user: UserOAuth = Depends(
|
|
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,
|
|
92
|
-
|
|
93
|
+
resource_id: int | None = None,
|
|
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
|
-
user: UserOAuth = Depends(
|
|
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(
|
|
@@ -21,7 +21,7 @@ from fractal_server.app.routes.api.v2._aux_functions_task_lifecycle import (
|
|
|
21
21
|
from fractal_server.app.routes.api.v2._aux_functions_tasks import (
|
|
22
22
|
_get_task_group_or_404,
|
|
23
23
|
)
|
|
24
|
-
from fractal_server.app.routes.auth import
|
|
24
|
+
from fractal_server.app.routes.auth import current_superuser_act
|
|
25
25
|
from fractal_server.app.routes.aux.validate_user_profile import (
|
|
26
26
|
validate_user_profile,
|
|
27
27
|
)
|
|
@@ -52,7 +52,7 @@ async def deactivate_task_group(
|
|
|
52
52
|
task_group_id: int,
|
|
53
53
|
background_tasks: BackgroundTasks,
|
|
54
54
|
response: Response,
|
|
55
|
-
superuser: UserOAuth = Depends(
|
|
55
|
+
superuser: UserOAuth = Depends(current_superuser_act),
|
|
56
56
|
db: AsyncSession = Depends(get_async_db),
|
|
57
57
|
) -> TaskGroupActivityV2Read:
|
|
58
58
|
"""
|
|
@@ -146,7 +146,7 @@ async def reactivate_task_group(
|
|
|
146
146
|
task_group_id: int,
|
|
147
147
|
background_tasks: BackgroundTasks,
|
|
148
148
|
response: Response,
|
|
149
|
-
superuser: UserOAuth = Depends(
|
|
149
|
+
superuser: UserOAuth = Depends(current_superuser_act),
|
|
150
150
|
db: AsyncSession = Depends(get_async_db),
|
|
151
151
|
) -> TaskGroupActivityV2Read:
|
|
152
152
|
"""
|
|
@@ -247,7 +247,7 @@ async def delete_task_group(
|
|
|
247
247
|
task_group_id: int,
|
|
248
248
|
background_tasks: BackgroundTasks,
|
|
249
249
|
response: Response,
|
|
250
|
-
superuser: UserOAuth = Depends(
|
|
250
|
+
superuser: UserOAuth = Depends(current_superuser_act),
|
|
251
251
|
db: AsyncSession = Depends(get_async_db),
|
|
252
252
|
):
|
|
253
253
|
task_group = await _get_task_group_or_404(
|