fractal-server 2.19.0a0__tar.gz → 2.19.0a2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/PKG-INFO +2 -2
- fractal_server-2.19.0a2/fractal_server/__init__.py +1 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/models/v2/task.py +0 -1
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/models/v2/workflow.py +2 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/models/v2/workflowtask.py +3 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/admin/v2/task.py +0 -5
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/api/v2/_aux_functions_task_lifecycle.py +1 -20
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/api/v2/submit.py +1 -1
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/api/v2/task_group.py +2 -24
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/api/v2/workflow.py +1 -1
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/api/v2/workflow_import.py +12 -43
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/api/v2/workflowtask.py +1 -6
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/auth/current_user.py +8 -0
- fractal_server-2.19.0a2/fractal_server/app/routes/aux/_versions.py +42 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/schemas/v2/__init__.py +0 -1
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/schemas/v2/dumps.py +0 -1
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/schemas/v2/task.py +0 -5
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/schemas/v2/workflow.py +2 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/schemas/v2/workflowtask.py +6 -2
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/security/__init__.py +8 -3
- fractal_server-2.19.0a2/fractal_server/migrations/versions/1bf8785755f9_add_description_to_workflow_and_.py +53 -0
- fractal_server-2.19.0a2/fractal_server/migrations/versions/5fb08bf05b14_drop_taskv2_source.py +36 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/pyproject.toml +3 -4
- fractal_server-2.19.0a0/fractal_server/__init__.py +0 -1
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/LICENSE +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/README.md +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/__main__.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/alembic.ini +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/__init__.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/db/__init__.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/models/__init__.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/models/linkusergroup.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/models/linkuserproject.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/models/security.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/models/v2/__init__.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/models/v2/accounting.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/models/v2/dataset.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/models/v2/history.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/models/v2/job.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/models/v2/profile.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/models/v2/project.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/models/v2/resource.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/models/v2/task_group.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/__init__.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/admin/__init__.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/admin/v2/__init__.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/admin/v2/_aux_functions.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/admin/v2/accounting.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/admin/v2/impersonate.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/admin/v2/job.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/admin/v2/profile.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/admin/v2/resource.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/admin/v2/sharing.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/admin/v2/task_group.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/admin/v2/task_group_lifecycle.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/api/__init__.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/api/alive.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/api/settings.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/api/v2/__init__.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/api/v2/_aux_functions.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/api/v2/_aux_functions_history.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/api/v2/_aux_functions_sharing.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/api/v2/_aux_functions_task_version_update.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/api/v2/_aux_functions_tasks.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/api/v2/_aux_task_group_disambiguation.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/api/v2/dataset.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/api/v2/history.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/api/v2/images.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/api/v2/job.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/api/v2/pre_submission_checks.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/api/v2/project.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/api/v2/sharing.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/api/v2/status_legacy.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/api/v2/task.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/api/v2/task_collection.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/api/v2/task_collection_custom.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/api/v2/task_collection_pixi.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/api/v2/task_group_lifecycle.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/api/v2/task_version_update.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/auth/__init__.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/auth/_aux_auth.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/auth/group.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/auth/login.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/auth/oauth.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/auth/register.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/auth/router.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/auth/users.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/auth/viewer_paths.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/aux/__init__.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/aux/_job.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/aux/_runner.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/aux/validate_user_profile.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/pagination.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/schemas/__init__.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/schemas/user.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/schemas/user_group.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/schemas/v2/accounting.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/schemas/v2/dataset.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/schemas/v2/history.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/schemas/v2/job.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/schemas/v2/manifest.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/schemas/v2/profile.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/schemas/v2/project.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/schemas/v2/resource.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/schemas/v2/sharing.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/schemas/v2/status_legacy.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/schemas/v2/task_collection.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/schemas/v2/task_group.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/security/signup_email.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/shutdown.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/config/__init__.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/config/_data.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/config/_database.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/config/_email.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/config/_main.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/config/_oauth.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/config/_settings_config.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/data_migrations/tools.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/exceptions.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/gunicorn_fractal.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/images/__init__.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/images/models.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/images/status_tools.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/images/tools.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/logger.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/main.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/env.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/naming_convention.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/034a469ec2eb_task_groups.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/068496367952_drop_taskgroup_venv_size_and_files_.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/091b01f51f88_add_usergroup_and_linkusergroup_table.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/0f5f85bb2ae7_add_pre_pinned_packages.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/19eca0dd47a9_user_settings_project_dir.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/1a83a5260664_rename.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/1eac13a26c83_drop_v1_tables.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/316140ff7ee1_remove_usersettings_cache_dir.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/40d6d6511b20_add_index_to_history_models.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/45fbb391d7af_make_resource_id_fk_non_nullable.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/47351f8c7ebc_drop_dataset_filters.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/49d0856e9569_drop_table.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/4c308bcaea2b_add_task_args_schema_and_task_args_.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/4cedeb448a53_workflowtask_foreign_keys_not_nullables.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/501961cfcd85_remove_link_between_v1_and_v2_tasks_.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/50a13d6138fd_initial_schema.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/5bf02391cfef_v2.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/70e77f1c38b0_add_applyworkflow_first_task_index_and_.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/71eefd1dd202_add_slurm_accounts.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/7673fe18c05d_remove_project_dir_server_default.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/7910eed4cf97_user_project_dirs_and_usergroup_viewer_.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/791ce783d3d8_add_indices.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/83bc2ad3ffcc_2_17_0.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/84bf0fffde30_add_dumps_to_applyworkflow.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/88270f589c9b_add_prevent_new_submissions.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/8e8f227a3e36_update_taskv2_post_2_7_0.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/8f79bd162e35_add_docs_info_and_docs_link_to_task_.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/94a47ea2d3ff_remove_cache_dir_slurm_user_and_slurm_.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/969d84257cac_add_historyrun_task_id.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/97f444d47249_add_applyworkflow_project_dump.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/981d588fe248_add_executor_error_log.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/99ea79d9e5d2_add_dataset_history.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/9c5ae74c9b98_add_user_settings_table.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/9db60297b8b2_set_ondelete.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/9fd26a2b0de4_add_workflow_timestamp_created.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/a7f4d6137b53_add_workflow_dump_to_applyworkflow.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/af1ef1c83c9b_add_accounting_tables.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/af8673379a5c_drop_old_filter_columns.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/b1e7f7a1ff71_task_group_for_pixi.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/b3ffb095f973_json_to_jsonb.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/b7477cc98f45_2_18_1.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/bc0e8b3327a7_project_sharing.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/c90a7c76e996_job_id_in_history_run.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/caba9fb1ea5e_drop_useroauth_user_settings_id.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/d256a7379ab8_taskgroup_activity_and_venv_info_to_.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/d4fe3708d309_make_applyworkflow_workflow_dump_non_.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/da2cb2ac4255_user_group_viewer_paths.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/db09233ad13a_split_filters_and_keep_old_columns.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/e0e717ae2f26_delete_linkuserproject_ondelete_project.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/e53dc51fdf93_add_useroauth_is_guest.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/e75cac726012_make_applyworkflow_start_timestamp_not_.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/e81103413827_add_job_type_filters.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/efa89c30e0a4_add_project_timestamp_created.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/f0702066b007_one_submitted_job_per_dataset.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/f37aceb45062_make_historyunit_logfile_required.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/f384e1c0cf5d_drop_task_default_args_columns.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/migrations/versions/fbce16ff4e47_new_history_items.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/py.typed +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/__init__.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/components.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/config/__init__.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/config/_local.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/config/_slurm.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/config/slurm_mem_to_MB.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/exceptions.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/executors/__init__.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/executors/base_runner.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/executors/call_command_wrapper.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/executors/local/__init__.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/executors/local/get_local_config.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/executors/local/runner.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/executors/slurm_common/__init__.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/executors/slurm_common/_batching.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/executors/slurm_common/_job_states.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/executors/slurm_common/base_slurm_runner.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/executors/slurm_common/get_slurm_config.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/executors/slurm_common/remote.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/executors/slurm_common/slurm_config.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/executors/slurm_common/slurm_job_task_models.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/executors/slurm_ssh/__init__.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/executors/slurm_ssh/run_subprocess.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/executors/slurm_ssh/runner.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/executors/slurm_ssh/tar_commands.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/executors/slurm_sudo/__init__.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/executors/slurm_sudo/_subprocess_run_as_user.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/executors/slurm_sudo/runner.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/filenames.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/set_start_and_last_task_index.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/task_files.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/v2/__init__.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/v2/_local.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/v2/_slurm_ssh.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/v2/_slurm_sudo.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/v2/db_tools.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/v2/deduplicate_list.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/v2/merge_outputs.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/v2/runner.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/v2/runner_functions.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/v2/submit_workflow.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/v2/task_interface.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/runner/versions.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/ssh/__init__.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/ssh/_fabric.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/string_tools.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/syringe.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/__init__.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/config/__init__.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/config/_pixi.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/config/_python.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/utils.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/v2/__init__.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/v2/local/__init__.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/v2/local/_utils.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/v2/local/collect.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/v2/local/collect_pixi.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/v2/local/deactivate.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/v2/local/deactivate_pixi.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/v2/local/delete.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/v2/local/reactivate.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/v2/local/reactivate_pixi.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/v2/ssh/__init__.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/v2/ssh/_pixi_slurm_ssh.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/v2/ssh/_utils.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/v2/ssh/collect.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/v2/ssh/collect_pixi.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/v2/ssh/deactivate.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/v2/ssh/deactivate_pixi.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/v2/ssh/delete.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/v2/ssh/reactivate.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/v2/ssh/reactivate_pixi.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/v2/templates/1_create_venv.sh +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/v2/templates/2_pip_install.sh +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/v2/templates/3_pip_freeze.sh +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/v2/templates/4_pip_show.sh +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/v2/templates/5_pip_install_from_freeze.sh +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/v2/templates/pixi_1_extract.sh +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/v2/templates/pixi_2_install.sh +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/v2/templates/pixi_3_post_install.sh +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/v2/utils_background.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/v2/utils_database.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/v2/utils_package_names.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/v2/utils_pixi.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/v2/utils_python_interpreter.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/tasks/v2/utils_templates.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/types/__init__.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/types/validators/__init__.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/types/validators/_common_validators.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/types/validators/_filter_validators.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/types/validators/_workflow_task_arguments_validators.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/urls.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/utils.py +0 -0
- {fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/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.19.
|
|
3
|
+
Version: 2.19.0a2
|
|
4
4
|
Summary: Backend component of the Fractal analytics platform
|
|
5
5
|
Author: Tommaso Comparin, Marco Franzon, Yuri Chiucconi, Jacopo Nespolo
|
|
6
6
|
Author-email: Tommaso Comparin <tommaso.comparin@exact-lab.it>, Marco Franzon <marco.franzon@exact-lab.it>, Yuri Chiucconi <yuri.chiucconi@exact-lab.it>, Jacopo Nespolo <jacopo.nespolo@exact-lab.it>
|
|
@@ -17,7 +17,7 @@ Requires-Dist: pydantic>=2.12.0,<2.13.0
|
|
|
17
17
|
Requires-Dist: pydantic-settings==2.12.0
|
|
18
18
|
Requires-Dist: packaging>=25.0.0,<26.0.0
|
|
19
19
|
Requires-Dist: fabric>=3.2.2,<3.3.0
|
|
20
|
-
Requires-Dist: gunicorn>=
|
|
20
|
+
Requires-Dist: gunicorn>=24.1,<25
|
|
21
21
|
Requires-Dist: psycopg[binary]>=3.1.0,<4.0.0
|
|
22
22
|
Requires-Dist: tomli-w>=1.2.0,<1.3.0
|
|
23
23
|
Requires-Python: >=3.12, <3.15
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__VERSION__ = "2.19.0a2"
|
|
@@ -14,7 +14,6 @@ class TaskV2(SQLModel, table=True):
|
|
|
14
14
|
type: str
|
|
15
15
|
command_non_parallel: str | None = None
|
|
16
16
|
command_parallel: str | None = None
|
|
17
|
-
source: str | None = None
|
|
18
17
|
|
|
19
18
|
meta_non_parallel: dict[str, Any] = Field(
|
|
20
19
|
sa_column=Column(JSON, server_default="{}", default={}, nullable=False)
|
{fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/models/v2/workflowtask.py
RENAMED
|
@@ -39,3 +39,6 @@ class WorkflowTaskV2(SQLModel, table=True):
|
|
|
39
39
|
task_type: str
|
|
40
40
|
task_id: int = Field(foreign_key="taskv2.id")
|
|
41
41
|
task: TaskV2 = Relationship(sa_relationship_kwargs=dict(lazy="selectin"))
|
|
42
|
+
|
|
43
|
+
alias: str | None = Field(default=None, nullable=True)
|
|
44
|
+
description: str | None = Field(default=None, nullable=True)
|
{fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/admin/v2/task.py
RENAMED
|
@@ -30,7 +30,6 @@ class TaskMinimal(BaseModel):
|
|
|
30
30
|
taskgroupv2_id: int
|
|
31
31
|
command_non_parallel: str | None = None
|
|
32
32
|
command_parallel: str | None = None
|
|
33
|
-
source: str | None = None
|
|
34
33
|
version: str | None = None
|
|
35
34
|
|
|
36
35
|
|
|
@@ -55,7 +54,6 @@ class TaskInfo(BaseModel):
|
|
|
55
54
|
@router.get("/", response_model=PaginationResponse[TaskInfo])
|
|
56
55
|
async def query_tasks(
|
|
57
56
|
id: int | None = None,
|
|
58
|
-
source: str | None = None,
|
|
59
57
|
version: str | None = None,
|
|
60
58
|
name: str | None = None,
|
|
61
59
|
task_type: TaskType | None = None,
|
|
@@ -81,9 +79,6 @@ async def query_tasks(
|
|
|
81
79
|
if id is not None:
|
|
82
80
|
stm = stm.where(TaskV2.id == id)
|
|
83
81
|
stm_count = stm_count.where(TaskV2.id == id)
|
|
84
|
-
if source is not None:
|
|
85
|
-
stm = stm.where(TaskV2.source.icontains(source))
|
|
86
|
-
stm_count = stm_count.where(TaskV2.source.icontains(source))
|
|
87
82
|
if version is not None:
|
|
88
83
|
stm = stm.where(TaskV2.version == version)
|
|
89
84
|
stm_count = stm_count.where(TaskV2.version == version)
|
|
@@ -2,8 +2,6 @@ from fastapi import HTTPException
|
|
|
2
2
|
from fastapi import status
|
|
3
3
|
from httpx import AsyncClient
|
|
4
4
|
from httpx import TimeoutException
|
|
5
|
-
from packaging.version import InvalidVersion
|
|
6
|
-
from packaging.version import Version
|
|
7
5
|
from sqlmodel import func
|
|
8
6
|
from sqlmodel import select
|
|
9
7
|
|
|
@@ -14,6 +12,7 @@ from fractal_server.app.models.v2 import TaskGroupV2
|
|
|
14
12
|
from fractal_server.app.models.v2 import TaskV2
|
|
15
13
|
from fractal_server.app.models.v2 import WorkflowTaskV2
|
|
16
14
|
from fractal_server.app.models.v2 import WorkflowV2
|
|
15
|
+
from fractal_server.app.routes.aux._versions import _find_latest_version_or_422
|
|
17
16
|
from fractal_server.app.schemas.v2 import JobStatusType
|
|
18
17
|
from fractal_server.app.schemas.v2 import TaskGroupActivityStatus
|
|
19
18
|
from fractal_server.logger import set_logger
|
|
@@ -26,24 +25,6 @@ PYPI_JSON_HEADERS = {"Accept": "application/vnd.pypi.simple.v1+json"}
|
|
|
26
25
|
logger = set_logger(__name__)
|
|
27
26
|
|
|
28
27
|
|
|
29
|
-
def _find_latest_version_or_422(versions: list[str]) -> str:
|
|
30
|
-
"""
|
|
31
|
-
> For PEP 440 versions, this is easy enough for the client to do (using
|
|
32
|
-
> the `packaging` library [...]. For non-standard versions, there is no
|
|
33
|
-
> well-defined ordering, and clients will need to decide on what rule is
|
|
34
|
-
> appropriate for their needs.
|
|
35
|
-
(https://peps.python.org/pep-0700/#why-not-provide-a-latest-version-value)
|
|
36
|
-
"""
|
|
37
|
-
try:
|
|
38
|
-
latest = max(versions, key=lambda v_str: Version(v_str))
|
|
39
|
-
return latest
|
|
40
|
-
except InvalidVersion as e:
|
|
41
|
-
raise HTTPException(
|
|
42
|
-
status_code=status.HTTP_422_UNPROCESSABLE_CONTENT,
|
|
43
|
-
detail=f"Cannot find latest version (original error: {str(e)}).",
|
|
44
|
-
)
|
|
45
|
-
|
|
46
|
-
|
|
47
28
|
async def get_package_version_from_pypi(
|
|
48
29
|
name: str,
|
|
49
30
|
version: str | None = None,
|
{fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/api/v2/submit.py
RENAMED
|
@@ -216,7 +216,7 @@ async def submit_job(
|
|
|
216
216
|
dataset.model_dump_json(exclude={"images", "history"})
|
|
217
217
|
),
|
|
218
218
|
workflow_dump=json.loads(
|
|
219
|
-
workflow.model_dump_json(exclude={"task_list"})
|
|
219
|
+
workflow.model_dump_json(exclude={"task_list", "description"})
|
|
220
220
|
),
|
|
221
221
|
project_dump=json.loads(
|
|
222
222
|
project.model_dump_json(exclude={"resource_id"})
|
{fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/api/v2/task_group.py
RENAMED
|
@@ -4,9 +4,6 @@ from fastapi import APIRouter
|
|
|
4
4
|
from fastapi import Depends
|
|
5
5
|
from fastapi import HTTPException
|
|
6
6
|
from fastapi import status
|
|
7
|
-
from packaging.version import InvalidVersion
|
|
8
|
-
from packaging.version import Version
|
|
9
|
-
from packaging.version import parse
|
|
10
7
|
from pydantic.types import AwareDatetime
|
|
11
8
|
from sqlmodel import or_
|
|
12
9
|
from sqlmodel import select
|
|
@@ -25,6 +22,7 @@ from fractal_server.app.routes.auth._aux_auth import (
|
|
|
25
22
|
from fractal_server.app.routes.auth._aux_auth import (
|
|
26
23
|
_verify_user_belongs_to_group,
|
|
27
24
|
)
|
|
25
|
+
from fractal_server.app.routes.aux._versions import _version_sort_key
|
|
28
26
|
from fractal_server.app.schemas.v2 import TaskGroupActivityAction
|
|
29
27
|
from fractal_server.app.schemas.v2 import TaskGroupActivityRead
|
|
30
28
|
from fractal_server.app.schemas.v2 import TaskGroupActivityStatus
|
|
@@ -43,26 +41,6 @@ router = APIRouter()
|
|
|
43
41
|
logger = set_logger(__name__)
|
|
44
42
|
|
|
45
43
|
|
|
46
|
-
def _version_sort_key(
|
|
47
|
-
task_group: TaskGroupV2,
|
|
48
|
-
) -> tuple[int, Version | str | None]:
|
|
49
|
-
"""
|
|
50
|
-
Returns a tuple used as (reverse) ordering key for TaskGroups in
|
|
51
|
-
`get_task_group_list`.
|
|
52
|
-
The TaskGroups with a parsable versions are the first in order,
|
|
53
|
-
sorted according to the sorting rules of packaging.version.Version.
|
|
54
|
-
Next in order we have the TaskGroups with non-null non-parsable versions,
|
|
55
|
-
sorted alphabetically.
|
|
56
|
-
Last we have the TaskGroups with null version.
|
|
57
|
-
"""
|
|
58
|
-
if task_group.version is None:
|
|
59
|
-
return (0, task_group.version)
|
|
60
|
-
try:
|
|
61
|
-
return (2, parse(task_group.version))
|
|
62
|
-
except InvalidVersion:
|
|
63
|
-
return (1, task_group.version)
|
|
64
|
-
|
|
65
|
-
|
|
66
44
|
@router.get("/activity/", response_model=list[TaskGroupActivityRead])
|
|
67
45
|
async def get_task_group_activity_list(
|
|
68
46
|
task_group_activity_id: int | None = None,
|
|
@@ -176,7 +154,7 @@ async def get_task_group_list(
|
|
|
176
154
|
await remove_duplicate_task_groups(
|
|
177
155
|
task_groups=sorted(
|
|
178
156
|
list(groups),
|
|
179
|
-
key=_version_sort_key,
|
|
157
|
+
key=lambda group: _version_sort_key(group.version),
|
|
180
158
|
reverse=True,
|
|
181
159
|
),
|
|
182
160
|
user_id=user.id,
|
|
@@ -19,8 +19,8 @@ from fractal_server.app.routes.auth import get_api_user
|
|
|
19
19
|
from fractal_server.app.routes.auth._aux_auth import (
|
|
20
20
|
_get_default_usergroup_id_or_none,
|
|
21
21
|
)
|
|
22
|
+
from fractal_server.app.routes.aux._versions import _version_sort_key
|
|
22
23
|
from fractal_server.app.schemas.v2 import TaskImport
|
|
23
|
-
from fractal_server.app.schemas.v2 import TaskImportLegacy
|
|
24
24
|
from fractal_server.app.schemas.v2 import WorkflowImport
|
|
25
25
|
from fractal_server.app.schemas.v2 import WorkflowReadWithWarnings
|
|
26
26
|
from fractal_server.app.schemas.v2 import WorkflowTaskCreate
|
|
@@ -73,32 +73,6 @@ async def _get_user_accessible_taskgroups(
|
|
|
73
73
|
return accessible_task_groups
|
|
74
74
|
|
|
75
75
|
|
|
76
|
-
async def _get_task_by_source(
|
|
77
|
-
source: str,
|
|
78
|
-
task_groups_list: list[TaskGroupV2],
|
|
79
|
-
) -> int | None:
|
|
80
|
-
"""
|
|
81
|
-
Find task with a given source.
|
|
82
|
-
|
|
83
|
-
Args:
|
|
84
|
-
source: `source` of the task to be imported.
|
|
85
|
-
task_groups_list: Current list of valid task groups.
|
|
86
|
-
|
|
87
|
-
Return:
|
|
88
|
-
`id` of the matching task, or `None`.
|
|
89
|
-
"""
|
|
90
|
-
task_id = next(
|
|
91
|
-
iter(
|
|
92
|
-
task.id
|
|
93
|
-
for task_group in task_groups_list
|
|
94
|
-
for task in task_group.task_list
|
|
95
|
-
if task.source == source
|
|
96
|
-
),
|
|
97
|
-
None,
|
|
98
|
-
)
|
|
99
|
-
return task_id
|
|
100
|
-
|
|
101
|
-
|
|
102
76
|
async def _get_task_by_taskimport(
|
|
103
77
|
*,
|
|
104
78
|
task_import: TaskImport,
|
|
@@ -141,14 +115,15 @@ async def _get_task_by_taskimport(
|
|
|
141
115
|
return None
|
|
142
116
|
|
|
143
117
|
# Determine target `version`
|
|
144
|
-
# Note that task_import.version cannot be "", due to a validator
|
|
145
118
|
if task_import.version is None:
|
|
146
119
|
logger.debug(
|
|
147
120
|
"[_get_task_by_taskimport] "
|
|
148
121
|
"No version requested, looking for latest."
|
|
149
122
|
)
|
|
150
|
-
|
|
151
|
-
|
|
123
|
+
version = max(
|
|
124
|
+
[tg.version for tg in matching_task_groups],
|
|
125
|
+
key=_version_sort_key,
|
|
126
|
+
)
|
|
152
127
|
logger.debug(
|
|
153
128
|
f"[_get_task_by_taskimport] Latest version set to {version}."
|
|
154
129
|
)
|
|
@@ -246,19 +221,13 @@ async def import_workflow(
|
|
|
246
221
|
list_task_ids = []
|
|
247
222
|
for wf_task in workflow_import.task_list:
|
|
248
223
|
task_import = wf_task.task
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
task_import=task_import,
|
|
257
|
-
user_id=user.id,
|
|
258
|
-
default_group_id=default_group_id,
|
|
259
|
-
task_groups_list=task_group_list,
|
|
260
|
-
db=db,
|
|
261
|
-
)
|
|
224
|
+
task_id = await _get_task_by_taskimport(
|
|
225
|
+
task_import=task_import,
|
|
226
|
+
user_id=user.id,
|
|
227
|
+
default_group_id=default_group_id,
|
|
228
|
+
task_groups_list=task_group_list,
|
|
229
|
+
db=db,
|
|
230
|
+
)
|
|
262
231
|
if task_id is None:
|
|
263
232
|
raise HTTPException(
|
|
264
233
|
status_code=status.HTTP_422_UNPROCESSABLE_CONTENT,
|
{fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/api/v2/workflowtask.py
RENAMED
|
@@ -193,13 +193,8 @@ async def update_workflowtask(
|
|
|
193
193
|
if not actual_args:
|
|
194
194
|
actual_args = None
|
|
195
195
|
setattr(db_wf_task, key, actual_args)
|
|
196
|
-
elif key in ["meta_parallel", "meta_non_parallel", "type_filters"]:
|
|
197
|
-
setattr(db_wf_task, key, value)
|
|
198
196
|
else:
|
|
199
|
-
|
|
200
|
-
status_code=status.HTTP_422_UNPROCESSABLE_CONTENT,
|
|
201
|
-
detail=f"patch_workflow_task endpoint cannot set {key=}",
|
|
202
|
-
)
|
|
197
|
+
setattr(db_wf_task, key, value)
|
|
203
198
|
|
|
204
199
|
await db.commit()
|
|
205
200
|
await db.refresh(db_wf_task)
|
{fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/routes/auth/current_user.py
RENAMED
|
@@ -4,6 +4,8 @@ Definition of `/auth/current-user/` endpoints
|
|
|
4
4
|
|
|
5
5
|
from fastapi import APIRouter
|
|
6
6
|
from fastapi import Depends
|
|
7
|
+
from fastapi import HTTPException
|
|
8
|
+
from fastapi import status
|
|
7
9
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
8
10
|
from sqlmodel import select
|
|
9
11
|
|
|
@@ -52,6 +54,12 @@ async def patch_current_user(
|
|
|
52
54
|
Note: a user cannot patch their own password (as enforced within the
|
|
53
55
|
`UserUpdateStrict` schema).
|
|
54
56
|
"""
|
|
57
|
+
if current_user.is_guest:
|
|
58
|
+
raise HTTPException(
|
|
59
|
+
status_code=status.HTTP_403_FORBIDDEN,
|
|
60
|
+
detail="This feature is not available for guest users.",
|
|
61
|
+
)
|
|
62
|
+
|
|
55
63
|
update = UserUpdate(**user_update.model_dump(exclude_unset=True))
|
|
56
64
|
|
|
57
65
|
# NOTE: here it would be relevant to catch an `InvalidPasswordException`
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
from fastapi import HTTPException
|
|
2
|
+
from fastapi import status
|
|
3
|
+
from packaging.version import InvalidVersion
|
|
4
|
+
from packaging.version import Version
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def _version_sort_key(version: str | None) -> tuple[int, Version | str | None]:
|
|
8
|
+
"""
|
|
9
|
+
Returns a tuple used as (reverse) ordering key for TaskGroups in
|
|
10
|
+
`get_task_group_list`.
|
|
11
|
+
The parsable versions are the first in order, sorted according to the
|
|
12
|
+
sorting rules of packaging.version.Version.
|
|
13
|
+
Next in order we have the non-null non-parsable versions, sorted
|
|
14
|
+
alphabetically.
|
|
15
|
+
"""
|
|
16
|
+
if version is None:
|
|
17
|
+
return (0, None)
|
|
18
|
+
try:
|
|
19
|
+
return (2, Version(version))
|
|
20
|
+
except InvalidVersion:
|
|
21
|
+
return (1, version)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _find_latest_version_or_422(versions: list[str]) -> str:
|
|
25
|
+
"""
|
|
26
|
+
> For PEP 440 versions, this is easy enough for the client to do (using
|
|
27
|
+
> the `packaging` library [...]. For non-standard versions, there is no
|
|
28
|
+
> well-defined ordering, and clients will need to decide on what rule is
|
|
29
|
+
> appropriate for their needs.
|
|
30
|
+
(https://peps.python.org/pep-0700/#why-not-provide-a-latest-version-value)
|
|
31
|
+
|
|
32
|
+
The `versions` array is coming from the PyPI API, and its elements are
|
|
33
|
+
assumed parsable.
|
|
34
|
+
"""
|
|
35
|
+
try:
|
|
36
|
+
latest = max(versions, key=lambda v_str: Version(v_str))
|
|
37
|
+
return latest
|
|
38
|
+
except InvalidVersion as e:
|
|
39
|
+
raise HTTPException(
|
|
40
|
+
status_code=status.HTTP_422_UNPROCESSABLE_CONTENT,
|
|
41
|
+
detail=f"Cannot find latest version (original error: {str(e)}).",
|
|
42
|
+
)
|
{fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/schemas/v2/__init__.py
RENAMED
|
@@ -47,7 +47,6 @@ from .status_legacy import WorkflowTaskStatusType # noqa F401
|
|
|
47
47
|
from .task import TaskCreate # noqa F401
|
|
48
48
|
from .task import TaskExport # noqa F401
|
|
49
49
|
from .task import TaskImport # noqa F401
|
|
50
|
-
from .task import TaskImportLegacy # noqa F401
|
|
51
50
|
from .task import TaskRead # noqa F401
|
|
52
51
|
from .task import TaskType # noqa F401
|
|
53
52
|
from .task import TaskUpdate # noqa F401
|
|
@@ -94,7 +94,6 @@ class TaskRead(BaseModel):
|
|
|
94
94
|
id: int
|
|
95
95
|
name: str
|
|
96
96
|
type: TaskType
|
|
97
|
-
source: str | None = None
|
|
98
97
|
version: str | None = None
|
|
99
98
|
|
|
100
99
|
command_non_parallel: str | None = None
|
|
@@ -139,10 +138,6 @@ class TaskImport(BaseModel):
|
|
|
139
138
|
name: NonEmptyStr
|
|
140
139
|
|
|
141
140
|
|
|
142
|
-
class TaskImportLegacy(BaseModel):
|
|
143
|
-
source: NonEmptyStr
|
|
144
|
-
|
|
145
|
-
|
|
146
141
|
class TaskExport(BaseModel):
|
|
147
142
|
pkg_name: NonEmptyStr
|
|
148
143
|
version: NonEmptyStr | None = None
|
{fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/schemas/v2/workflow.py
RENAMED
|
@@ -29,6 +29,7 @@ class WorkflowRead(BaseModel):
|
|
|
29
29
|
task_list: list[WorkflowTaskRead]
|
|
30
30
|
project: ProjectRead
|
|
31
31
|
timestamp_created: AwareDatetime
|
|
32
|
+
description: str | None
|
|
32
33
|
|
|
33
34
|
@field_serializer("timestamp_created")
|
|
34
35
|
def serialize_datetime(v: datetime) -> str:
|
|
@@ -44,6 +45,7 @@ class WorkflowUpdate(BaseModel):
|
|
|
44
45
|
|
|
45
46
|
name: NonEmptyStr = None
|
|
46
47
|
reordered_workflowtask_ids: ListUniqueNonNegativeInt | None = None
|
|
48
|
+
description: str | None = None
|
|
47
49
|
|
|
48
50
|
|
|
49
51
|
class WorkflowImport(BaseModel):
|
{fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/schemas/v2/workflowtask.py
RENAMED
|
@@ -11,7 +11,6 @@ from fractal_server.types import WorkflowTaskArgument
|
|
|
11
11
|
|
|
12
12
|
from .task import TaskExport
|
|
13
13
|
from .task import TaskImport
|
|
14
|
-
from .task import TaskImportLegacy
|
|
15
14
|
from .task import TaskRead
|
|
16
15
|
from .task import TaskType
|
|
17
16
|
|
|
@@ -50,6 +49,9 @@ class WorkflowTaskRead(BaseModel):
|
|
|
50
49
|
task_id: int
|
|
51
50
|
task: TaskRead
|
|
52
51
|
|
|
52
|
+
alias: str | None = None
|
|
53
|
+
description: str | None = None
|
|
54
|
+
|
|
53
55
|
|
|
54
56
|
class WorkflowTaskReadWithWarning(WorkflowTaskRead):
|
|
55
57
|
warning: str | None = None
|
|
@@ -63,6 +65,8 @@ class WorkflowTaskUpdate(BaseModel):
|
|
|
63
65
|
args_non_parallel: WorkflowTaskArgument | None = None
|
|
64
66
|
args_parallel: WorkflowTaskArgument | None = None
|
|
65
67
|
type_filters: TypeFilters = None
|
|
68
|
+
description: str | None = None
|
|
69
|
+
alias: str | None = None
|
|
66
70
|
|
|
67
71
|
|
|
68
72
|
class WorkflowTaskImport(BaseModel):
|
|
@@ -75,7 +79,7 @@ class WorkflowTaskImport(BaseModel):
|
|
|
75
79
|
type_filters: TypeFilters | None = None
|
|
76
80
|
input_filters: dict[str, Any] | None = None
|
|
77
81
|
|
|
78
|
-
task: TaskImport
|
|
82
|
+
task: TaskImport
|
|
79
83
|
|
|
80
84
|
@model_validator(mode="before")
|
|
81
85
|
@classmethod
|
|
@@ -21,6 +21,7 @@ from collections.abc import AsyncGenerator
|
|
|
21
21
|
from typing import Any
|
|
22
22
|
from typing import Generic
|
|
23
23
|
from typing import Self
|
|
24
|
+
from typing import override
|
|
24
25
|
|
|
25
26
|
from fastapi import Depends
|
|
26
27
|
from fastapi import Request
|
|
@@ -188,19 +189,22 @@ class UserManager(IntegerIDMixin, BaseUserManager[UserOAuth, int]):
|
|
|
188
189
|
password_helper=password_helper,
|
|
189
190
|
)
|
|
190
191
|
|
|
192
|
+
@override
|
|
191
193
|
async def validate_password(self, password: str, user: UserOAuth) -> None:
|
|
192
194
|
# check password length
|
|
193
195
|
min_length = 4
|
|
194
|
-
max_length =
|
|
196
|
+
max_length = 72
|
|
195
197
|
if len(password) < min_length:
|
|
196
198
|
raise InvalidPasswordException(
|
|
197
199
|
f"The password is too short (minimum length: {min_length})."
|
|
198
200
|
)
|
|
199
|
-
|
|
201
|
+
if len(password.encode("utf-8")) > max_length:
|
|
200
202
|
raise InvalidPasswordException(
|
|
201
|
-
|
|
203
|
+
"The password is too long "
|
|
204
|
+
f"(maximum length: {max_length} bytes)."
|
|
202
205
|
)
|
|
203
206
|
|
|
207
|
+
@override
|
|
204
208
|
async def oauth_callback(
|
|
205
209
|
self: Self,
|
|
206
210
|
oauth_name: str,
|
|
@@ -324,6 +328,7 @@ class UserManager(IntegerIDMixin, BaseUserManager[UserOAuth, int]):
|
|
|
324
328
|
|
|
325
329
|
return user
|
|
326
330
|
|
|
331
|
+
@override
|
|
327
332
|
async def on_after_register(
|
|
328
333
|
self, user: UserOAuth, request: Request | None = None
|
|
329
334
|
):
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"""Add description to workflow and description and alias to workflow task
|
|
2
|
+
|
|
3
|
+
Revision ID: 1bf8785755f9
|
|
4
|
+
Revises: 5fb08bf05b14
|
|
5
|
+
Create Date: 2026-01-26 09:03:18.396841
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import sqlalchemy as sa
|
|
10
|
+
import sqlmodel
|
|
11
|
+
from alembic import op
|
|
12
|
+
|
|
13
|
+
# revision identifiers, used by Alembic.
|
|
14
|
+
revision = "1bf8785755f9"
|
|
15
|
+
down_revision = "5fb08bf05b14"
|
|
16
|
+
branch_labels = None
|
|
17
|
+
depends_on = None
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def upgrade() -> None:
|
|
21
|
+
# ### commands auto generated by Alembic - please adjust! ###
|
|
22
|
+
with op.batch_alter_table("workflowtaskv2", schema=None) as batch_op:
|
|
23
|
+
batch_op.add_column(
|
|
24
|
+
sa.Column(
|
|
25
|
+
"alias", sqlmodel.sql.sqltypes.AutoString(), nullable=True
|
|
26
|
+
)
|
|
27
|
+
)
|
|
28
|
+
batch_op.add_column(
|
|
29
|
+
sa.Column(
|
|
30
|
+
"description", sqlmodel.sql.sqltypes.AutoString(), nullable=True
|
|
31
|
+
)
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
with op.batch_alter_table("workflowv2", schema=None) as batch_op:
|
|
35
|
+
batch_op.add_column(
|
|
36
|
+
sa.Column(
|
|
37
|
+
"description", sqlmodel.sql.sqltypes.AutoString(), nullable=True
|
|
38
|
+
)
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
# ### end Alembic commands ###
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def downgrade() -> None:
|
|
45
|
+
# ### commands auto generated by Alembic - please adjust! ###
|
|
46
|
+
with op.batch_alter_table("workflowv2", schema=None) as batch_op:
|
|
47
|
+
batch_op.drop_column("description")
|
|
48
|
+
|
|
49
|
+
with op.batch_alter_table("workflowtaskv2", schema=None) as batch_op:
|
|
50
|
+
batch_op.drop_column("description")
|
|
51
|
+
batch_op.drop_column("alias")
|
|
52
|
+
|
|
53
|
+
# ### end Alembic commands ###
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"""drop TaskV2.source
|
|
2
|
+
|
|
3
|
+
Revision ID: 5fb08bf05b14
|
|
4
|
+
Revises: e53dc51fdf93
|
|
5
|
+
Create Date: 2026-01-21 12:50:39.072816
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import sqlalchemy as sa
|
|
10
|
+
from alembic import op
|
|
11
|
+
|
|
12
|
+
# revision identifiers, used by Alembic.
|
|
13
|
+
revision = "5fb08bf05b14"
|
|
14
|
+
down_revision = "e53dc51fdf93"
|
|
15
|
+
branch_labels = None
|
|
16
|
+
depends_on = None
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def upgrade() -> None:
|
|
20
|
+
# ### commands auto generated by Alembic - please adjust! ###
|
|
21
|
+
with op.batch_alter_table("taskv2", schema=None) as batch_op:
|
|
22
|
+
batch_op.drop_column("source")
|
|
23
|
+
|
|
24
|
+
# ### end Alembic commands ###
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def downgrade() -> None:
|
|
28
|
+
# ### commands auto generated by Alembic - please adjust! ###
|
|
29
|
+
with op.batch_alter_table("taskv2", schema=None) as batch_op:
|
|
30
|
+
batch_op.add_column(
|
|
31
|
+
sa.Column(
|
|
32
|
+
"source", sa.VARCHAR(), autoincrement=False, nullable=True
|
|
33
|
+
)
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
# ### end Alembic commands ###
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "fractal-server"
|
|
3
|
-
version = "2.19.
|
|
3
|
+
version = "2.19.0a2"
|
|
4
4
|
description = "Backend component of the Fractal analytics platform"
|
|
5
5
|
authors = [
|
|
6
6
|
{ name="Tommaso Comparin", email="tommaso.comparin@exact-lab.it" },
|
|
@@ -25,7 +25,7 @@ dependencies = [
|
|
|
25
25
|
"pydantic-settings ==2.12.0",
|
|
26
26
|
"packaging >= 25.0.0, <26.0.0",
|
|
27
27
|
"fabric >= 3.2.2, <3.3.0",
|
|
28
|
-
"gunicorn >=
|
|
28
|
+
"gunicorn >=24.1,<25",
|
|
29
29
|
"psycopg[binary] >= 3.1.0, <4.0.0",
|
|
30
30
|
"tomli_w >=1.2.0, <1.3.0 "
|
|
31
31
|
]
|
|
@@ -48,7 +48,6 @@ dev = [
|
|
|
48
48
|
"devtools ==0.12",
|
|
49
49
|
"pytest-asyncio >= 1.2.0,<1.3.0",
|
|
50
50
|
"bumpver >=2024.0",
|
|
51
|
-
"pre-commit ==4.2.0",
|
|
52
51
|
"coverage>=7.12.0,<7.13.0",
|
|
53
52
|
"pytest-docker >=3.2.0,<3.3.0",
|
|
54
53
|
"pytest-subprocess >=1.5.0,<1.6.0",
|
|
@@ -93,7 +92,7 @@ filterwarnings = [
|
|
|
93
92
|
markers = ["container", "ssh", "fails_on_macos", "oauth"]
|
|
94
93
|
|
|
95
94
|
[tool.bumpver]
|
|
96
|
-
current_version = "2.19.
|
|
95
|
+
current_version = "2.19.0a2"
|
|
97
96
|
version_pattern = "MAJOR.MINOR.PATCH[PYTAGNUM]"
|
|
98
97
|
commit_message = "bump version {old_version} -> {new_version}"
|
|
99
98
|
commit = true
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__VERSION__ = "2.19.0a0"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/models/linkusergroup.py
RENAMED
|
File without changes
|
{fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/models/linkuserproject.py
RENAMED
|
File without changes
|
|
File without changes
|
{fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/models/v2/__init__.py
RENAMED
|
File without changes
|
{fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/models/v2/accounting.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fractal_server-2.19.0a0 → fractal_server-2.19.0a2}/fractal_server/app/models/v2/resource.py
RENAMED
|
File without changes
|