flywheel-sdk 21.2.0__py3-none-any.whl
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.
- flywheel/__init__.py +784 -0
- flywheel/api/__init__.py +46 -0
- flywheel/api/acquisitions_api.py +5014 -0
- flywheel/api/analyses_api.py +3848 -0
- flywheel/api/audit_trail_api.py +568 -0
- flywheel/api/auth_api.py +121 -0
- flywheel/api/batch_api.py +630 -0
- flywheel/api/bulk_api.py +140 -0
- flywheel/api/change_log_api.py +254 -0
- flywheel/api/collections_api.py +3913 -0
- flywheel/api/config_api.py +299 -0
- flywheel/api/container_tasks_api.py +137 -0
- flywheel/api/container_type_api.py +137 -0
- flywheel/api/containers_api.py +4784 -0
- flywheel/api/custom_filters_api.py +466 -0
- flywheel/api/data_view_executions_api.py +549 -0
- flywheel/api/dataexplorer_api.py +1192 -0
- flywheel/api/devices_api.py +1071 -0
- flywheel/api/dimse_api.py +814 -0
- flywheel/api/download_api.py +261 -0
- flywheel/api/files_api.py +1868 -0
- flywheel/api/form_responses_api.py +703 -0
- flywheel/api/gears_api.py +1875 -0
- flywheel/api/groups_api.py +2829 -0
- flywheel/api/jobs_api.py +2320 -0
- flywheel/api/jupyterlab_servers_api.py +245 -0
- flywheel/api/modalities_api.py +562 -0
- flywheel/api/packfiles_api.py +121 -0
- flywheel/api/projects_api.py +7820 -0
- flywheel/api/protocols_api.py +757 -0
- flywheel/api/reports_api.py +1057 -0
- flywheel/api/resolve_api.py +276 -0
- flywheel/api/roles_api.py +563 -0
- flywheel/api/sessions_api.py +5296 -0
- flywheel/api/site_api.py +1552 -0
- flywheel/api/staffing_pools_api.py +677 -0
- flywheel/api/subjects_api.py +5349 -0
- flywheel/api/tasks_api.py +897 -0
- flywheel/api/tree_api.py +266 -0
- flywheel/api/uids_api.py +140 -0
- flywheel/api/upload_api.py +842 -0
- flywheel/api/users_api.py +2142 -0
- flywheel/api/views_api.py +1089 -0
- flywheel/api_client.py +748 -0
- flywheel/client.py +291 -0
- flywheel/configuration.py +308 -0
- flywheel/drone_login.py +65 -0
- flywheel/file_spec.py +67 -0
- flywheel/finder.py +168 -0
- flywheel/flywheel.py +9867 -0
- flywheel/gear_context.py +374 -0
- flywheel/models/__init__.py +726 -0
- flywheel/models/access_level.py +30 -0
- flywheel/models/access_permission.py +197 -0
- flywheel/models/access_permission_output.py +192 -0
- flywheel/models/access_permission_update.py +166 -0
- flywheel/models/access_type.py +54 -0
- flywheel/models/accumulator.py +33 -0
- flywheel/models/acquisition.py +25 -0
- flywheel/models/acquisition_container_output.py +34 -0
- flywheel/models/acquisition_copy_input.py +223 -0
- flywheel/models/acquisition_input.py +297 -0
- flywheel/models/acquisition_list_output.py +767 -0
- flywheel/models/acquisition_modify_input.py +299 -0
- flywheel/models/acquisition_node.py +35 -0
- flywheel/models/acquisition_output.py +767 -0
- flywheel/models/acquisition_parents.py +241 -0
- flywheel/models/acquisition_template_options.py +275 -0
- flywheel/models/acquisition_upsert_input.py +383 -0
- flywheel/models/acquisition_upsert_output.py +243 -0
- flywheel/models/action.py +91 -0
- flywheel/models/adhoc_analysis_input.py +247 -0
- flywheel/models/analysis.py +25 -0
- flywheel/models/analysis_container_output.py +34 -0
- flywheel/models/analysis_files_create_ticket_output.py +241 -0
- flywheel/models/analysis_input.py +310 -0
- flywheel/models/analysis_input_legacy.py +25 -0
- flywheel/models/analysis_list_output.py +680 -0
- flywheel/models/analysis_list_output_inflated_job.py +650 -0
- flywheel/models/analysis_modify_input.py +191 -0
- flywheel/models/analysis_node.py +35 -0
- flywheel/models/analysis_output.py +683 -0
- flywheel/models/analysis_output_inflated_job.py +674 -0
- flywheel/models/analysis_parents.py +270 -0
- flywheel/models/analysis_update.py +25 -0
- flywheel/models/api_key_input_with_optional_label.py +191 -0
- flywheel/models/api_key_output.py +297 -0
- flywheel/models/as_storage.py +298 -0
- flywheel/models/assignee.py +192 -0
- flywheel/models/assignee_type.py +29 -0
- flywheel/models/audit_trail_report.py +486 -0
- flywheel/models/audit_trail_report_status.py +32 -0
- flywheel/models/auth0_auth_out.py +323 -0
- flywheel/models/auth0_options_out.py +319 -0
- flywheel/models/auth_out.py +357 -0
- flywheel/models/auth_session_output.py +272 -0
- flywheel/models/avatars.py +218 -0
- flywheel/models/aws_creds.py +191 -0
- flywheel/models/aws_storage.py +354 -0
- flywheel/models/azure_creds.py +190 -0
- flywheel/models/base_aet.py +245 -0
- flywheel/models/base_compute.py +426 -0
- flywheel/models/batch.py +360 -0
- flywheel/models/batch_cancel_output.py +36 -0
- flywheel/models/batch_create_filters.py +220 -0
- flywheel/models/batch_job_analysis_input.py +281 -0
- flywheel/models/batch_jobs_proposal_input.py +36 -0
- flywheel/models/batch_proposal.py +25 -0
- flywheel/models/batch_proposal_detail.py +36 -0
- flywheel/models/batch_proposal_input.py +25 -0
- flywheel/models/body.py +36 -0
- flywheel/models/body_regenerate_key_api_devices_device_id_key_post.py +25 -0
- flywheel/models/body_region.py +46 -0
- flywheel/models/bookmark.py +189 -0
- flywheel/models/bulk_move_input.py +272 -0
- flywheel/models/bulk_move_sessions.py +25 -0
- flywheel/models/callbacks_virus_scan_input.py +36 -0
- flywheel/models/cancelled_batch_output.py +163 -0
- flywheel/models/catalog_list_output.py +407 -0
- flywheel/models/central_out.py +299 -0
- flywheel/models/change.py +379 -0
- flywheel/models/change_log_container_type.py +38 -0
- flywheel/models/change_log_document.py +245 -0
- flywheel/models/change_method.py +33 -0
- flywheel/models/classic_batch_job_output.py +352 -0
- flywheel/models/classic_batch_job_output_inflated_jobs.py +379 -0
- flywheel/models/classic_batch_proposal_input.py +388 -0
- flywheel/models/classic_batch_proposal_output.py +471 -0
- flywheel/models/classification_add_delete.py +36 -0
- flywheel/models/classification_replace.py +36 -0
- flywheel/models/classification_update_input.py +36 -0
- flywheel/models/cohort.py +29 -0
- flywheel/models/collection.py +25 -0
- flywheel/models/collection_container_output.py +32 -0
- flywheel/models/collection_input.py +217 -0
- flywheel/models/collection_input_with_contents.py +248 -0
- flywheel/models/collection_node.py +192 -0
- flywheel/models/collection_node_level.py +31 -0
- flywheel/models/collection_operation.py +193 -0
- flywheel/models/collection_operation_type.py +29 -0
- flywheel/models/collection_output.py +639 -0
- flywheel/models/collection_with_stats.py +637 -0
- flywheel/models/column.py +286 -0
- flywheel/models/column_type.py +32 -0
- flywheel/models/common_classification.py +135 -0
- flywheel/models/common_deleted_count.py +25 -0
- flywheel/models/common_editions.py +25 -0
- flywheel/models/common_info.py +135 -0
- flywheel/models/common_join_origins.py +25 -0
- flywheel/models/common_key.py +36 -0
- flywheel/models/common_modified_count.py +25 -0
- flywheel/models/common_object_created.py +36 -0
- flywheel/models/common_project_settings.py +25 -0
- flywheel/models/common_settings.py +36 -0
- flywheel/models/complete_multipart_upload_output.py +189 -0
- flywheel/models/complete_s3_multipart_upload_input.py +241 -0
- flywheel/models/config_feature_map.py +36 -0
- flywheel/models/config_out.py +381 -0
- flywheel/models/config_output.py +36 -0
- flywheel/models/config_site_config_output.py +36 -0
- flywheel/models/config_site_settings.py +36 -0
- flywheel/models/config_site_settings_input.py +36 -0
- flywheel/models/conflict_types.py +30 -0
- flywheel/models/container_delete_reason.py +39 -0
- flywheel/models/container_filter.py +193 -0
- flywheel/models/container_id_view_input.py +521 -0
- flywheel/models/container_id_view_input_execute_and_save.py +308 -0
- flywheel/models/container_modify.py +536 -0
- flywheel/models/container_new_output.py +25 -0
- flywheel/models/container_node_min.py +350 -0
- flywheel/models/container_output.py +36 -0
- flywheel/models/container_output_with_files.py +283 -0
- flywheel/models/container_parents.py +311 -0
- flywheel/models/container_pipeline_input.py +536 -0
- flywheel/models/container_project_parents.py +25 -0
- flywheel/models/container_reference.py +193 -0
- flywheel/models/container_reference_with_label.py +219 -0
- flywheel/models/container_session_parents.py +25 -0
- flywheel/models/container_subject_parents.py +25 -0
- flywheel/models/container_type.py +39 -0
- flywheel/models/container_uidcheck.py +253 -0
- flywheel/models/container_update.py +135 -0
- flywheel/models/context_input.py +217 -0
- flywheel/models/copy_filter.py +299 -0
- flywheel/models/copy_status.py +32 -0
- flywheel/models/core_models_api_key_api_key_input.py +190 -0
- flywheel/models/core_models_audit_trail_create_report_input.py +273 -0
- flywheel/models/core_models_audit_trail_modify_report_input.py +167 -0
- flywheel/models/core_models_common_source.py +189 -0
- flywheel/models/core_models_jobs_api_key_input.py +191 -0
- flywheel/models/core_models_search_parent_type.py +33 -0
- flywheel/models/core_workflows_form_responses_models_form_parents.py +163 -0
- flywheel/models/core_workflows_form_responses_models_form_response_output.py +440 -0
- flywheel/models/core_workflows_reader_models_reader_task_parents.py +295 -0
- flywheel/models/creds.py +135 -0
- flywheel/models/curator.py +221 -0
- flywheel/models/current_user_output.py +707 -0
- flywheel/models/custom_field.py +437 -0
- flywheel/models/custom_form.py +244 -0
- flywheel/models/cvat_info.py +275 -0
- flywheel/models/cvat_settings.py +272 -0
- flywheel/models/cvat_settings_input.py +272 -0
- flywheel/models/cvat_sync_state.py +30 -0
- flywheel/models/daily_report_usage.py +565 -0
- flywheel/models/data_strategy.py +29 -0
- flywheel/models/data_view.py +25 -0
- flywheel/models/data_view_analysis_file_spec.py +221 -0
- flywheel/models/data_view_analysis_filter_spec.py +221 -0
- flywheel/models/data_view_column_alias.py +337 -0
- flywheel/models/data_view_column_spec.py +286 -0
- flywheel/models/data_view_execution.py +505 -0
- flywheel/models/data_view_execution_state.py +31 -0
- flywheel/models/data_view_file_spec.py +392 -0
- flywheel/models/data_view_group_by.py +166 -0
- flywheel/models/data_view_group_by_column.py +194 -0
- flywheel/models/data_view_name_filter_spec.py +194 -0
- flywheel/models/data_view_output.py +25 -0
- flywheel/models/data_view_save_data_view_input.py +25 -0
- flywheel/models/data_view_zip_filter_spec.py +223 -0
- flywheel/models/default_flywheel_role.py +30 -0
- flywheel/models/deid_log_skip_reason.py +29 -0
- flywheel/models/delete_by_search_query.py +253 -0
- flywheel/models/deleted_file.py +514 -0
- flywheel/models/deleted_result.py +194 -0
- flywheel/models/deprecated_action.py +29 -0
- flywheel/models/destination_container_type.py +30 -0
- flywheel/models/device.py +437 -0
- flywheel/models/device_admin_update.py +194 -0
- flywheel/models/device_create.py +219 -0
- flywheel/models/device_self_update.py +272 -0
- flywheel/models/device_status.py +36 -0
- flywheel/models/device_status_entry.py +221 -0
- flywheel/models/device_storage_strategy_update.py +193 -0
- flywheel/models/dimse_project_input.py +36 -0
- flywheel/models/dimse_project_output.py +36 -0
- flywheel/models/dimse_service_input.py +36 -0
- flywheel/models/dimse_service_output.py +36 -0
- flywheel/models/download.py +249 -0
- flywheel/models/download_container_filter.py +167 -0
- flywheel/models/download_container_filter_definition.py +222 -0
- flywheel/models/download_filter.py +221 -0
- flywheel/models/download_filter_definition.py +195 -0
- flywheel/models/download_format.py +29 -0
- flywheel/models/download_input.py +25 -0
- flywheel/models/download_node.py +189 -0
- flywheel/models/download_strategy.py +31 -0
- flywheel/models/download_ticket.py +36 -0
- flywheel/models/download_ticket_stub.py +249 -0
- flywheel/models/download_ticket_with_summary.py +36 -0
- flywheel/models/e_signature.py +242 -0
- flywheel/models/edition.py +169 -0
- flywheel/models/egress_device.py +597 -0
- flywheel/models/egress_device_page.py +219 -0
- flywheel/models/egress_provider.py +408 -0
- flywheel/models/egress_provider_id.py +164 -0
- flywheel/models/exchange_storage.py +243 -0
- flywheel/models/executor_info.py +353 -0
- flywheel/models/export_templates.py +195 -0
- flywheel/models/features.py +1838 -0
- flywheel/models/field_change.py +271 -0
- flywheel/models/field_change_log_document.py +245 -0
- flywheel/models/field_type.py +37 -0
- flywheel/models/file.py +1139 -0
- flywheel/models/file_classification_delta.py +245 -0
- flywheel/models/file_container_type.py +34 -0
- flywheel/models/file_entry.py +740 -0
- flywheel/models/file_export_templates.py +272 -0
- flywheel/models/file_format.py +33 -0
- flywheel/models/file_gear_info.py +215 -0
- flywheel/models/file_group.py +29 -0
- flywheel/models/file_list_output.py +1115 -0
- flywheel/models/file_modify_input.py +191 -0
- flywheel/models/file_move_input.py +221 -0
- flywheel/models/file_node.py +1138 -0
- flywheel/models/file_node_min.py +321 -0
- flywheel/models/file_origin.py +283 -0
- flywheel/models/file_output.py +1135 -0
- flywheel/models/file_parents.py +297 -0
- flywheel/models/file_reference.py +221 -0
- flywheel/models/file_suggestion.py +241 -0
- flywheel/models/file_template_options.py +299 -0
- flywheel/models/file_upsert_input.py +612 -0
- flywheel/models/file_upsert_origin.py +36 -0
- flywheel/models/file_upsert_output.py +1154 -0
- flywheel/models/file_version.py +190 -0
- flywheel/models/file_version_copy_of.py +273 -0
- flywheel/models/file_version_output.py +325 -0
- flywheel/models/file_via.py +245 -0
- flywheel/models/file_zip_entry.py +25 -0
- flywheel/models/file_zip_info.py +25 -0
- flywheel/models/filter.py +350 -0
- flywheel/models/filter_input.py +218 -0
- flywheel/models/filter_values.py +195 -0
- flywheel/models/filter_view.py +28 -0
- flywheel/models/fixed_file_version_input.py +216 -0
- flywheel/models/fixed_input.py +299 -0
- flywheel/models/form_definition.py +163 -0
- flywheel/models/form_response_base.py +311 -0
- flywheel/models/form_response_create.py +193 -0
- flywheel/models/gcp_creds.py +397 -0
- flywheel/models/gcp_storage.py +298 -0
- flywheel/models/gear.py +619 -0
- flywheel/models/gear_category.py +32 -0
- flywheel/models/gear_config.py +138 -0
- flywheel/models/gear_context_input.py +164 -0
- flywheel/models/gear_context_lookup.py +25 -0
- flywheel/models/gear_context_lookup_item.py +36 -0
- flywheel/models/gear_context_value_output.py +272 -0
- flywheel/models/gear_context_value_output_unfound.py +164 -0
- flywheel/models/gear_custom.py +135 -0
- flywheel/models/gear_directive.py +135 -0
- flywheel/models/gear_doc.py +25 -0
- flywheel/models/gear_document.py +332 -0
- flywheel/models/gear_document_input.py +303 -0
- flywheel/models/gear_document_legacy_input.py +302 -0
- flywheel/models/gear_environment.py +135 -0
- flywheel/models/gear_exchange.py +221 -0
- flywheel/models/gear_file_input.py +192 -0
- flywheel/models/gear_id_output.py +170 -0
- flywheel/models/gear_info.py +251 -0
- flywheel/models/gear_input_item.py +231 -0
- flywheel/models/gear_inputs.py +140 -0
- flywheel/models/gear_invocation.py +138 -0
- flywheel/models/gear_key_input.py +191 -0
- flywheel/models/gear_manifest.py +624 -0
- flywheel/models/gear_mixin.py +218 -0
- flywheel/models/gear_node.py +355 -0
- flywheel/models/gear_output_configuration.py +164 -0
- flywheel/models/gear_permissions.py +191 -0
- flywheel/models/gear_permissions_input.py +163 -0
- flywheel/models/gear_permissions_type.py +29 -0
- flywheel/models/gear_return_ticket.py +25 -0
- flywheel/models/gear_rule.py +653 -0
- flywheel/models/gear_rule_condition.py +219 -0
- flywheel/models/gear_rule_condition_type.py +37 -0
- flywheel/models/gear_rule_input.py +517 -0
- flywheel/models/gear_rule_modify_input.py +492 -0
- flywheel/models/gear_rule_output.py +652 -0
- flywheel/models/gear_save_submission.py +221 -0
- flywheel/models/gear_series.py +298 -0
- flywheel/models/gear_series_update.py +163 -0
- flywheel/models/gear_suggestion_output.py +301 -0
- flywheel/models/gear_ticket.py +245 -0
- flywheel/models/gear_ticket_output.py +163 -0
- flywheel/models/google_auth_out.py +299 -0
- flywheel/models/graph_filter.py +329 -0
- flywheel/models/group.py +25 -0
- flywheel/models/group_by.py +163 -0
- flywheel/models/group_by_column.py +36 -0
- flywheel/models/group_container_output.py +33 -0
- flywheel/models/group_input.py +248 -0
- flywheel/models/group_metadata_input.py +36 -0
- flywheel/models/group_node.py +34 -0
- flywheel/models/group_output.py +471 -0
- flywheel/models/group_report.py +218 -0
- flywheel/models/group_role.py +163 -0
- flywheel/models/group_settings_output.py +249 -0
- flywheel/models/group_update.py +249 -0
- flywheel/models/header_feature.py +37 -0
- flywheel/models/hierarchy_export_templates.py +272 -0
- flywheel/models/http_validation_error.py +167 -0
- flywheel/models/info.py +218 -0
- flywheel/models/info_add_remove.py +36 -0
- flywheel/models/info_container_type.py +35 -0
- flywheel/models/info_replace.py +36 -0
- flywheel/models/info_update_input.py +36 -0
- flywheel/models/ingress_provider.py +299 -0
- flywheel/models/ingress_providers.py +272 -0
- flywheel/models/ingress_site_settings.py +305 -0
- flywheel/models/ingress_update_provider.py +218 -0
- flywheel/models/inline_response200.py +163 -0
- flywheel/models/inline_response2001.py +171 -0
- flywheel/models/inline_response2002.py +163 -0
- flywheel/models/inline_response2003.py +36 -0
- flywheel/models/inline_response2005.py +25 -0
- flywheel/models/input_filter.py +221 -0
- flywheel/models/input_job.py +521 -0
- flywheel/models/input_job_profile.py +275 -0
- flywheel/models/inserted_id.py +163 -0
- flywheel/models/job.py +841 -0
- flywheel/models/job_analysis_input.py +273 -0
- flywheel/models/job_ask.py +301 -0
- flywheel/models/job_ask_response.py +195 -0
- flywheel/models/job_ask_response_job.py +978 -0
- flywheel/models/job_ask_return.py +25 -0
- flywheel/models/job_ask_return_criteria.py +245 -0
- flywheel/models/job_ask_state.py +25 -0
- flywheel/models/job_ask_state_response.py +163 -0
- flywheel/models/job_complete.py +220 -0
- flywheel/models/job_completion_input.py +25 -0
- flywheel/models/job_completion_ticket.py +25 -0
- flywheel/models/job_config.py +135 -0
- flywheel/models/job_config_input.py +272 -0
- flywheel/models/job_config_inputs.py +25 -0
- flywheel/models/job_config_output.py +25 -0
- flywheel/models/job_container_detail.py +25 -0
- flywheel/models/job_destination.py +189 -0
- flywheel/models/job_detail.py +925 -0
- flywheel/models/job_detail_container.py +190 -0
- flywheel/models/job_detail_file_entry.py +194 -0
- flywheel/models/job_detail_group.py +190 -0
- flywheel/models/job_detail_parent_info.py +303 -0
- flywheel/models/job_executor_info.py +369 -0
- flywheel/models/job_file_input.py +247 -0
- flywheel/models/job_file_input_list_output.py +247 -0
- flywheel/models/job_file_object.py +435 -0
- flywheel/models/job_file_object_list_output.py +407 -0
- flywheel/models/job_gear_match.py +25 -0
- flywheel/models/job_inputs_array_item.py +305 -0
- flywheel/models/job_inputs_item.py +242 -0
- flywheel/models/job_inputs_object.py +138 -0
- flywheel/models/job_list_entry.py +25 -0
- flywheel/models/job_list_output.py +979 -0
- flywheel/models/job_list_output_config.py +220 -0
- flywheel/models/job_log.py +189 -0
- flywheel/models/job_log_column.py +40 -0
- flywheel/models/job_log_record.py +192 -0
- flywheel/models/job_modify.py +193 -0
- flywheel/models/job_origin.py +190 -0
- flywheel/models/job_output.py +1005 -0
- flywheel/models/job_output_config.py +247 -0
- flywheel/models/job_parents.py +297 -0
- flywheel/models/job_priority.py +31 -0
- flywheel/models/job_priority_update.py +192 -0
- flywheel/models/job_profile.py +427 -0
- flywheel/models/job_profile_input.py +25 -0
- flywheel/models/job_request.py +221 -0
- flywheel/models/job_request_item.py +246 -0
- flywheel/models/job_request_item_type.py +31 -0
- flywheel/models/job_request_target.py +270 -0
- flywheel/models/job_state.py +32 -0
- flywheel/models/job_state_counts.py +25 -0
- flywheel/models/job_stats_by_state.py +25 -0
- flywheel/models/job_ticket_output.py +165 -0
- flywheel/models/job_transition_times.py +253 -0
- flywheel/models/job_version_info.py +135 -0
- flywheel/models/jobs_by_state.py +272 -0
- flywheel/models/jobs_list.py +166 -0
- flywheel/models/join_origin_device.py +164 -0
- flywheel/models/join_origin_job.py +219 -0
- flywheel/models/join_origin_user.py +189 -0
- flywheel/models/join_origins.py +223 -0
- flywheel/models/join_type.py +28 -0
- flywheel/models/jupyterhub_workspace.py +163 -0
- flywheel/models/jupyterlab_server_modify.py +275 -0
- flywheel/models/jupyterlab_server_origin.py +25 -0
- flywheel/models/jupyterlab_server_output.py +25 -0
- flywheel/models/jupyterlab_server_response.py +415 -0
- flywheel/models/jupyterlab_server_update.py +25 -0
- flywheel/models/ldap_sync.py +36 -0
- flywheel/models/ldap_sync_config.py +163 -0
- flywheel/models/ldap_sync_input.py +36 -0
- flywheel/models/ldap_sync_status.py +250 -0
- flywheel/models/legacy_api_key_output.py +271 -0
- flywheel/models/legacy_input.py +244 -0
- flywheel/models/legacy_usage_report.py +309 -0
- flywheel/models/legacys_usage_project_entry.py +194 -0
- flywheel/models/libs_workflows_models_parent_type.py +33 -0
- flywheel/models/libs_workflows_models_task_status.py +32 -0
- flywheel/models/local_storage.py +217 -0
- flywheel/models/location.py +189 -0
- flywheel/models/locked.py +219 -0
- flywheel/models/master_subject_code_dob_input.py +279 -0
- flywheel/models/master_subject_code_input.py +281 -0
- flywheel/models/master_subject_code_output.py +166 -0
- flywheel/models/matched_acquisition_output.py +518 -0
- flywheel/models/mfa_channel.py +30 -0
- flywheel/models/mfa_settings.py +167 -0
- flywheel/models/mixins.py +794 -0
- flywheel/models/ml_set_filter.py +194 -0
- flywheel/models/ml_type.py +30 -0
- flywheel/models/modality.py +250 -0
- flywheel/models/modality_input.py +244 -0
- flywheel/models/modality_modify.py +218 -0
- flywheel/models/modality_output.py +271 -0
- flywheel/models/modified_result.py +190 -0
- flywheel/models/modify_user_input.py +466 -0
- flywheel/models/move_conflict.py +300 -0
- flywheel/models/note.py +391 -0
- flywheel/models/note_input.py +165 -0
- flywheel/models/optional_input_policy.py +30 -0
- flywheel/models/order.py +29 -0
- flywheel/models/organ_system.py +64 -0
- flywheel/models/origin.py +193 -0
- flywheel/models/origin_type.py +35 -0
- flywheel/models/orphaned_count.py +163 -0
- flywheel/models/output_user_page.py +219 -0
- flywheel/models/packfile_cleanup_output.py +166 -0
- flywheel/models/packfile_removed_output.py +189 -0
- flywheel/models/page.py +216 -0
- flywheel/models/page_generic_file_output.py +219 -0
- flywheel/models/page_generic_filter.py +219 -0
- flywheel/models/page_generic_form_response_output.py +219 -0
- flywheel/models/page_generic_protocol.py +244 -0
- flywheel/models/page_generic_reader_task_output.py +244 -0
- flywheel/models/page_generic_staffing_pool.py +244 -0
- flywheel/models/parsed_query_response.py +194 -0
- flywheel/models/permission_access_permission.py +25 -0
- flywheel/models/premade_jobs_batch_job_output.py +298 -0
- flywheel/models/premade_jobs_batch_job_output_inflated_jobs.py +299 -0
- flywheel/models/premade_jobs_batch_proposal.py +334 -0
- flywheel/models/premade_jobs_batch_proposal_detail.py +166 -0
- flywheel/models/premade_jobs_batch_proposal_input.py +166 -0
- flywheel/models/project.py +25 -0
- flywheel/models/project_acquisition_upsert_input.py +25 -0
- flywheel/models/project_acquisition_upsert_output.py +25 -0
- flywheel/models/project_aet.py +331 -0
- flywheel/models/project_aet_input.py +248 -0
- flywheel/models/project_catalog_list_output.py +25 -0
- flywheel/models/project_contact.py +194 -0
- flywheel/models/project_container_output.py +41 -0
- flywheel/models/project_copy_input.py +245 -0
- flywheel/models/project_copy_output.py +215 -0
- flywheel/models/project_counters.py +346 -0
- flywheel/models/project_hierarchy_input.py +278 -0
- flywheel/models/project_hierarchy_output.py +222 -0
- flywheel/models/project_hierarchy_upsert_input.py +25 -0
- flywheel/models/project_hierarchy_upsert_output.py +25 -0
- flywheel/models/project_input.py +384 -0
- flywheel/models/project_institution.py +194 -0
- flywheel/models/project_list_output.py +897 -0
- flywheel/models/project_locking_reason.py +32 -0
- flywheel/models/project_modify.py +413 -0
- flywheel/models/project_node.py +42 -0
- flywheel/models/project_output.py +899 -0
- flywheel/models/project_parents.py +168 -0
- flywheel/models/project_report.py +463 -0
- flywheel/models/project_report_list.py +167 -0
- flywheel/models/project_session_upsert_input.py +25 -0
- flywheel/models/project_session_upsert_output.py +25 -0
- flywheel/models/project_settings_input.py +333 -0
- flywheel/models/project_settings_output.py +333 -0
- flywheel/models/project_settings_sharing.py +327 -0
- flywheel/models/project_settings_sharing_input.py +334 -0
- flywheel/models/project_settings_workspaces.py +167 -0
- flywheel/models/project_settings_workspaces_input.py +167 -0
- flywheel/models/project_share_level.py +29 -0
- flywheel/models/project_sharing_settings_project_contact.py +25 -0
- flywheel/models/project_sharing_settings_project_counters.py +36 -0
- flywheel/models/project_sharing_settings_project_institution.py +25 -0
- flywheel/models/project_sharing_settings_project_settings_input.py +25 -0
- flywheel/models/project_sharing_settings_project_settings_output.py +25 -0
- flywheel/models/project_sharing_settings_project_settings_sharing.py +25 -0
- flywheel/models/project_sharing_settings_project_settings_sharing_input.py +25 -0
- flywheel/models/project_sharing_settings_project_stats.py +36 -0
- flywheel/models/project_stats.py +270 -0
- flywheel/models/project_subject_upsert_input.py +25 -0
- flywheel/models/project_subject_upsert_output.py +25 -0
- flywheel/models/project_template.py +195 -0
- flywheel/models/project_template_input.py +195 -0
- flywheel/models/project_template_list_input.py +166 -0
- flywheel/models/project_template_requirement.py +36 -0
- flywheel/models/project_template_session_template.py +36 -0
- flywheel/models/project_upsert_origin.py +36 -0
- flywheel/models/protocol.py +515 -0
- flywheel/models/protocol_e_signature_config.py +191 -0
- flywheel/models/protocol_input.py +354 -0
- flywheel/models/protocol_modify.py +277 -0
- flywheel/models/protocol_status.py +30 -0
- flywheel/models/provider.py +461 -0
- flywheel/models/provider_access_type.py +29 -0
- flywheel/models/provider_class.py +29 -0
- flywheel/models/provider_deletion_status.py +189 -0
- flywheel/models/provider_input.py +25 -0
- flywheel/models/provider_links.py +282 -0
- flywheel/models/provider_type.py +34 -0
- flywheel/models/providers.py +277 -0
- flywheel/models/reader_batch_create.py +463 -0
- flywheel/models/reader_task.py +725 -0
- flywheel/models/reader_task_config.py +189 -0
- flywheel/models/reader_task_create.py +543 -0
- flywheel/models/reader_task_modify.py +303 -0
- flywheel/models/reader_task_output.py +752 -0
- flywheel/models/reader_task_parent_details.py +322 -0
- flywheel/models/report_access_log_context.py +301 -0
- flywheel/models/report_access_log_context_entry.py +194 -0
- flywheel/models/report_access_log_context_file_entry.py +165 -0
- flywheel/models/report_access_log_entry.py +624 -0
- flywheel/models/report_access_log_origin.py +194 -0
- flywheel/models/report_availability_list.py +167 -0
- flywheel/models/report_daily_usage_entry.py +501 -0
- flywheel/models/report_demographics_grid.py +36 -0
- flywheel/models/report_ethnicity_grid.py +252 -0
- flywheel/models/report_gender_count.py +222 -0
- flywheel/models/report_group_report.py +217 -0
- flywheel/models/report_legacy_usage_entry.py +36 -0
- flywheel/models/report_legacy_usage_project_entry.py +36 -0
- flywheel/models/report_project.py +25 -0
- flywheel/models/report_site.py +192 -0
- flywheel/models/report_time_period.py +193 -0
- flywheel/models/report_usage.py +630 -0
- flywheel/models/report_usage_entry.py +25 -0
- flywheel/models/resolve_input.py +163 -0
- flywheel/models/resolve_output.py +194 -0
- flywheel/models/resolver_acquisition_node.py +36 -0
- flywheel/models/resolver_analysis_node.py +36 -0
- flywheel/models/resolver_file_node.py +36 -0
- flywheel/models/resolver_gear_node.py +36 -0
- flywheel/models/resolver_group_node.py +36 -0
- flywheel/models/resolver_input.py +25 -0
- flywheel/models/resolver_node.py +182 -0
- flywheel/models/resolver_output.py +25 -0
- flywheel/models/resolver_project_node.py +36 -0
- flywheel/models/resolver_session_node.py +36 -0
- flywheel/models/resolver_subject_node.py +36 -0
- flywheel/models/role_input.py +192 -0
- flywheel/models/role_output.py +273 -0
- flywheel/models/role_permission.py +194 -0
- flywheel/models/role_permission_output.py +189 -0
- flywheel/models/role_permission_update.py +163 -0
- flywheel/models/role_type.py +32 -0
- flywheel/models/role_update.py +194 -0
- flywheel/models/roles_backwards_compatible_role_assignment.py +36 -0
- flywheel/models/roles_group_role_pool_input.py +36 -0
- flywheel/models/roles_role.py +36 -0
- flywheel/models/roles_role_assignment.py +195 -0
- flywheel/models/roles_role_input.py +36 -0
- flywheel/models/rule.py +467 -0
- flywheel/models/rule_any.py +216 -0
- flywheel/models/s3_addressing_style.py +29 -0
- flywheel/models/s3_compat_storage.py +381 -0
- flywheel/models/save_search.py +298 -0
- flywheel/models/save_search_input.py +219 -0
- flywheel/models/save_search_output.py +301 -0
- flywheel/models/save_search_page.py +219 -0
- flywheel/models/save_search_parent.py +192 -0
- flywheel/models/save_search_update.py +194 -0
- flywheel/models/search_acquisition_response.py +252 -0
- flywheel/models/search_analysis_response.py +254 -0
- flywheel/models/search_collection_response.py +254 -0
- flywheel/models/search_file_response.py +312 -0
- flywheel/models/search_group_response.py +196 -0
- flywheel/models/search_parent_acquisition.py +47 -0
- flywheel/models/search_parent_analysis.py +47 -0
- flywheel/models/search_parent_collection.py +46 -0
- flywheel/models/search_parent_project.py +54 -0
- flywheel/models/search_parent_response.py +213 -0
- flywheel/models/search_parent_session.py +48 -0
- flywheel/models/search_parent_subject.py +48 -0
- flywheel/models/search_parse_error.py +252 -0
- flywheel/models/search_parse_search_query_result.py +36 -0
- flywheel/models/search_project_response.py +196 -0
- flywheel/models/search_query.py +337 -0
- flywheel/models/search_query_suggestions.py +36 -0
- flywheel/models/search_response.py +448 -0
- flywheel/models/search_return_type.py +33 -0
- flywheel/models/search_save_search.py +36 -0
- flywheel/models/search_save_search_input.py +36 -0
- flywheel/models/search_save_search_parent.py +36 -0
- flywheel/models/search_save_search_update.py +36 -0
- flywheel/models/search_session_response.py +252 -0
- flywheel/models/search_status.py +166 -0
- flywheel/models/search_structured_search_query.py +25 -0
- flywheel/models/search_subject_response.py +225 -0
- flywheel/models/search_suggestion.py +36 -0
- flywheel/models/select_item.py +190 -0
- flywheel/models/server_state.py +303 -0
- flywheel/models/service_aet.py +301 -0
- flywheel/models/service_aet_input.py +276 -0
- flywheel/models/session.py +25 -0
- flywheel/models/session_container_output.py +35 -0
- flywheel/models/session_copy_input.py +253 -0
- flywheel/models/session_embedded_subject.py +299 -0
- flywheel/models/session_input.py +431 -0
- flywheel/models/session_list_output.py +897 -0
- flywheel/models/session_metadata_input.py +36 -0
- flywheel/models/session_modify.py +464 -0
- flywheel/models/session_node.py +36 -0
- flywheel/models/session_output.py +897 -0
- flywheel/models/session_parents.py +220 -0
- flywheel/models/session_template_options.py +221 -0
- flywheel/models/session_template_recalc_output.py +165 -0
- flywheel/models/session_upsert_input.py +464 -0
- flywheel/models/session_upsert_output.py +243 -0
- flywheel/models/sharing_filter_options.py +345 -0
- flywheel/models/signed_fs_upload_output.py +189 -0
- flywheel/models/signed_url_cleanup_input.py +189 -0
- flywheel/models/signed_url_upload_input.py +190 -0
- flywheel/models/signed_url_upload_output.py +349 -0
- flywheel/models/site.py +623 -0
- flywheel/models/site_report.py +194 -0
- flywheel/models/site_settings.py +385 -0
- flywheel/models/sort.py +192 -0
- flywheel/models/stable_api_key_input.py +25 -0
- flywheel/models/staffing_pool.py +324 -0
- flywheel/models/staffing_pool_create.py +216 -0
- flywheel/models/staffing_pool_list.py +164 -0
- flywheel/models/staffing_pool_modify.py +218 -0
- flywheel/models/state.py +32 -0
- flywheel/models/static_compute.py +218 -0
- flywheel/models/status_transitions.py +245 -0
- flywheel/models/status_type.py +31 -0
- flywheel/models/status_value.py +31 -0
- flywheel/models/storage_strategy.py +30 -0
- flywheel/models/storage_strategy_config.py +194 -0
- flywheel/models/structured_query.py +165 -0
- flywheel/models/structured_query_suggestions.py +196 -0
- flywheel/models/structured_query_value_suggestion.py +247 -0
- flywheel/models/subject.py +34 -0
- flywheel/models/subject_container_output.py +36 -0
- flywheel/models/subject_copy_input.py +223 -0
- flywheel/models/subject_input.py +627 -0
- flywheel/models/subject_modify.py +684 -0
- flywheel/models/subject_node.py +37 -0
- flywheel/models/subject_output.py +1008 -0
- flywheel/models/subject_output_for_list.py +1005 -0
- flywheel/models/subject_parents.py +194 -0
- flywheel/models/subject_role_permission.py +194 -0
- flywheel/models/subject_state.py +30 -0
- flywheel/models/subject_template_options.py +191 -0
- flywheel/models/subject_upsert_input.py +573 -0
- flywheel/models/subject_upsert_output.py +216 -0
- flywheel/models/sync_user_input.py +322 -0
- flywheel/models/tag.py +165 -0
- flywheel/models/task_assign.py +194 -0
- flywheel/models/task_facet.py +29 -0
- flywheel/models/task_parent_ref.py +245 -0
- flywheel/models/task_parent_ref_input.py +219 -0
- flywheel/models/task_priority.py +31 -0
- flywheel/models/task_submission.py +189 -0
- flywheel/models/therapeutic_area.py +60 -0
- flywheel/models/transitions.py +272 -0
- flywheel/models/tree_container_request_spec.py +281 -0
- flywheel/models/tree_graph.py +142 -0
- flywheel/models/tree_graph_connection.py +244 -0
- flywheel/models/tree_graph_connections.py +142 -0
- flywheel/models/tree_graph_node.py +166 -0
- flywheel/models/tree_request.py +25 -0
- flywheel/models/tree_response_item.py +142 -0
- flywheel/models/type_str.py +31 -0
- flywheel/models/uid_check_input_acquisitions.py +244 -0
- flywheel/models/uid_check_input_sessions.py +244 -0
- flywheel/models/uid_check_output.py +191 -0
- flywheel/models/upload_complete_s3_multipart_input.py +25 -0
- flywheel/models/upload_complete_s3_multipart_output.py +25 -0
- flywheel/models/upload_signed_fs_file_upload_output.py +36 -0
- flywheel/models/upload_signed_upload_url_input.py +36 -0
- flywheel/models/upload_signed_upload_url_output.py +36 -0
- flywheel/models/upload_ticket_output.py +215 -0
- flywheel/models/upload_token_output.py +163 -0
- flywheel/models/upsert_result.py +31 -0
- flywheel/models/user.py +760 -0
- flywheel/models/user_api_key.py +220 -0
- flywheel/models/user_input.py +461 -0
- flywheel/models/user_jobs.py +219 -0
- flywheel/models/user_jobs_output.py +25 -0
- flywheel/models/user_output.py +36 -0
- flywheel/models/user_output_id.py +163 -0
- flywheel/models/user_preferences.py +135 -0
- flywheel/models/user_wechat.py +135 -0
- flywheel/models/validation_error.py +215 -0
- flywheel/models/validation_rule.py +190 -0
- flywheel/models/version.py +363 -0
- flywheel/models/version_output.py +25 -0
- flywheel/models/view_id_output.py +164 -0
- flywheel/models/view_output.py +440 -0
- flywheel/models/viewer_app.py +381 -0
- flywheel/models/viewer_app_input.py +382 -0
- flywheel/models/viewer_app_type.py +29 -0
- flywheel/models/virus_scan.py +166 -0
- flywheel/models/virus_scan_state.py +30 -0
- flywheel/models/work_in_progress_features.py +135 -0
- flywheel/models/zipfile_info.py +192 -0
- flywheel/models/zipfile_member_info.py +241 -0
- flywheel/partial_reader.py +50 -0
- flywheel/rest.py +352 -0
- flywheel/util.py +95 -0
- flywheel/view_builder.py +449 -0
- flywheel_sdk-21.2.0.dist-info/METADATA +42 -0
- flywheel_sdk-21.2.0.dist-info/RECORD +772 -0
- flywheel_sdk-21.2.0.dist-info/WHEEL +4 -0
- flywheel_sdk-21.2.0.dist-info/licenses/LICENSE.txt +18 -0
flywheel/client.py
ADDED
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import os
|
|
3
|
+
import sys
|
|
4
|
+
|
|
5
|
+
from .util import params_to_dict
|
|
6
|
+
from .flywheel import Flywheel
|
|
7
|
+
from .view_builder import ViewBuilder
|
|
8
|
+
from .rest import ApiException
|
|
9
|
+
|
|
10
|
+
def get_api_key_from_cli(path):
|
|
11
|
+
try:
|
|
12
|
+
with open(path) as fp:
|
|
13
|
+
api_key = json.load(fp).get('key')
|
|
14
|
+
except FileNotFoundError:
|
|
15
|
+
raise Exception('Must login with flywheel command-line interface')
|
|
16
|
+
return api_key
|
|
17
|
+
|
|
18
|
+
class Client(object):
|
|
19
|
+
def __init__(self, api_key=None, **kwargs):
|
|
20
|
+
"""Initialize Flywheel Client
|
|
21
|
+
|
|
22
|
+
Note: If you are initializing the client with a drone or device key,
|
|
23
|
+
you will need to set disable_auth_check to True
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
api_key: API key to Flywheel
|
|
27
|
+
kwargs: Other keyword arguments
|
|
28
|
+
disable_auth_check (bool): Disable authentication check.
|
|
29
|
+
Default False.
|
|
30
|
+
|
|
31
|
+
Returns:
|
|
32
|
+
Initialized Flywheel Client
|
|
33
|
+
|
|
34
|
+
Raises:
|
|
35
|
+
flywheel.rest.ApiException: If disable_auth_check is False and
|
|
36
|
+
authentication fails.
|
|
37
|
+
"""
|
|
38
|
+
if not api_key:
|
|
39
|
+
api_key = get_api_key_from_cli(os.path.expanduser('~/.config/flywheel/user.json'))
|
|
40
|
+
disable_auth_check = kwargs.pop('disable_auth_check', False)
|
|
41
|
+
|
|
42
|
+
self._fw = Flywheel(api_key, minimum_supported_major_version=11,
|
|
43
|
+
**kwargs)
|
|
44
|
+
|
|
45
|
+
if not disable_auth_check:
|
|
46
|
+
self._fw.get_auth_status()
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def shutdown(self):
|
|
50
|
+
"""Release any outstanding resources"""
|
|
51
|
+
self._fw.shutdown()
|
|
52
|
+
|
|
53
|
+
def add_user(self, *args, **kwargs): # noqa: E501
|
|
54
|
+
"""Add a new user"""
|
|
55
|
+
body = params_to_dict('add_user', args, kwargs)
|
|
56
|
+
return self._fw.add_user(body)
|
|
57
|
+
|
|
58
|
+
def add_group(self, *args, **kwargs):
|
|
59
|
+
"""Add a group"""
|
|
60
|
+
body = params_to_dict('add_group', args, kwargs)
|
|
61
|
+
return self._fw.add_group(body)
|
|
62
|
+
|
|
63
|
+
def add_collection(self, *args, **kwargs):
|
|
64
|
+
"""Create a collection"""
|
|
65
|
+
body = params_to_dict('add_collection', args, kwargs)
|
|
66
|
+
return self._fw.add_collection(body, **kwargs)
|
|
67
|
+
|
|
68
|
+
def add_gear(self, gear_name, body, **kwargs):
|
|
69
|
+
"""Create or update a gear.
|
|
70
|
+
|
|
71
|
+
If no existing gear is found, one will be created Otherwise, the specified gear will be updated
|
|
72
|
+
|
|
73
|
+
:param str gear_name: Name of the gear to interact with (required)
|
|
74
|
+
:param GearDocumentLegacyInput body: (required)
|
|
75
|
+
:param bool async_: Perform the request asynchronously
|
|
76
|
+
:return: GearDocument
|
|
77
|
+
"""
|
|
78
|
+
return self._fw.add_gear(gear_name, body, **kwargs)
|
|
79
|
+
|
|
80
|
+
def add_job(self, body, **kwargs):
|
|
81
|
+
"""Add a job
|
|
82
|
+
|
|
83
|
+
:param Job body: (required)
|
|
84
|
+
:return: CommonObjectCreated
|
|
85
|
+
"""
|
|
86
|
+
return self._fw.add_job(body, **kwargs)
|
|
87
|
+
|
|
88
|
+
def get_config(self, **kwargs):
|
|
89
|
+
"""Return public Scitran configuration information
|
|
90
|
+
|
|
91
|
+
:return: ConfigOut
|
|
92
|
+
"""
|
|
93
|
+
return self._fw.get_config(**kwargs)
|
|
94
|
+
|
|
95
|
+
def get_gear(self, gear_id, **kwargs):
|
|
96
|
+
"""Return a gear referenced by gear_id
|
|
97
|
+
|
|
98
|
+
:param str gear_id: (required) The id of the gear to lookup
|
|
99
|
+
:return: Gear
|
|
100
|
+
"""
|
|
101
|
+
return self._fw.get_gear(gear_id, **kwargs)
|
|
102
|
+
|
|
103
|
+
def get_version(self, **kwargs):
|
|
104
|
+
"""Get server and database schema version info
|
|
105
|
+
|
|
106
|
+
:return: VersionOutput
|
|
107
|
+
"""
|
|
108
|
+
return self._fw.get_version(**kwargs)
|
|
109
|
+
|
|
110
|
+
def get_current_user(self, **kwargs):
|
|
111
|
+
"""Get current logged-in user
|
|
112
|
+
|
|
113
|
+
:return: User
|
|
114
|
+
"""
|
|
115
|
+
return self._fw.get_current_user(**kwargs)
|
|
116
|
+
|
|
117
|
+
def get_modality(self, modality_id, **kwargs):
|
|
118
|
+
"""Get a modality's classification specification
|
|
119
|
+
|
|
120
|
+
:param str modality_id: (required)
|
|
121
|
+
:return: Modality
|
|
122
|
+
"""
|
|
123
|
+
return self._fw.get_modality(modality_id, **kwargs)
|
|
124
|
+
|
|
125
|
+
def get(self, id, **kwargs):
|
|
126
|
+
"""Retrieve the specified object by id.
|
|
127
|
+
|
|
128
|
+
Objects that can be retrieved in this way are:
|
|
129
|
+
group, project, session, subject, acquisition, analysis and collection
|
|
130
|
+
|
|
131
|
+
:param str id: The id of the object to retrieve
|
|
132
|
+
:return: ContainerOutput
|
|
133
|
+
"""
|
|
134
|
+
return self._fw.get(id, **kwargs)
|
|
135
|
+
|
|
136
|
+
def resolve(self, path):
|
|
137
|
+
"""Perform a path based lookup of nodes in the Flywheel hierarchy.
|
|
138
|
+
|
|
139
|
+
:param str path: (required) The path to resolve
|
|
140
|
+
:return: ResolverOutput
|
|
141
|
+
"""
|
|
142
|
+
return self._fw.resolve(path)
|
|
143
|
+
|
|
144
|
+
def lookup(self, path):
|
|
145
|
+
"""Perform a path based lookup of a single node in the Flywheel hierarchy.
|
|
146
|
+
|
|
147
|
+
:param str path: (required) The path to resolve
|
|
148
|
+
:return: ResolverOutput
|
|
149
|
+
"""
|
|
150
|
+
return self._fw.lookup(path)
|
|
151
|
+
|
|
152
|
+
def file_url(self, path):
|
|
153
|
+
"""Perform a path based lookup of a file in the Flywheel hierarchy, and return a single-use download URL.
|
|
154
|
+
|
|
155
|
+
:param str path: (required) The path to resolve
|
|
156
|
+
:return: The file URL if found, otherwise raises an error
|
|
157
|
+
"""
|
|
158
|
+
return self._fw.file_url(path)
|
|
159
|
+
|
|
160
|
+
def download_tar(self, containers, dest_file, include_types=None, exclude_types=None):
|
|
161
|
+
"""Download the given set of containers as a tarball to dest_file.
|
|
162
|
+
|
|
163
|
+
Supports downloading Projects, Sessions, Acquisitions and/or Analyses.
|
|
164
|
+
|
|
165
|
+
:param containers: (required) The container, or list of containers to download.
|
|
166
|
+
:param str dest_file: (required) The destination file on disk
|
|
167
|
+
:param list include_types: The optional list of types to include in the download (e.g. ['nifti'])
|
|
168
|
+
:param list exclude_types: The optional list of types to exclude from the download (e.g. ['dicom'])
|
|
169
|
+
:return: A summary of the download
|
|
170
|
+
"""
|
|
171
|
+
return self._fw.download_tar(containers, dest_file, include_types=include_types, exclude_types=exclude_types)
|
|
172
|
+
|
|
173
|
+
def download_zip(self, containers, dest_file, include_types=None, exclude_types=None):
|
|
174
|
+
"""Download the given set of containers as a zip archive to dest_file.
|
|
175
|
+
|
|
176
|
+
Supports downloading Projects, Sessions, Acquisitions and/or Analyses.
|
|
177
|
+
|
|
178
|
+
:param containers: (required) The container, or list of containers to download.
|
|
179
|
+
:param str dest_file: (required) The destination file on disk
|
|
180
|
+
:param list include_types: The optional list of types to include in the download (e.g. ['nifti'])
|
|
181
|
+
:param list exclude_types: The optional list of types to exclude from the download (e.g. ['dicom'])
|
|
182
|
+
:return: A summary of the download
|
|
183
|
+
"""
|
|
184
|
+
return self._fw.download_zip(containers, dest_file, include_types=include_types, exclude_types=exclude_types)
|
|
185
|
+
|
|
186
|
+
@property
|
|
187
|
+
def users(self):
|
|
188
|
+
"""Returns the users finder object"""
|
|
189
|
+
return self._fw.users
|
|
190
|
+
|
|
191
|
+
@property
|
|
192
|
+
def groups(self):
|
|
193
|
+
"""Returns the groups finder object"""
|
|
194
|
+
return self._fw.groups
|
|
195
|
+
|
|
196
|
+
@property
|
|
197
|
+
def projects(self):
|
|
198
|
+
"""Returns the projects finder object"""
|
|
199
|
+
return self._fw.projects
|
|
200
|
+
|
|
201
|
+
@property
|
|
202
|
+
def subjects(self):
|
|
203
|
+
"""Returns the subjects finder object"""
|
|
204
|
+
return self._fw.subjects
|
|
205
|
+
|
|
206
|
+
@property
|
|
207
|
+
def sessions(self):
|
|
208
|
+
"""Returns the sessions finder object"""
|
|
209
|
+
return self._fw.sessions
|
|
210
|
+
|
|
211
|
+
@property
|
|
212
|
+
def acquisitions(self):
|
|
213
|
+
"""Returns the acquisitions finder object"""
|
|
214
|
+
return self._fw.acquisitions
|
|
215
|
+
|
|
216
|
+
@property
|
|
217
|
+
def jobs(self):
|
|
218
|
+
"""Returns the jobs finder object"""
|
|
219
|
+
return self._fw.jobs
|
|
220
|
+
|
|
221
|
+
@property
|
|
222
|
+
def gears(self):
|
|
223
|
+
"""Returns the gears finder object"""
|
|
224
|
+
return self._fw.gears
|
|
225
|
+
|
|
226
|
+
@property
|
|
227
|
+
def collections(self):
|
|
228
|
+
"""Returns the collections finder object"""
|
|
229
|
+
return self._fw.collections
|
|
230
|
+
|
|
231
|
+
@property
|
|
232
|
+
def data_view_executions(self):
|
|
233
|
+
"""Returns the data_view_executions finder object"""
|
|
234
|
+
return self._fw.data_view_executions
|
|
235
|
+
|
|
236
|
+
def View(self, **kwargs):
|
|
237
|
+
"""Short-hand for ``flywheel.ViewBuilder(**kwargs).build()``
|
|
238
|
+
|
|
239
|
+
:param kwargs: The arguments to pass directly to ViewBuilder
|
|
240
|
+
:return: The built data view
|
|
241
|
+
"""
|
|
242
|
+
return ViewBuilder(**kwargs).build()
|
|
243
|
+
|
|
244
|
+
def print_view_columns(self, file=sys.stdout):
|
|
245
|
+
"""Print a list of column aliases that can be used in data views.
|
|
246
|
+
|
|
247
|
+
:param file-like file: The file to print to
|
|
248
|
+
"""
|
|
249
|
+
return self._fw.print_view_columns(file=file)
|
|
250
|
+
|
|
251
|
+
def read_view_data(self, view, container_id, decode=True, **kwargs):
|
|
252
|
+
"""Execute a data view against container, and return a file-like object that can be streamed.
|
|
253
|
+
|
|
254
|
+
:param view: The view id or DataView object to execute.
|
|
255
|
+
:type view: str or DataView
|
|
256
|
+
:param str container_id: The id of the container to execute the view against
|
|
257
|
+
:param bool decode: Whether or not to decode the stream to utf-8 (default is true)
|
|
258
|
+
:param kwargs: Additional arguments to pass to the evaluate_view call. (e.g. format='csv')
|
|
259
|
+
:return: A file-like object where the contents can be read
|
|
260
|
+
"""
|
|
261
|
+
return self._fw.read_view_data(view, container_id, decode=decode, **kwargs)
|
|
262
|
+
|
|
263
|
+
def read_view_dataframe(self, view, container_id, opts=None, **kwargs):
|
|
264
|
+
"""Execute a data view against container, and return a DataFrame.
|
|
265
|
+
|
|
266
|
+
NOTE: This requires that the pandas module be installed on the system.
|
|
267
|
+
|
|
268
|
+
:param view: The view id or DataView object to execute.
|
|
269
|
+
:type view: str or DataView
|
|
270
|
+
:param str container_id: The id of the container to execute the view against
|
|
271
|
+
:param object opts: Additional options to pass to the pandas read_json function
|
|
272
|
+
:param kwargs: Additional arguments to pass to the evaluate_view call.
|
|
273
|
+
:return: A pandas DataFrame
|
|
274
|
+
"""
|
|
275
|
+
return self._fw.read_view_dataframe(view, container_id, opts=opts, **kwargs)
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
def save_view_data(self, view, container_id, dest_file, **kwargs):
|
|
279
|
+
"""Execute a data view against container, and save the results to disk.
|
|
280
|
+
|
|
281
|
+
:param view: The view id or DataView object to execute.
|
|
282
|
+
:type view: str or DataView
|
|
283
|
+
:param str container_id: The id of the container to execute the view against
|
|
284
|
+
:param str dest_file: The destination file path
|
|
285
|
+
:param kwargs: Additional arguments to pass to the evaluate_view call. (e.g. format='csv')
|
|
286
|
+
"""
|
|
287
|
+
return self._fw.save_view_data(view, container_id, dest_file, **kwargs)
|
|
288
|
+
|
|
289
|
+
def __getattr__(self, name):
|
|
290
|
+
# By default return flywheel attributes, but don't auto-complete them
|
|
291
|
+
return getattr(self._fw, name)
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Flywheel
|
|
5
|
+
|
|
6
|
+
No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) # noqa: E501
|
|
7
|
+
|
|
8
|
+
OpenAPI spec version: 0.0.1
|
|
9
|
+
|
|
10
|
+
Generated by: https://github.com/swagger-api/swagger-codegen.git
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
from __future__ import absolute_import
|
|
15
|
+
|
|
16
|
+
import copy
|
|
17
|
+
import logging
|
|
18
|
+
import multiprocessing
|
|
19
|
+
import sys
|
|
20
|
+
import urllib3
|
|
21
|
+
|
|
22
|
+
import six
|
|
23
|
+
from six.moves import http_client as httplib
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class TypeWithDefault(type):
|
|
27
|
+
def __init__(cls, name, bases, dct):
|
|
28
|
+
super(TypeWithDefault, cls).__init__(name, bases, dct)
|
|
29
|
+
cls._default = None
|
|
30
|
+
|
|
31
|
+
def __call__(cls):
|
|
32
|
+
if cls._default is None:
|
|
33
|
+
cls._default = type.__call__(cls)
|
|
34
|
+
return copy.copy(cls._default)
|
|
35
|
+
|
|
36
|
+
def set_default(cls, default):
|
|
37
|
+
cls._default = copy.copy(default)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class Configuration(six.with_metaclass(TypeWithDefault, object)):
|
|
41
|
+
"""NOTE: This class is auto generated by the swagger code generator program.
|
|
42
|
+
|
|
43
|
+
Ref: https://github.com/swagger-api/swagger-codegen
|
|
44
|
+
Do not edit the class manually.
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
def __init__(self):
|
|
48
|
+
"""Constructor"""
|
|
49
|
+
# Property defaults
|
|
50
|
+
self.__debug = False
|
|
51
|
+
self.__logger_file = None
|
|
52
|
+
self.__logger_format = None
|
|
53
|
+
self.logger_formatter = None
|
|
54
|
+
self.__logging_filters = list()
|
|
55
|
+
|
|
56
|
+
# Default Base url
|
|
57
|
+
self.host = "https://dev.flywheel.io/api"
|
|
58
|
+
# Temp file folder for downloading files
|
|
59
|
+
self.temp_folder_path = None
|
|
60
|
+
|
|
61
|
+
# Authentication Settings
|
|
62
|
+
# dict to store API key(s)
|
|
63
|
+
self.api_key = {}
|
|
64
|
+
# dict to store API prefix (e.g. Bearer)
|
|
65
|
+
self.api_key_prefix = {}
|
|
66
|
+
# Username for HTTP basic authentication
|
|
67
|
+
self.username = ""
|
|
68
|
+
# Password for HTTP basic authentication
|
|
69
|
+
self.password = ""
|
|
70
|
+
# Logging Settings
|
|
71
|
+
self.logger = {}
|
|
72
|
+
self.logger["package_logger"] = logging.getLogger("flywheel")
|
|
73
|
+
self.logger["urllib3_logger"] = logging.getLogger("urllib3")
|
|
74
|
+
self.logger["http_client_logger"] = logging.getLogger("http.client")
|
|
75
|
+
# Log format
|
|
76
|
+
self.logger_format = '%(asctime)s %(levelname)s %(message)s'
|
|
77
|
+
# Log stream handler
|
|
78
|
+
self.logger_stream_handler = None
|
|
79
|
+
# Log file handler
|
|
80
|
+
self.logger_file_handler = None
|
|
81
|
+
# Debug file location
|
|
82
|
+
self.logger_file = None
|
|
83
|
+
# Debug switch
|
|
84
|
+
self.debug = False
|
|
85
|
+
|
|
86
|
+
# SSL/TLS verification
|
|
87
|
+
# Set this to false to skip verifying SSL certificate when calling API
|
|
88
|
+
# from https server.
|
|
89
|
+
self.verify_ssl = True
|
|
90
|
+
# Set this to customize the certificate file to verify the peer.
|
|
91
|
+
self.ssl_ca_cert = None
|
|
92
|
+
# client certificate file
|
|
93
|
+
self.cert_file = None
|
|
94
|
+
# client key file
|
|
95
|
+
self.key_file = None
|
|
96
|
+
# Set this to True/False to enable/disable SSL hostname verification.
|
|
97
|
+
self.assert_hostname = None
|
|
98
|
+
|
|
99
|
+
# urllib3 connection pool's maximum number of connections saved
|
|
100
|
+
# per pool. urllib3 uses 1 connection as default value, but this is
|
|
101
|
+
# not the best value when you are making a lot of possibly parallel
|
|
102
|
+
# requests to the same host, which is often the case here.
|
|
103
|
+
# cpu_count * 5 is used as default value to increase performance.
|
|
104
|
+
self.connection_pool_maxsize = multiprocessing.cpu_count() * 5
|
|
105
|
+
|
|
106
|
+
# Proxy URL
|
|
107
|
+
self.proxy = None
|
|
108
|
+
# Safe chars for path_param
|
|
109
|
+
self.safe_chars_for_path_param = ''
|
|
110
|
+
|
|
111
|
+
@property
|
|
112
|
+
def logger_file(self):
|
|
113
|
+
"""The logger file.
|
|
114
|
+
|
|
115
|
+
If the logger_file is None, then add stream handler and remove file
|
|
116
|
+
handler. Otherwise, add file handler and remove stream handler.
|
|
117
|
+
|
|
118
|
+
:param value: The logger_file path.
|
|
119
|
+
:type: str
|
|
120
|
+
"""
|
|
121
|
+
return self.__logger_file
|
|
122
|
+
|
|
123
|
+
@logger_file.setter
|
|
124
|
+
def logger_file(self, value):
|
|
125
|
+
"""The logger file.
|
|
126
|
+
|
|
127
|
+
If the logger_file is None, then add stream handler and remove file
|
|
128
|
+
handler. Otherwise, add file handler and remove stream handler.
|
|
129
|
+
|
|
130
|
+
:param value: The logger_file path.
|
|
131
|
+
:type: str
|
|
132
|
+
"""
|
|
133
|
+
self.__logger_file = value
|
|
134
|
+
if self.__logger_file:
|
|
135
|
+
# If set logging file,
|
|
136
|
+
# then add file handler and remove stream handler.
|
|
137
|
+
self.logger_file_handler = logging.FileHandler(self.__logger_file)
|
|
138
|
+
self.logger_file_handler.setFormatter(self.logger_formatter)
|
|
139
|
+
for _, logger in six.iteritems(self.logger):
|
|
140
|
+
logger.addHandler(self.logger_file_handler)
|
|
141
|
+
if self.logger_stream_handler:
|
|
142
|
+
logger.removeHandler(self.logger_stream_handler)
|
|
143
|
+
else:
|
|
144
|
+
# If not set logging file,
|
|
145
|
+
# then add stream handler and remove file handler.
|
|
146
|
+
self.logger_stream_handler = logging.StreamHandler()
|
|
147
|
+
self.logger_stream_handler.setFormatter(self.logger_formatter)
|
|
148
|
+
for _, logger in six.iteritems(self.logger):
|
|
149
|
+
logger.addHandler(self.logger_stream_handler)
|
|
150
|
+
if self.logger_file_handler:
|
|
151
|
+
logger.removeHandler(self.logger_file_handler)
|
|
152
|
+
|
|
153
|
+
@property
|
|
154
|
+
def debug(self):
|
|
155
|
+
"""Debug status
|
|
156
|
+
|
|
157
|
+
:param value: The debug status, True or False.
|
|
158
|
+
:type: bool
|
|
159
|
+
"""
|
|
160
|
+
return self.__debug
|
|
161
|
+
|
|
162
|
+
@debug.setter
|
|
163
|
+
def debug(self, value):
|
|
164
|
+
"""Debug status
|
|
165
|
+
|
|
166
|
+
:param value: The debug status, True or False.
|
|
167
|
+
:type: bool
|
|
168
|
+
"""
|
|
169
|
+
self.__debug = value
|
|
170
|
+
if self.__debug:
|
|
171
|
+
# if debug status is True, turn on debug logging
|
|
172
|
+
for _, logger in six.iteritems(self.logger):
|
|
173
|
+
logger.setLevel(logging.DEBUG)
|
|
174
|
+
# turn on httplib debug
|
|
175
|
+
httplib.HTTPConnection.debuglevel = 1
|
|
176
|
+
httpclient_logger = self.logger["http_client_logger"]
|
|
177
|
+
httplib.print = lambda *args: httpclient_logger.log(
|
|
178
|
+
logging.DEBUG, " ".join(map(str, args)))
|
|
179
|
+
else:
|
|
180
|
+
# if debug status is False, turn off debug logging,
|
|
181
|
+
# setting log level to default `logging.WARNING`
|
|
182
|
+
for _, logger in six.iteritems(self.logger):
|
|
183
|
+
logger.setLevel(logging.WARNING)
|
|
184
|
+
# turn off httplib debug
|
|
185
|
+
httplib.HTTPConnection.debuglevel = 0
|
|
186
|
+
if hasattr(httplib, "print"):
|
|
187
|
+
delattr(httplib, "print")
|
|
188
|
+
|
|
189
|
+
@property
|
|
190
|
+
def logger_format(self):
|
|
191
|
+
"""The logger format.
|
|
192
|
+
|
|
193
|
+
The logger_formatter will be updated when sets logger_format.
|
|
194
|
+
|
|
195
|
+
:param value: The format string.
|
|
196
|
+
:type: str
|
|
197
|
+
"""
|
|
198
|
+
return self.__logger_format
|
|
199
|
+
|
|
200
|
+
@logger_format.setter
|
|
201
|
+
def logger_format(self, value):
|
|
202
|
+
"""The logger format.
|
|
203
|
+
|
|
204
|
+
The logger_formatter will be updated when sets logger_format.
|
|
205
|
+
|
|
206
|
+
:param value: The format string.
|
|
207
|
+
:type: str
|
|
208
|
+
"""
|
|
209
|
+
self.__logger_format = value
|
|
210
|
+
self.logger_formatter = logging.Formatter(self.__logger_format)
|
|
211
|
+
|
|
212
|
+
def get_api_key_with_prefix(self, identifier):
|
|
213
|
+
"""Gets API key (with prefix if set).
|
|
214
|
+
|
|
215
|
+
:param identifier: The identifier of apiKey.
|
|
216
|
+
:return: The token for api key authentication.
|
|
217
|
+
"""
|
|
218
|
+
if (self.api_key.get(identifier) and
|
|
219
|
+
self.api_key_prefix.get(identifier)):
|
|
220
|
+
return self.api_key_prefix[identifier] + ' ' + self.api_key[identifier] # noqa: E501
|
|
221
|
+
elif self.api_key.get(identifier):
|
|
222
|
+
return self.api_key[identifier]
|
|
223
|
+
|
|
224
|
+
def get_basic_auth_token(self):
|
|
225
|
+
"""Gets HTTP basic authentication header (string).
|
|
226
|
+
|
|
227
|
+
:return: The token for basic HTTP authentication.
|
|
228
|
+
"""
|
|
229
|
+
return urllib3.util.make_headers(
|
|
230
|
+
basic_auth=self.username + ':' + self.password
|
|
231
|
+
).get('authorization')
|
|
232
|
+
|
|
233
|
+
def auth_settings(self):
|
|
234
|
+
"""Gets Auth Settings dict for api client.
|
|
235
|
+
|
|
236
|
+
:return: The Auth Settings information dict.
|
|
237
|
+
"""
|
|
238
|
+
return {
|
|
239
|
+
'ApiKey':
|
|
240
|
+
{
|
|
241
|
+
'type': 'api_key',
|
|
242
|
+
'in': 'header',
|
|
243
|
+
'key': 'Authorization',
|
|
244
|
+
'value': self.get_api_key_with_prefix('Authorization')
|
|
245
|
+
},
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
def to_debug_report(self):
|
|
249
|
+
"""Gets the essential information for debugging.
|
|
250
|
+
|
|
251
|
+
:return: The report for debugging.
|
|
252
|
+
"""
|
|
253
|
+
return "Python SDK Debug Report:\n"\
|
|
254
|
+
"OS: {env}\n"\
|
|
255
|
+
"Python Version: {pyversion}\n"\
|
|
256
|
+
"Version of the API: 21.2.0\n"\
|
|
257
|
+
"SDK Package Version: 21.2.0".\
|
|
258
|
+
format(env=sys.platform, pyversion=sys.version)
|
|
259
|
+
|
|
260
|
+
def enable_message_cutoff(self, message_cutoff):
|
|
261
|
+
self.__logging_filters[:] = []
|
|
262
|
+
|
|
263
|
+
class SendFilter(logging.Filter):
|
|
264
|
+
def __init__(self, cutoff):
|
|
265
|
+
self.cutoff = cutoff
|
|
266
|
+
|
|
267
|
+
def filter(self, record):
|
|
268
|
+
# http.client lib doesn't use formatting strings
|
|
269
|
+
if record.msg.startswith("send: b'") and record.msg.endswith("'"):
|
|
270
|
+
data = record.msg[8:-1].encode("utf8").decode("unicode_escape")
|
|
271
|
+
data_len = len(data)
|
|
272
|
+
if data_len > self.cutoff:
|
|
273
|
+
first_part = data[:(self.cutoff//2)]
|
|
274
|
+
last_part = data[-(self.cutoff//2):]
|
|
275
|
+
shortened = f"{first_part}...[{data_len} bytes total]...{last_part}"
|
|
276
|
+
shortened_bytes = shortened.encode("utf8")
|
|
277
|
+
record.msg = f"send: {shortened_bytes!r}"
|
|
278
|
+
return True
|
|
279
|
+
|
|
280
|
+
filt = SendFilter(message_cutoff)
|
|
281
|
+
logger = logging.getLogger("http.client")
|
|
282
|
+
logger.addFilter(filt)
|
|
283
|
+
self.__logging_filters.append((logger, filt))
|
|
284
|
+
|
|
285
|
+
class ReceiveFilter(logging.Filter):
|
|
286
|
+
def __init__(self, cutoff):
|
|
287
|
+
self.cutoff = cutoff
|
|
288
|
+
|
|
289
|
+
def filter(self, record):
|
|
290
|
+
if record.msg == "response body: %s" and len(record.args) == 1:
|
|
291
|
+
body = record.args[0]
|
|
292
|
+
body_len = len(body)
|
|
293
|
+
if body_len > self.cutoff:
|
|
294
|
+
first_part = body[:(self.cutoff//2)]
|
|
295
|
+
last_part = body[-(self.cutoff//2):]
|
|
296
|
+
shortened = f"{first_part}...[{body_len} bytes total]...{last_part}"
|
|
297
|
+
record.args = (shortened,)
|
|
298
|
+
return True
|
|
299
|
+
|
|
300
|
+
filt = ReceiveFilter(message_cutoff)
|
|
301
|
+
logger = logging.getLogger("flywheel.rest")
|
|
302
|
+
logger.addFilter(filt)
|
|
303
|
+
self.__logging_filters.append((logger, filt))
|
|
304
|
+
|
|
305
|
+
def disable_message_cutoff(self):
|
|
306
|
+
for logger, filt in self.__logging_filters:
|
|
307
|
+
logger.removeFilter(filt)
|
|
308
|
+
self.__logging_filters[:] = []
|
flywheel/drone_login.py
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"""Provides Drone-based login credentials"""
|
|
2
|
+
|
|
3
|
+
import requests
|
|
4
|
+
|
|
5
|
+
from . import util
|
|
6
|
+
from .client import Client
|
|
7
|
+
from .rest import ApiException
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def create_drone_client(host, secret, method, name, port=443, **kwargs):
|
|
11
|
+
"""Create a Client instance using drone credentials.
|
|
12
|
+
|
|
13
|
+
:param str host: The hostname of the flywheel instance
|
|
14
|
+
:param str secret: The drone secret
|
|
15
|
+
:param str method: The method (device type)
|
|
16
|
+
:param str name: The name of the device
|
|
17
|
+
:param int port: The optional port (if not 443)
|
|
18
|
+
:param kwargs: Additional arguments to pass to the created Client instance
|
|
19
|
+
:return: The authorized Client instance
|
|
20
|
+
:rtype: flywheel.Client
|
|
21
|
+
"""
|
|
22
|
+
with requests.Session() as session:
|
|
23
|
+
util.set_verify_ssl(session)
|
|
24
|
+
|
|
25
|
+
# Get auth status to determine device id
|
|
26
|
+
force_insecure = kwargs.pop("_force_insecure", False) is True
|
|
27
|
+
if force_insecure:
|
|
28
|
+
base_uri = "http://{}:{}/api".format(host, port)
|
|
29
|
+
else:
|
|
30
|
+
base_uri = "https://{}:{}/api".format(host, port)
|
|
31
|
+
|
|
32
|
+
session.headers.update(
|
|
33
|
+
{
|
|
34
|
+
"X-SciTran-Auth": secret,
|
|
35
|
+
"X-SciTran-Method": method,
|
|
36
|
+
"X-SciTran-Name": name,
|
|
37
|
+
}
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
# Get the status
|
|
41
|
+
resp = session.get(base_uri + "/auth/status")
|
|
42
|
+
if not resp.ok:
|
|
43
|
+
raise ApiException(http_resp=resp)
|
|
44
|
+
|
|
45
|
+
status = resp.json()
|
|
46
|
+
if not status["is_device"] or not status.get("origin", {}).get("id"):
|
|
47
|
+
raise RuntimeError("Provided login is not a device login")
|
|
48
|
+
|
|
49
|
+
# Get the device, with API key
|
|
50
|
+
device_id = status["origin"]["id"]
|
|
51
|
+
resp = session.get(base_uri + "/devices/" + device_id)
|
|
52
|
+
if not resp.ok:
|
|
53
|
+
raise ApiException(http_resp=resp)
|
|
54
|
+
|
|
55
|
+
device = resp.json()
|
|
56
|
+
if "key" not in device:
|
|
57
|
+
raise RuntimeError("Got device, but could not get key!")
|
|
58
|
+
|
|
59
|
+
# NOTE: _force_insecure is not recommended nor supported for general consumption
|
|
60
|
+
if force_insecure:
|
|
61
|
+
api_key = "{}:{}:__force_insecure:{}".format(host, port, device["key"])
|
|
62
|
+
else:
|
|
63
|
+
api_key = "{}:{}:{}".format(host, port, device["key"])
|
|
64
|
+
|
|
65
|
+
return Client(api_key, **kwargs)
|